Mercurial > hg > Members > yutaka > manager
view spe/SpeSentry.cc @ 2:1e1b0d280427
commit
author | yutaka@localhost.localdomain |
---|---|
date | Wed, 07 Apr 2010 05:18:52 +0900 |
parents | dcd83cefb980 |
children | 8b4d6bf8c43d |
line wrap: on
line source
#include <stdio.h> #include <malloc.h> #include <spu_intrinsics.h> #include <spu_mfcio.h> #include "SpeSentry.h" #include "MailCommand.h" #include "Dma.h" #include "Run.h" void* fix_type(task_t *task, void* buff) { char *p; p = (char*)buff; p = p + sizeof(task_head_t); task->head = (task_head_t*)buff; task->input = p; } void* allocate(int size) { int alignment = 16; return memalign(alignment, size); } task_t task_allocate(int size) { if (size % 16) { //printf("allocate size is not multiple of 16\n"); } char *buff; task_t task; void *head; head = memalign(16, size); buff = (char*)head; buff = buff + sizeof(task_head_t); task.head = (task_head_t*)head; task.input = buff; return task; } int main(unsigned long long spe, unsigned long long argp, unsigned long long envp) { uint32_t data; int buff_num = 2; unsigned int dma_wait_time = 0; int in_tag[buff_num]; int out_tag[buff_num]; in_tag[0] = 0; in_tag[1] = 1; out_tag[0] = 2; out_tag[1] = 3; int head_tag = 4; task_head_t *head = (task_head_t*)allocate(sizeof(task_head_t)); task_t *send_params = (task_t*)allocate(sizeof(task_t)); void *input_buff[buff_num]; void *output_buff[buff_num]; int cur; spu_write_out_mbox(WANT_DATA); while(1) { //mail check start if(spu_stat_in_mbox()) { data = spu_read_in_mbox(); if (data == SPE_RUN_END) { break; } else { //printf("[SPE] data %p\n",data); dma_get(head, data, sizeof(task_head_t), head_tag); dma_wait_time += dma_wait(head_tag); input_buff[0] = allocate(head->next_task_size); dma_get(input_buff[0], head->next_task, head->next_task_size, in_tag[0]); dma_wait_time += dma_wait(in_tag[0]); fix_type(send_params,input_buff[0]); cur = 0; while(1) { input_buff[cur^1] = allocate(send_params->head->next_task_size); dma_get(input_buff[cur^1], send_params->head->next_task, send_params->head->next_task_size, in_tag[cur^1]); void *in = send_params->input; //printf("hoge"); output_buff[cur] = allocate(send_params->head->size_out); int data_length = send_params->head->size_out; //task******************************************** run(in,output_buff[cur],data_length); //end********************************************* dma_put(output_buff[cur], send_params->head->ea_out, send_params->head->size_out, out_tag[cur]); free(input_buff[cur]); dma_wait_time += dma_wait(in_tag[cur^1]); dma_wait_time += dma_wait(out_tag[cur^1]); //printf("hoge"); free(output_buff[cur^1]); cur ^= 1; fix_type(send_params,input_buff[cur]); if ((unsigned long)send_params->head->next_task == 0) { break; } }//while void *in = send_params->input; //printf("hoge"); output_buff[cur] = allocate(send_params->head->size_out); int data_length = send_params->head->size_out; //task******************************************** run(in,output_buff[cur],data_length); //end********************************************* dma_put(output_buff[cur], send_params->head->ea_out, send_params->head->size_out, out_tag[cur]); free(input_buff[cur]); dma_wait_time += dma_wait(out_tag[cur] | out_tag[cur^1] ); free(output_buff[cur]); free(output_buff[cur^1]); spu_write_out_mbox(WANT_DATA); //printf("[SPE] send mail\n"); }//if }//if //mail check end }//while printf("dma_wait_time %d\n",dma_wait_time); return 0; } /*end*/