# HG changeset patch # User Shinji KONO # Date 1260453355 -32400 # Node ID be44ada665e98919c8a6ef557976cfec655ce094 # Parent 9c8dd6026022e5ad26aa3a3524e610cb6a647829# Parent fc0227b5cb5ac2652af7f85adcda291a8a78e83c merge diff -r fc0227b5cb5a -r be44ada665e9 .hgtags --- a/.hgtags Tue Dec 08 19:44:20 2009 +0900 +++ b/.hgtags Thu Dec 10 22:55:55 2009 +0900 @@ -3,3 +3,4 @@ 30568cef3899caea3db0fb9e28b0e6f889c60679 double-linked-task-list 8fca17aa57dfe07aeff46a3ae1707c795c762d72 examples 9df0112f7ccfe03caffb06e64160ae2a6f3a22dd before_simple_task +a06eef665c455b4da8dbe05595a5628aedd3eb3a before-task-array diff -r fc0227b5cb5a -r be44ada665e9 TaskManager/Cell/spe/TaskArray.cc --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/TaskManager/Cell/spe/TaskArray.cc Thu Dec 10 22:55:55 2009 +0900 @@ -0,0 +1,33 @@ +#include "Finish.h" +#include "SysFunc.h" +#include "Scheduler.h" +#include "Task.h" + + +SchedDefineTask(TaskArray); + +#ifdef SIMPLE_TASK +static Task * +next(Task *t) +{ + char *p = (char*)t; + p += t->size(); + return (Task*)p; +} +#endif + +static int +run(SchedTask *s,void *rbuf, void *wbuf) +{ +#ifdef SIMPLE_TASK + Task *task = (Task *)rbuf; + Task *last = ((char*)rbuf)+ s->read_size(); + + while( task < last) { + task->print(s); + task = next(task); + } +#endif + + return 0; +} diff -r fc0227b5cb5a -r be44ada665e9 TaskManager/Cell/spe/main.cc --- a/TaskManager/Cell/spe/main.cc Tue Dec 08 19:44:20 2009 +0900 +++ b/TaskManager/Cell/spe/main.cc Thu Dec 10 22:55:55 2009 +0900 @@ -4,6 +4,8 @@ #include "spu_mfcio.h" #include "error.h" #include "SysFunc.h" +#include "SchedNop.h" + extern unsigned char _end[]; @@ -36,7 +38,7 @@ tm->set_scheduler(manager); - manager->run(); + manager->run(new ScedNop()); manager->finish(); diff -r fc0227b5cb5a -r be44ada665e9 TaskManager/ChangeLog --- a/TaskManager/ChangeLog Tue Dec 08 19:44:20 2009 +0900 +++ b/TaskManager/ChangeLog Thu Dec 10 22:55:55 2009 +0900 @@ -1,3 +1,60 @@ + +2009-12-7 Shinji KONO + + pipeline stageは、loop local だから、instance 変数である必 + 要はない。途中で中断することはない。これを一時変数にして、 + 再帰的にpipeline stage を呼び出せば良いらしい。 + + pipeline stage のtask1に引数で new SchedTaskList を渡すと、 + run()でtask1 = new SchedNop() するよりループ二回ぐらい高速 + になるらしい。が、おそらく、ほとんど影響はない。 + + pipelineで既に走っている次のTaskのreadを停める必要があるら + しい。前もってNopを入れて置く方法もあるが、TaskListの境界が + 問題になる。停めないとパイプラインバッファを新たに取る必要 + があり連鎖的にはまる。 + + writeしている奴もいるしな。スケジューラは一段しかネストしな + いから新しくバッファ取るか? いや、やっぱり許されないか。い + や、取るか。うーん、悩ましい。どうせ、Task list は確保しな + いとだめだから… 再帰しないで、もとのスケジューラで動かした + い + + そのためには、既に Pipeline に入っているTaskが邪魔か。2つTask + を投入して、間に TaskList read が入ってもなんとかなるように + 工夫するのが良いっぽい + + なんか、Renew Task の道を歩んでいる気もするが... + +2009-12-6 Shinji KONO + + やっぱり、Graphical なprofileが欲しいかな。どのDMA/Taskに時間がかかっている + かが見えるようなものが。profile で、メインメモリにlogを書き出すようなもの + が必要。deubg 用のデータ書き出しツールがいるな。 + + log header + command(16) cpu-id(16) event(32) time(64) + struct debug_log { + uint16 command; + uint16 cpu-id; + uint32 event; + uint32 time; + } + ぐらい? get_segment 使うべきか。連続領域に使える get_segement があると + 良いわけね。write とも言うが。 + + sort で、memcpy しているのは変。read/write buffer をflipしてやると + 良い。両方とも握っているんだから問題ない。ただし、read/write buffer + の大きさは等しい必要がある。SchedTask->flip_read_write_buffer(); か? + sort ちゃんとは動いているんだよ。 + + word_count_test の稼働率が10%なのはひどい。word_count の方だと偏りが + あって、一部が50%になるが10%ぐらい。DMA待ちではなくて、メール待ちに + なっている。PPUネックになっているっぽい。 + + TaskArray は、SchedTask を拡張して処理する。next で、次のTaskを + 用意する感じか。inData/outData の処理も。 + 2009-12-5 Shinji KONO なんかなぁ。一つの機能を付け加えようとすると、 @@ -34,7 +91,7 @@ なっているらしい。 実際、mail_sendQueue は、free list に置き換わってしまう。 - これまで、これがおかしならなかった理由は不明。 + これまで、これがおかしくならなかった理由は不明。 connector に外から手を入れないで、ちゃんとfunction callするべし。 diff -r fc0227b5cb5a -r be44ada665e9 TaskManager/Fifo/FifoTaskManagerImpl.cc --- a/TaskManager/Fifo/FifoTaskManagerImpl.cc Tue Dec 08 19:44:20 2009 +0900 +++ b/TaskManager/Fifo/FifoTaskManagerImpl.cc Thu Dec 10 22:55:55 2009 +0900 @@ -6,6 +6,7 @@ #include "SchedTask.h" #include "types.h" #include "error.h" +#include "SchedNop.h" FifoTaskManagerImpl::~FifoTaskManagerImpl() { @@ -162,7 +163,8 @@ mainScheduler->mail_write_from_host((memaddr)MY_SPE_COMMAND_EXIT); // scheduler は受け取ったメールを元に実行する - mainScheduler->run(); + // new SchedTaskList(list, mainScheduler) の方が良さそうだけど... + mainScheduler->run(new SchedNop()); } } diff -r fc0227b5cb5a -r be44ada665e9 TaskManager/Makefile.def --- a/TaskManager/Makefile.def Tue Dec 08 19:44:20 2009 +0900 +++ b/TaskManager/Makefile.def Thu Dec 10 22:55:55 2009 +0900 @@ -29,10 +29,14 @@ ABIBIT = 32 -# SIMPLE_TASK=-DSIMPLE_TASK -SIMPLE_TASK= +SIMPLE_TASK=-DSIMPLE_TASK +# SIMPLE_TASK= +<<<<<<< local +# OPT = -O9 +======= #OPT = -O9 +>>>>>>> other OPT = -g CC = g++ diff -r fc0227b5cb5a -r be44ada665e9 TaskManager/kernel/ppe/HTask.cc --- a/TaskManager/kernel/ppe/HTask.cc Tue Dec 08 19:44:20 2009 +0900 +++ b/TaskManager/kernel/ppe/HTask.cc Thu Dec 10 22:55:55 2009 +0900 @@ -49,4 +49,32 @@ this->post_arg2 = arg2; } +#ifdef SIMPLE_TASK + +Task * +HTask::create_task_array(int task_id, int pos) +{ + Task *task = (Task*)((memaddr)rbuf + pos); + task->set_task_id(task_id); + task-> param_size = 0; + task-> inData_size = 0; + task-> outData_size = 0; + task-> inData_offset = 0; + task-> outData_offset = 0; + + return task; +} + +void +HTask::spawn_task_array(int pos) +{ + if (pos!= r_size) { + printf("spawn task array size differ pos 0x%x r_size 0x%x\n", + pos, r_size); + } +} + + +#endif + /* end */ diff -r fc0227b5cb5a -r be44ada665e9 TaskManager/kernel/ppe/HTask.h --- a/TaskManager/kernel/ppe/HTask.h Tue Dec 08 19:44:20 2009 +0900 +++ b/TaskManager/kernel/ppe/HTask.h Thu Dec 10 22:55:55 2009 +0900 @@ -21,7 +21,10 @@ 特定の Task を待ち合わせる事が可能。 Task の入出力は dma などで copy される。 */ -#ifdef SIPMLE_TASK +#ifdef SIMPLE_TASK + +#include "SimpleTask.h" + class HTask : public SimpleTask { #else class HTask : public Task { @@ -41,10 +44,14 @@ HTask *next; HTask *prev; - void spawn(void); + void spawn(); void wait_for(HTask *); 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); +#endif }; typedef HTask* HTaskPtr; diff -r fc0227b5cb5a -r be44ada665e9 TaskManager/kernel/ppe/Task.cc --- a/TaskManager/kernel/ppe/Task.cc Tue Dec 08 19:44:20 2009 +0900 +++ b/TaskManager/kernel/ppe/Task.cc Thu Dec 10 22:55:55 2009 +0900 @@ -1,5 +1,8 @@ #include "Task.h" +// #include "SchedTask.h" it includes #define Task + +#ifndef SIMPLE_TASK /** * タスクの入力データを追加する * @@ -11,11 +14,7 @@ int Task::add_inData_t(memaddr addr, int size) { -#ifdef SIMPLE_TASK - return 0; -#else return add_data(inData, addr, size); -#endif } /** @@ -29,11 +28,7 @@ int Task::add_outData_t(memaddr addr, int size) { -#ifdef SIMPLE_TASK - return 0; -#else return add_data(outData, addr, size); -#endif } /** @@ -47,24 +42,20 @@ // こちらのAPIは、受け側と出力側での対応を良く見れない。廃止の方向。 int -Task::add_param0(memaddr _param) +Task::add_param_t(memaddr _param) { -#ifndef SIMPLE_TASK if (param_size >= MAX_PARAMS) return -1; this->param[param_size++] = _param; -#endif return 0; } int -Task::set_param0(int index, memaddr _param) +Task::set_param_t(int index, memaddr _param) { -#ifndef SIMPLE_TASK if (index >= MAX_PARAMS) return -1; this->param[index] = _param; -#endif return 0; } @@ -75,7 +66,6 @@ int Task::add_data(ListData& list, memaddr addr, int size) { -#ifndef SIMPLE_TASK if (list.length >= MAX_LIST_DMA_SIZE) return -1; list.bound[list.length] = list.size; @@ -90,7 +80,48 @@ elm->addr = addr; #endif elm->size = size; + return 0; +} + +#else /* ifdef SIMPLE_TASK */ + +void +Task::set_inData_t( int index, memaddr addr, int size) +{ + ListElementPtr elm = (ListElementPtr) inData(0); +#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(0); +#ifdef __CERIUM_CELL__ + elm->addr = (uint32)(unsigned long)addr; +#else + elm->addr = addr; +#endif + elm->size = size; +} + +void +Task::print() +{ + printf("task id %d task size = %d param size %d " + "inData size %d " + "outData size %d\n", command, size(), param_size, inData_size, outData_size + ); + for(int i=0; i< param_size && i<5; i++) { + printf("param %d = 0x%ld\n", i, (long)param(i)); + } + +} + #endif - return 0; -} +/* end */ diff -r fc0227b5cb5a -r be44ada665e9 TaskManager/kernel/ppe/Task.h --- a/TaskManager/kernel/ppe/Task.h Tue Dec 08 19:44:20 2009 +0900 +++ b/TaskManager/kernel/ppe/Task.h Thu Dec 10 22:55:55 2009 +0900 @@ -8,26 +8,25 @@ #define MAX_PARAMS 8 +#ifndef SIMPLE_TASK class Task : public SimpleTask { public: // variables BASE_NEW_DELETE(Task); -#ifndef SIMPLE_TASK int param_size; // 4 byte memaddr param[MAX_PARAMS]; // 4*MAX_PARAMS byte ListData inData __attribute__ ((aligned (DEFAULT_ALIGNMENT))); ListData outData __attribute__ ((aligned (DEFAULT_ALIGNMENT))); -#endif public: // functions int add_inData_t(memaddr addr, int size); // unsigned int ではなく 64bit int add_outData_t(memaddr addr, int size); // unsigned int ではなく 64bit int add_data(ListData &list, memaddr addr, int size); - int add_param0(memaddr param); // obsolete. do not use. - int set_param0(int index, memaddr param); + int add_param_t(memaddr param); // obsolete. do not use. + int set_param_t(int index, memaddr param); -#define add_param(param) add_param0((memaddr)(param)) -#define set_param(index,param) set_param0(index, (memaddr) (param)) +#define add_param(param) add_param_t((memaddr)(param)) +#define set_param(index,param) set_param_t(index, (memaddr) (param)) #define add_inData(addr, size) \ add_inData_t((memaddr)(addr), (size)); @@ -35,6 +34,106 @@ add_outData_t((memaddr)(addr), (size)); }; +#else + +class SchedTask; + +class Task { +public: // variables + int task_size; + int command; + int param_size; + int inData_size; + int outData_size; + int inData_offset; + int outData_offset; + void *data[] __attribute__ ((aligned (DEFAULT_ALIGNMENT))); + // memaddr param[param_size]; + // ListEelemnt inData[inData_size]; + // ListElement outData[outData_size]; + +public: // functions + // int add_inData_t(memaddr addr, int size); + // int add_outData_t(memaddr addr, int size); + + void print(); + + memaddr param(int index) { + return (memaddr)data + sizeof(memaddr)*index; + } + memaddr inData(int index) { + memaddr p = (memaddr)data + inData_offset; + return p + sizeof(ListElement)*index; + } + memaddr outData(int index) { + memaddr p = (memaddr)data + outData_offset; + return p + sizeof(ListElement)* index; + } + + void set_param_length(int i) { + param_size = i; + inData_offset = round_up16(sizeof(Task))+param_size*sizeof(memaddr); + } + void set_inData_length(int length) { + inData_size = length; + if (inData_offset==0) { + printf("call set_param_length before\n"); + } + outData_offset = + round_up16(inData_offset+inData_size*sizeof(ListElement)); + } + void set_outData_length(int length) { + outData_size = length; + if (outData_offset==0) { + printf("call set_outData_length before\n"); + } + task_size = round_up16(outData_offset+outData_size*sizeof(ListElement)); + } + int size() { + if (task_size==0) { + printf("call set_outData_length before\n"); + } + return task_size; + } + 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; + } + + static int count_size(int params, int ins, int outs) { + int size = round_up16(sizeof(Task)) + + round_up16(sizeof(memaddr)*params) + + round_up16(sizeof(ListElement)*ins) + + round_up16(sizeof(ListElement)*outs); + return size; + } + + Task * next() + { + char *p = (char*)t; + p += t->size(); + return (Task*)p; + } + + +// #define add_param(param) add_param_t((memaddr)(param)) +#define set_param(index,param) set_param_t(index, (memaddr) (param)) + +// #define add_inData(addr, size) +// add_inData_t((memaddr)(addr), (size)); +// #define add_outData(addr, size) +// add_outData_t((memaddr)(addr), (size)); + +#define set_inData(index, addr, size) \ + set_inData_t(index, (memaddr)(addr), (size)); +#define set_outData(index, addr, size) \ + set_outData_t(index, (memaddr)(addr), (size)); +}; +#endif + typedef Task* TaskPtr; #endif diff -r fc0227b5cb5a -r be44ada665e9 TaskManager/kernel/schedule/SchedTask.cc --- a/TaskManager/kernel/schedule/SchedTask.cc Tue Dec 08 19:44:20 2009 +0900 +++ b/TaskManager/kernel/schedule/SchedTask.cc Thu Dec 10 22:55:55 2009 +0900 @@ -8,6 +8,11 @@ #include "TaskManager.h" #include +#ifdef SIMPLE_TASK +#define Task SimpleTask +#define TaskPtr SimpleTaskPtr +#endif + extern Scheduler::TaskObject task_list[MAX_TASK_OBJECT]; /** diff -r fc0227b5cb5a -r be44ada665e9 TaskManager/kernel/schedule/SchedTask.h --- a/TaskManager/kernel/schedule/SchedTask.h Tue Dec 08 19:44:20 2009 +0900 +++ b/TaskManager/kernel/schedule/SchedTask.h Thu Dec 10 22:55:55 2009 +0900 @@ -10,10 +10,6 @@ #include "HTask.h" #include "MemList.h" -#ifdef SIMPLE_TASK -#define Task SimpleTask -#define TaskPtr SimpleTaskPtr -#endif class SchedTask : public SchedTaskBase { public: @@ -31,13 +27,15 @@ // 現在スケジューラが実行している TaskList と、このタスクに対応する Task TaskListPtr list; - TaskPtr task; // read/write 用の ListData ListDataPtr inListData; ListDataPtr outListData; #ifndef SIMPLE_TASK + TaskPtr task; memaddr *param; +#else + SimpleTaskPtr task; #endif /** @@ -69,9 +67,13 @@ public: /* functions */ +#ifdef SIMPLE_TASK + void init(TaskListPtr _list, SimpleTaskPtr _task, int index, + Scheduler* sc); +#else void init(TaskListPtr _list, TaskPtr _task, int index, - // ListDataPtr rbuf, ListDataPtr wbuf, Scheduler* sc); +#endif //--- User API --- #ifdef SIMPLE_TASK @@ -158,7 +160,11 @@ }; +#ifdef SIMPLE_TASK +extern SchedTask* createSchedTask(Scheduler *,SimpleTaskPtr); +#else extern SchedTask* createSchedTask(Scheduler *,TaskPtr); +#endif #endif diff -r fc0227b5cb5a -r be44ada665e9 TaskManager/kernel/schedule/SchedTaskList.cc --- a/TaskManager/kernel/schedule/SchedTaskList.cc Tue Dec 08 19:44:20 2009 +0900 +++ b/TaskManager/kernel/schedule/SchedTaskList.cc Thu Dec 10 22:55:55 2009 +0900 @@ -52,7 +52,11 @@ if (list->length < 1) { nextSched = new SchedNop2Ready(scheduler); } else { +#ifdef SIMPLE_TASK + SimpleTaskPtr nextTask = &list->tasks[0]; +#else TaskPtr nextTask = &list->tasks[0]; +#endif nextSched = createSchedTask(scheduler, nextTask); ((SchedTask*)nextSched)->init(list, nextTask, 1, scheduler); diff -r fc0227b5cb5a -r be44ada665e9 TaskManager/kernel/schedule/Scheduler.cc --- a/TaskManager/kernel/schedule/Scheduler.cc Tue Dec 08 19:44:20 2009 +0900 +++ b/TaskManager/kernel/schedule/Scheduler.cc Thu Dec 10 22:55:55 2009 +0900 @@ -25,6 +25,8 @@ return 0; } +static void null_loader(Scheduler *m, int task_id); + /*! @brief speTaskの入出力のパイプラインバッファを確保する */ @@ -34,7 +36,9 @@ hash = 0; for (int i = 0; i< MAX_TASK_OBJECT; i++) { - task_list[0].run = null_run; + task_list[i].run = null_run; + task_list[i].load = null_loader; + task_list[i].wait = null_loader; } set_manager(m); @@ -59,11 +63,12 @@ } void -Scheduler::run() +Scheduler::run(SchedTaskBase* task1) { - task1 = new SchedNop(); - task2 = new SchedNop(); - task3 = new SchedNop(); + + // Pipeline Stage + SchedTaskBase* task2 = new SchedNop(); + SchedTaskBase* task3 = new SchedNop(); // main loop do { diff -r fc0227b5cb5a -r be44ada665e9 TaskManager/kernel/schedule/Scheduler.h --- a/TaskManager/kernel/schedule/Scheduler.h Tue Dec 08 19:44:20 2009 +0900 +++ b/TaskManager/kernel/schedule/Scheduler.h Thu Dec 10 22:55:55 2009 +0900 @@ -72,10 +72,6 @@ DmaManager* connector; TaskManagerImpl* manager; - // Pipeline Stage - SchedTaskBase* task1; - SchedTaskBase* task2; - SchedTaskBase* task3; /* functions */ void init(TaskManagerImpl *m); diff -r fc0227b5cb5a -r be44ada665e9 TaskManager/kernel/sys_task/SysTasks.h --- a/TaskManager/kernel/sys_task/SysTasks.h Tue Dec 08 19:44:20 2009 +0900 +++ b/TaskManager/kernel/sys_task/SysTasks.h Thu Dec 10 22:55:55 2009 +0900 @@ -1,5 +1,6 @@ StartTask, FinishTask, +TaskArray, ShowTime, StartProfile, #define Dummy StartTask diff -r fc0227b5cb5a -r be44ada665e9 TaskManager/kernel/sys_task/TaskArray.cc --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/TaskManager/kernel/sys_task/TaskArray.cc Thu Dec 10 22:55:55 2009 +0900 @@ -0,0 +1,34 @@ +#include "Finish.h" +#include "SysFunc.h" +#include "Scheduler.h" +#include "Task.h" + + +SchedDefineTask(TaskArray); + + +static int +run(SchedTask *s,void *rbuf, void *wbuf) +{ +#ifdef SIMPLE_TASK + +#ifdef TEST_TASK_ARRAY + Task *task = (Task *)rbuf; + Task *last = (Task*)(((char*)rbuf)+ s->read_size()); + + s->printf("last = %lx\n" ,(long) last); + while( task < last) { + s->printf(" task = %lx\n" ,(long) task); + task->print(); + task = task->next(); + } +#else + + Task *task = (Task *)rbuf; + SchedTaskArray *nextSched = createSchedTaskArray(s->get_scheduler(), task); + s->get_scheduler()->run(nextSched); + +#endif +#endif + return 0; +} diff -r fc0227b5cb5a -r be44ada665e9 TaskManager/kernel/sys_task/systask_register.cc --- a/TaskManager/kernel/sys_task/systask_register.cc Tue Dec 08 19:44:20 2009 +0900 +++ b/TaskManager/kernel/sys_task/systask_register.cc Thu Dec 10 22:55:55 2009 +0900 @@ -3,10 +3,12 @@ SchedExternTask(StartTask); SchedExternTask(FinishTask); +SchedExternTask(TaskArray); void systask_register() { SchedRegister(StartTask); SchedRegister(FinishTask); + SchedRegister(TaskArray); } diff -r fc0227b5cb5a -r be44ada665e9 example/Bulk/Makefile.def --- a/example/Bulk/Makefile.def Tue Dec 08 19:44:20 2009 +0900 +++ b/example/Bulk/Makefile.def Thu Dec 10 22:55:55 2009 +0900 @@ -8,7 +8,8 @@ CERIUM = ../../../Cerium CC = g++ -CFLAGS = -g -Wall -O9 +OPT = -g +CFLAGS = -Wall $(OPT) -DSIMPLE_TASK ABIBIT = 32 diff -r fc0227b5cb5a -r be44ada665e9 example/Bulk/main.cc --- a/example/Bulk/main.cc Tue Dec 08 19:44:20 2009 +0900 +++ b/example/Bulk/main.cc Thu Dec 10 22:55:55 2009 +0900 @@ -2,13 +2,14 @@ #include #include #include "TaskManager.h" +#include "Task.h" #include "Func.h" extern void task_init(void); static int length = DATA_NUM; -static int task = 1; -static int count = 1; +static int task = 10; +static int count = 10; const char *usr_help_str = "Usage: ./twice [-length data_length] [-count task_num]\n\ -length Number of data (default DATA_NUM (Func.h))\n\ @@ -32,8 +33,10 @@ twice_result(SchedTask *s, void *a, void *b) { int* data = (int*)a; + int* task_buf = (int*)b; print_data(data, length, "after"); free(data); + free(task_buf); } int @@ -55,7 +58,6 @@ void twice_init(TaskManager *manager) { - TaskArray *twice; int *data = (int*)manager->allocate(sizeof(int)*length); @@ -69,38 +71,52 @@ * Create Task * create_task(Task ID); */ - twice = manager->create_bulk_task(count); + int size = Task::count_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); + + int pos = 0; for(int i = 0;icreate_stask(Twice); + Task *t = twice_main->create_task_array(Twice,pos); int length2 = length/2; + // 以下の順序でデータを追加する必要がある。 + // length を先に指定すればsetは後からでも良い。 /** * 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->add_inData(data, sizeof(int)*length2); - t->add_inData(data+length2, sizeof(int)*length2); + t->set_inData_length(2); + t->set_inData(0,data, sizeof(int)*length2); + t->set_inData(1,data+length2, sizeof(int)*length2); /** - * Set of OutPut area + * Set of Output area * add_outData(address of output area, size of output area); */ - t->add_outData(data, sizeof(int)*length2); - t->add_outData(data+length2, sizeof(int)*length2); + t->set_outData_length(2); + t->set_outData(0,data, sizeof(int)*length2); + t->set_outData(1,data+length2, sizeof(int)*length2); + pos += t->size(); + printf("pos 0x%0x size 0x%0x\n",pos, t->size()); } + twice_main->spawn_task_array(pos); + twice_main->set_cpu(SPE_ANY); - /* * set_post() で ppe task を渡せるようにしたい */ - twice->set_post(twice_result, (void*)data, 0); - + twice_main->set_post(twice_result, (void*)data, (void*)task_buf); // add Active Queue - twice->spawn_bulk(); + twice_main->spawn(); } int diff -r fc0227b5cb5a -r be44ada665e9 example/Bulk/ppe/Twice.cc --- a/example/Bulk/ppe/Twice.cc Tue Dec 08 19:44:20 2009 +0900 +++ b/example/Bulk/ppe/Twice.cc Thu Dec 10 22:55:55 2009 +0900 @@ -1,5 +1,5 @@ #include -#include "SchedTask.h" +#include "SchedTaskArray.h" #include "Twice.h" #include "Func.h" @@ -9,6 +9,8 @@ static int run(SchedTask *s,void *rbuf, void *wbuf) { + SchedTaskArray *a = (SchedTaskArray *)s; + int *i_data; int *o_data; long length; diff -r fc0227b5cb5a -r be44ada665e9 example/Bulk/ppe/task_init.cc --- a/example/Bulk/ppe/task_init.cc Tue Dec 08 19:44:20 2009 +0900 +++ b/example/Bulk/ppe/task_init.cc Thu Dec 10 22:55:55 2009 +0900 @@ -13,5 +13,5 @@ void task_init(void) { - SchedRegisterTask(TWICE_TASK, Twice); + SchedRegister(Twice); }