# HG changeset patch # User Shinji KONO # Date 1260093226 -32400 # Node ID 9a6cb2439593caeb9b1e2324d2775ef700260138 # Parent 80b23718df1889581f13a95ad3151e13580a9e16 on going... diff -r 80b23718df18 -r 9a6cb2439593 TaskManager/Cell/spe/TaskArray.cc --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/TaskManager/Cell/spe/TaskArray.cc Sun Dec 06 18:53:46 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 80b23718df18 -r 9a6cb2439593 TaskManager/Makefile.def --- a/TaskManager/Makefile.def Sun Dec 06 18:13:46 2009 +0900 +++ b/TaskManager/Makefile.def Sun Dec 06 18:53:46 2009 +0900 @@ -29,8 +29,8 @@ ABIBIT = 32 -# SIMPLE_TASK=-DSIMPLE_TASK -SIMPLE_TASK= +SIMPLE_TASK=-DSIMPLE_TASK +# SIMPLE_TASK= # OPT = -O9 OPT = -g diff -r 80b23718df18 -r 9a6cb2439593 TaskManager/kernel/ppe/HTask.cc --- a/TaskManager/kernel/ppe/HTask.cc Sun Dec 06 18:13:46 2009 +0900 +++ b/TaskManager/kernel/ppe/HTask.cc Sun Dec 06 18:53:46 2009 +0900 @@ -54,7 +54,7 @@ Task * HTask::create_task(int task_id, int pos) { - Task *task = (Task*)((memaddr)rbuf + pos); + Task *task = (Task*)((memaddr)this->rbuf + pos); task->set_task_id(task_id); return task; } diff -r 80b23718df18 -r 9a6cb2439593 TaskManager/kernel/ppe/HTask.h --- a/TaskManager/kernel/ppe/HTask.h Sun Dec 06 18:13:46 2009 +0900 +++ b/TaskManager/kernel/ppe/HTask.h Sun Dec 06 18:53:46 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 { @@ -45,7 +48,7 @@ void wait_for(HTask *); void set_cpu(CPU_TYPE type); void set_post(PostFunction func, void *read, void *write); -#ifdef SIPMLE_TASK +#ifdef SIMPLE_TASK Task *create_task(int task_id, int pos); #endif }; diff -r 80b23718df18 -r 9a6cb2439593 TaskManager/kernel/ppe/Task.cc --- a/TaskManager/kernel/ppe/Task.cc Sun Dec 06 18:13:46 2009 +0900 +++ b/TaskManager/kernel/ppe/Task.cc Sun Dec 06 18:53:46 2009 +0900 @@ -1,5 +1,7 @@ #include "Task.h" +// #include "SchedTask.h" it includes #define Task + #ifndef SIMPLE_TASK /** * タスクの入力データを追加する @@ -40,7 +42,7 @@ // こちらのAPIは、受け側と出力側での対応を良く見れない。廃止の方向。 int -Task::add_param0(memaddr _param) +Task::add_param_t(memaddr _param) { if (param_size >= MAX_PARAMS) return -1; @@ -49,7 +51,7 @@ } int -Task::set_param0(int index, memaddr _param) +Task::set_param_t(int index, memaddr _param) { if (index >= MAX_PARAMS) return -1; @@ -108,14 +110,14 @@ } void -Task::print(SchedTask *s) +Task::print() { - s->printf("task id %d param size %d " + printf("task id %d param size %d " "inData size %d " - "outData size %d\n", task_id, param_size, inData_size, outData_size; + "outData size %d\n", command, param_size, inData_size, outData_size ); for(int i=0; i< param_size; i++) { - s->printf("param %d = 0x%ld\n", param(i)); + printf("param %d = 0x%ld\n", i, (long)param(i)); } } diff -r 80b23718df18 -r 9a6cb2439593 TaskManager/kernel/ppe/Task.h --- a/TaskManager/kernel/ppe/Task.h Sun Dec 06 18:13:46 2009 +0900 +++ b/TaskManager/kernel/ppe/Task.h Sun Dec 06 18:53:46 2009 +0900 @@ -33,11 +33,15 @@ #define add_outData(addr, size) \ add_outData_t((memaddr)(addr), (size)); }; + #else + +class SchedTask; + class Task { public: // variables - int task_id; + int command; int param_size; int inData_size; int outData_size; @@ -50,20 +54,18 @@ // int add_inData_t(memaddr addr, int size); // int add_outData_t(memaddr addr, int size); - void print(SchedTask *s); + void print(); memaddr param(int index) { - memaddr p = (memaddr)data->data; + memaddr p = (memaddr)data; return p + sizeof(memaddr)*index; } memaddr inData(int index) { - memaddr p = (memaddr)data - + (sizeof(memaddr)*index); - return p + sizeof(ListElement)*index; + return param(param_size) + sizeof(ListElement)*index; } memaddr outData(int index) { memaddr p = inData(inData_size); - return p + sizeof(ListEelement)* index; + return p + sizeof(ListElement)* index; } void set_param_length(int i) { param_size = i; } @@ -71,22 +73,30 @@ void set_outData_length(int length) { outData_size = length; } 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) { task_id = id; } - int set_param_t(int index, memaddr param) { - memaddr *p = (memaddr*)param(index); + void set_task_id(int id) { command = id; } + void set_param_t(int index, memaddr param) { + memaddr *p = (memaddr*)this->param(index); *p = param; } int size() { return outData(outData_size)-(memaddr)data; } + static int count_size(int params, int ins, int outs) { + int size = sizeof(memaddr)*params + + sizeof(ListElement)*ins + + sizeof(ListElement)*outs; + return size; + } + // #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) \ +// #define add_inData(addr, size) // add_inData_t((memaddr)(addr), (size)); -// #define add_outData(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) \ diff -r 80b23718df18 -r 9a6cb2439593 TaskManager/kernel/schedule/SchedTask.cc --- a/TaskManager/kernel/schedule/SchedTask.cc Sun Dec 06 18:13:46 2009 +0900 +++ b/TaskManager/kernel/schedule/SchedTask.cc Sun Dec 06 18:53:46 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 80b23718df18 -r 9a6cb2439593 TaskManager/kernel/schedule/SchedTask.h --- a/TaskManager/kernel/schedule/SchedTask.h Sun Dec 06 18:13:46 2009 +0900 +++ b/TaskManager/kernel/schedule/SchedTask.h Sun Dec 06 18:53:46 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 80b23718df18 -r 9a6cb2439593 TaskManager/kernel/schedule/SchedTaskList.cc --- a/TaskManager/kernel/schedule/SchedTaskList.cc Sun Dec 06 18:13:46 2009 +0900 +++ b/TaskManager/kernel/schedule/SchedTaskList.cc Sun Dec 06 18:53:46 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 80b23718df18 -r 9a6cb2439593 TaskManager/kernel/sys_task/TaskArray.cc --- a/TaskManager/kernel/sys_task/TaskArray.cc Sun Dec 06 18:13:46 2009 +0900 +++ b/TaskManager/kernel/sys_task/TaskArray.cc Sun Dec 06 18:53:46 2009 +0900 @@ -6,6 +6,7 @@ SchedDefineTask(TaskArray); +#ifdef SIMPLE_TASK static Task * next(Task *t) { @@ -13,17 +14,20 @@ 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(); + Task *last = (Task*)(((char*)rbuf)+ s->read_size()); while( task < last) { - task->print(s); + task->print(); task = next(task); } +#endif return 0; } diff -r 80b23718df18 -r 9a6cb2439593 example/Bulk/Makefile.def --- a/example/Bulk/Makefile.def Sun Dec 06 18:13:46 2009 +0900 +++ b/example/Bulk/Makefile.def Sun Dec 06 18:53:46 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 80b23718df18 -r 9a6cb2439593 example/Bulk/main.cc --- a/example/Bulk/main.cc Sun Dec 06 18:13:46 2009 +0900 +++ b/example/Bulk/main.cc Sun Dec 06 18:53:46 2009 +0900 @@ -2,6 +2,7 @@ #include #include #include "TaskManager.h" +#include "Task.h" #include "Func.h" extern void task_init(void); @@ -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 @@ -68,8 +71,7 @@ * Create Task * create_task(Task ID); */ - int size = count*(SizeOfParam(2) + SizeOfData(sizeof(int)*length) + - SizeOfData(sizeof(int)*length)); + int size = Task::count_size(2,length,0) * count; memaddr task_buf = (memaddr)manager->allocate(size); HTask *twice_main = manager->create_task(TaskArray, task_buf, size, 0, 0); @@ -109,7 +111,7 @@ /* * set_post() で ppe task を渡せるようにしたい */ - twice_main->set_post(twice_result, (void*)data, 0); + twice_main->set_post(twice_result, (void*)data, (void*)task_buf); // add Active Queue twice_main->spawn(); }