# HG changeset patch # User Shinji KONO # Date 1260760612 -32400 # Node ID d3afc8777daa9f594235ee22669362d397bfaca7 # Parent 7e937a1cd121c8d2c92c03fe265ddfda05d47036 fix fix ... diff -r 7e937a1cd121 -r d3afc8777daa TaskManager/kernel/ppe/HTask.cc --- a/TaskManager/kernel/ppe/HTask.cc Sun Dec 13 22:46:15 2009 +0900 +++ b/TaskManager/kernel/ppe/HTask.cc Mon Dec 14 12:16:52 2009 +0900 @@ -52,25 +52,39 @@ #ifdef SIMPLE_TASK Task * -HTask::create_task_array(int task_id, int pos) +HTask::create_task_array(int id, int num_task, int num_param, int num_inData, int num_outData) { - Task *task = (Task*)((memaddr)rbuf + pos); - task->set_task_id(task_id); - task-> param_count = 0; - task-> inData_count = 0; - task-> outData_count = 0; - task-> inData_offset = 0; - task-> outData_offset = 0; + r_size = Task::calc_size(num_param, num_inData, num_outData)*num_task; + rbuf = (memaddr) mimpl->allocate(r_size); + Task *task = (Task*)rbuf; + task->init(id, num_param,num_inData,num_outData); +// task->print(); + return task; // first task +} - return task; +Task * +HTask::next_task_array(int id, Task *t) +{ + Task *first = (Task*)rbuf; + if (t==0) { +// first->print(); + return first; + } + + Task *next = t->next(); + next->init(id, first->param_count, first->inData_count, first->outData_count); + if ((memaddr)next - (memaddr)rbuf > r_size) + printf("too many task array used.\n"); + return next; } void -HTask::spawn_task_array(int pos) +HTask::spawn_task_array(Task * last) { - if (pos!= r_size) { - printf("spawn task array size differ pos 0x%x r_size 0x%x\n", - pos, r_size); + int size = (memaddr)last - rbuf; + if (size!= r_size) { + printf("spawn task array size differ size 0x%x r_size 0x%x\n", + size, r_size); } } diff -r 7e937a1cd121 -r d3afc8777daa TaskManager/kernel/ppe/HTask.h --- a/TaskManager/kernel/ppe/HTask.h Sun Dec 13 22:46:15 2009 +0900 +++ b/TaskManager/kernel/ppe/HTask.h Mon Dec 14 12:16:52 2009 +0900 @@ -49,8 +49,9 @@ void set_cpu(CPU_TYPE type); void set_post(PostFunction func, void *read, void *write); #ifdef SIMPLE_TASK - Task *create_task_array(int task_id, int pos); - void spawn_task_array(int pos); + Task *create_task_array(int task_id, int num_task, int num_param, int num_inData, int num_outData); + Task *next_task_array(int task_id, Task *t); + void spawn_task_array(Task *t); #endif }; diff -r 7e937a1cd121 -r d3afc8777daa TaskManager/kernel/ppe/Task.cc --- a/TaskManager/kernel/ppe/Task.cc Sun Dec 13 22:46:15 2009 +0900 +++ b/TaskManager/kernel/ppe/Task.cc Mon Dec 14 12:16:52 2009 +0900 @@ -85,30 +85,6 @@ #else /* ifdef SIMPLE_TASK */ -void -Task::set_inData_t( int index, memaddr addr, int size) -{ - ListElementPtr elm = (ListElementPtr) inData(index); -#ifdef __CERIUM_CELL__ - elm->addr = (uint32)(unsigned long)addr; -#else - elm->addr = addr; -#endif - elm->size = size; -} - -void -Task::set_outData_t(int index, memaddr addr, int size) -{ - ListElementPtr elm = (ListElementPtr) outData(index); -#ifdef __CERIUM_CELL__ - elm->addr = (uint32)(unsigned long)addr; -#else - elm->addr = addr; -#endif - elm->size = size; -} - void Task::print() { diff -r 7e937a1cd121 -r d3afc8777daa TaskManager/kernel/ppe/Task.h --- a/TaskManager/kernel/ppe/Task.h Sun Dec 13 22:46:15 2009 +0900 +++ b/TaskManager/kernel/ppe/Task.h Mon Dec 14 12:16:52 2009 +0900 @@ -48,100 +48,26 @@ int inData_offset; int outData_offset; void *data[] __attribute__ ((aligned (DEFAULT_ALIGNMENT))); - // memaddr param[param_count]; - // ListEelemnt inData[inData_count]; - // ListElement outData[outData_count]; public: // functions - // int add_inData_t(memaddr addr, int size); - // int add_outData_t(memaddr addr, int size); void print(); - int const offset() { return (memaddr)data-(memaddr)&task_size; } - - // on host - memaddr param(int index) { - return (memaddr)data + sizeof(memaddr)*index; - } - // on host - memaddr inData(int index) { - memaddr p = (memaddr)data + inData_offset; - return p + sizeof(ListElement)*index; - } - // on host - memaddr outData(int index) { - memaddr p = (memaddr)data + outData_offset; - return p + sizeof(ListElement)* index; - } - - // on client - memaddr get_param(int index) { - memaddr data = (memaddr)this + offset(); - return (memaddr)data + sizeof(memaddr)*index; - } - // on client - ListElement *inListData() { - memaddr data = (memaddr)this + offset(); - ListElement *list = (ListElement *)(data+inData_offset); - return list; - } - - // on client - ListElement *outListData() { - memaddr data = (memaddr)this + offset(); - ListElement *list = (ListElement *)(data+outData_offset); - return list; + memaddr *param(int index) { + memaddr p = (memaddr)data + sizeof(memaddr)*index; + return (memaddr *)p; } - void set_param_length(int i) { - param_count = i; - inData_offset = round_up16(sizeof(Task))+param_count*sizeof(memaddr); - } - void set_inData_length(int length) { - inData_count = length; - if (inData_offset==0) { - printf("call set_param_length before\n"); - } - outData_offset = - round_up16(inData_offset+inData_count*sizeof(ListElement)); - } - void set_outData_length(int length) { - outData_count = length; - if (outData_offset==0) { - printf("call set_outData_length before\n"); - } - task_size = round_up16(outData_offset+outData_count*sizeof(ListElement)); - } - int size() { - if (task_size==0) { - printf("call set_outData_length before\n"); - } - return task_size; - } - int inData_total_size() { - int size = 0; - ListElement *inData = inListData(); - for(int i=0; i< inData_count; i++) { - size += inData[i].size; - } - return size; - } - int outData_total_size() { - int size = 0; - ListElement *outData = inListData(); - for(int i=0; i< outData_count; i++) { - size += outData[i].size; - } - return size; + ListElement *inData(int index) { + memaddr p = (memaddr)data + inData_offset; + p += sizeof(ListElement)*index; + return (ListElement*)p; } - void set_inData_t( int index, memaddr addr, int size); - void set_outData_t(int index, memaddr addr, int size); - void set_task_id(int id) { command = id; } - void set_param_t(int index, memaddr param) { - memaddr *p = (memaddr*)this->param(index); - *p = param; + ListElement *outData(int index) { + memaddr p = (memaddr)data + outData_offset; + p += sizeof(ListElement)* index; + return (ListElement*)p; } static int calc_size(int params, int ins, int outs) { @@ -149,9 +75,75 @@ + round_up16(sizeof(memaddr)*params) + round_up16(sizeof(ListElement)*ins) + round_up16(sizeof(ListElement)*outs); +#if 0 +printf(" calc_size 0x%x\n",size); +#endif return size; } + void init(int task_id, int params, int ins, int outs) { + set_task_id(task_id); + param_count = params; + inData_count = ins; + outData_count = outs; + inData_offset = round_up16(sizeof(memaddr)*params); + outData_offset = round_up16(inData_offset+sizeof(ListElement)*ins); + task_size = round_up16(sizeof(Task)+outData_offset+sizeof(ListElement)*outs); +#if 0 +printf("task_id %d params %d ins %d outs %d\n",task_id, params, ins, outs); +printf(" inData_offset %d\n",inData_offset); +printf(" outData_offset %d\n",outData_offset); +printf(" task_size 0x%x\n",task_size); + this->print(); +#endif + } + + int size() { + return task_size; + } + + int inData_total_size() { + int size = 0; + ListElement *in= inData(0); + for(int i=0; i< inData_count; i++) { + size += in[i].size; + } + return size; + } + int outData_total_size() { + int size = 0; + ListElement *out= outData(0); + for(int i=0; i< outData_count; i++) { + size += out[i].size; + } + return size; + } + + void set_inData_t( int index, memaddr addr, int size) { + ListElement *list = inData(index); +#ifdef __CERIUM_CELL__ + list->addr = (uint32)addr; +#else + list->addr = addr; +#endif + list->size = size; + } + + void set_outData_t(int index, memaddr addr, int size) { + ListElement *list = outData(index); +#ifdef __CERIUM_CELL__ + list->addr = (uint32)addr; +#else + list->addr = addr; +#endif + list->size = size; + } + void set_task_id(int id) { command = id; } + void set_param_t(int index, memaddr param) { + memaddr *p = (memaddr*)this->param(index); + *p = param; + } + Task * next() { char *p = (char*)this; diff -r 7e937a1cd121 -r d3afc8777daa TaskManager/kernel/ppe/TaskManager.cc --- a/TaskManager/kernel/ppe/TaskManager.cc Sun Dec 13 22:46:15 2009 +0900 +++ b/TaskManager/kernel/ppe/TaskManager.cc Mon Dec 14 12:16:52 2009 +0900 @@ -1,5 +1,10 @@ #include "TaskManager.h" #include "Scheduler.h" +#ifdef SIMPLE_TASK +#include "HTask.h" +#include "Task.h" +#include "SysFunc.h" +#endif TaskManager::TaskManager(int num) : machineNum(num) { @@ -59,6 +64,14 @@ return m_impl->create_task(cmd,r,rs,w,ws); } +#ifdef SIMPLE_TASK +HTaskPtr +TaskManager::create_task_array(int id, int num_task, int num_param, int num_inData, int num_outData) { + HTaskPtr ta = create_task(TaskArray,0,0,0,0); + ta->create_task_array(id, num_task, num_param, num_inData, num_outData) ; + return ta; +} +#endif /** * TaskManaer 終了時に実行される関数の設定 diff -r 7e937a1cd121 -r d3afc8777daa TaskManager/kernel/ppe/TaskManager.h --- a/TaskManager/kernel/ppe/TaskManager.h Sun Dec 13 22:46:15 2009 +0900 +++ b/TaskManager/kernel/ppe/TaskManager.h Mon Dec 14 12:16:52 2009 +0900 @@ -36,6 +36,11 @@ void init(); void finish(); +#ifdef SIMPLE_TASK + HTask *create_task_array(int id, int num_task, int num_param, int num_inData, int num_outData); +#endif + + private: int machineNum; }; diff -r 7e937a1cd121 -r d3afc8777daa TaskManager/kernel/schedule/SchedTaskArray.cc --- a/TaskManager/kernel/schedule/SchedTaskArray.cc Sun Dec 13 22:46:15 2009 +0900 +++ b/TaskManager/kernel/schedule/SchedTaskArray.cc Mon Dec 14 12:16:52 2009 +0900 @@ -51,7 +51,7 @@ inListData.length = task->inData_count; inListData.size = task->inData_total_size(); - inListData.element = task->inListData(); + inListData.element = task->inData(0); inListData.bound = (int*)scheduler->allocate(inListData.length*sizeof(int)); // load Input Data @@ -71,7 +71,7 @@ if (task->outData_count > 0) { outListData.length = task->outData_count; outListData.size = task->outData_total_size(); - outListData.element = task->outListData(); + outListData.element = task->outData(0); outListData.bound = (int*)scheduler->allocate(outListData.length*sizeof(int)); bound(&outListData); @@ -201,7 +201,7 @@ memaddr SchedTaskArray::get_param(int index) { - return task->get_param(index); + return *task->param(index); } diff -r 7e937a1cd121 -r d3afc8777daa example/Bulk/main.cc --- a/example/Bulk/main.cc Sun Dec 13 22:46:15 2009 +0900 +++ b/example/Bulk/main.cc Mon Dec 14 12:16:52 2009 +0900 @@ -64,10 +64,9 @@ } void -twice_init(TaskManager *manager) +twice_init(TaskManager *manager,int *data, int length) { - int *data = (int*)manager->allocate(sizeof(int)*length); for (int i = 0; i < length; i++) { data[i] = i; @@ -79,16 +78,18 @@ * Create Task * create_task(Task ID); */ - int size = Task::calc_size(2,2,2); - printf("allocate task size 0x%0x\n",size); - printf("allocate task total size 0x%0x\n",(size *= count)); - memaddr task_buf = (memaddr)manager->allocate(size); - HTask *twice_main = manager->create_task(TaskArray, task_buf, size, 0, 0); + HTask *twice_main = manager->create_task_array(Twice,count,2,2,2); + Task *t = twice_main->next_task_array(Twice, 0); + printf("allocate task size 0x%0x\n",t->size()); + printf("allocate task total size 0x%0x = 0x%0x * %d\n",twice_main->r_size, + t->size(), count); + void *task_buf = twice_main->rbuf; + twice_main->set_post(twice_result, (void*)data, task_buf); - int pos = 0; + t = 0; for(int i = 0;icreate_task_array(Twice,pos); + t = twice_main->next_task_array(Twice, t); int length2 = length/2; // 以下の順序でデータを追加する必要がある。 // length を先に指定すればsetは後からでも良い。 @@ -96,35 +97,31 @@ * Set 32bits parameter * add_param(32bit parameter); */ - t->set_param_length(2); t->set_param(0, (memaddr)length2); t->set_param(1, (memaddr)length2); /** * Set of Input Data * add_inData(address of input data, size of input data); */ - t->set_inData_length(2); t->set_inData(0,data, sizeof(int)*length2); t->set_inData(1,data+length2, sizeof(int)*length2); - print_ListData(2,t->inListData()); + print_ListData(2,t->inData(0)); /** * Set of Output area * add_outData(address of output area, size of output area); */ - t->set_outData_length(2); t->set_outData(0,data, sizeof(int)*length2); t->set_outData(1,data+length2, sizeof(int)*length2); - print_ListData(2,t->outListData()); - pos += t->size(); - printf("pos 0x%0x size 0x%0x\n",pos, t->size()); + print_ListData(2,t->outData(0)); + data += length; + printf("pos 0x%0lx size 0x%0x\n",(unsigned long)t, t->size()); } - twice_main->spawn_task_array(pos); + twice_main->spawn_task_array(t->next()); twice_main->set_cpu(SPE_ANY); /* * set_post() で ppe task を渡せるようにしたい */ - twice_main->set_post(twice_result, (void*)data, (void*)task_buf); // add Active Queue twice_main->spawn(); } @@ -141,7 +138,8 @@ task_init(); for (int i = 0; i < task; ++i) { - twice_init(manager); + int *data = (int*)manager->allocate(sizeof(int)*length*count); + twice_init(manager, data, length); } return 0;