# HG changeset patch # User Shinji KONO # Date 1255683437 -32400 # Node ID 125a72948e44c221691c52df2f64f013481dda64 # Parent f8d9830d94cda230d8d544002436a1462a5f8949 .... diff -r f8d9830d94cd -r 125a72948e44 TaskManager/ChangeLog --- a/TaskManager/ChangeLog Mon Oct 12 21:53:50 2009 +0900 +++ b/TaskManager/ChangeLog Fri Oct 16 17:57:17 2009 +0900 @@ -1,3 +1,27 @@ +2009-10-16 Shinji KONO + + create_task が Task を返したり HTask を返すのはよろしくない。 + HTask はHostに閉じていて、Task は転送可能って方が良いでしょう。 + + TaskGroup は謎だが、無視して良いのではないだろうか? HTaskで + double linked list 作るなら、それでschedulingすれば良い。 + + TaskList (本当は配列) は、なくしてしまうのが良いと思う。 + Task(可変長) を List DMA で転送して、向こう側で HTask queue を構成する + 方が合理的でしょう。 + + TaskList はそれ自体が、HTask であるべきだと思う。 + mail で self (HTask address)を返すことはしないで、 + TaskListTask の outData で返す。 + + SPU側には、single task を転送して起動するAPIだけを用意する。 + TaskListTask が残りのTaskをList DMAで取得し、順次実行する。 + List DMAで取得したTaskデータの集合は、HTaskに格納される + + とか、なんとかすると変更が大きいんだよな... + + param と inData がかぶってる。param は便利だけどね。 + 2009-10-11 Shinji KONO 単純な、rbuf, wbuf + write return size の task のAPI diff -r f8d9830d94cd -r 125a72948e44 TaskManager/kernel/ppe/HTask.cc --- a/TaskManager/kernel/ppe/HTask.cc Mon Oct 12 21:53:50 2009 +0900 +++ b/TaskManager/kernel/ppe/HTask.cc Fri Oct 16 17:57:17 2009 +0900 @@ -3,19 +3,8 @@ #include "TaskManagerImpl.h" -/*! - manager->set_task_depend(task1, task2); // task2 は task1 の終了を待つ - - ってやるより - - task2->set_depend(task1); - - ってやったほうがわかりやすいよねー的な話し合いで - 下のようなAPIを作りました -*/ - void -HTask::spawn(void) +HTask::spawn() { mimpl->spawn_task(this); } @@ -32,19 +21,14 @@ void HTask::wait_for(HTaskPtr master) { - mimpl->set_task_depend(master, this); + TaskQueuePtr m, s; + + m = wait_i->create(master); + s = wait_i->create(this); + + master->wait_me->addLast(s); + this->wait_i->addLast(m); + s->waiter = m; + } -void -HTask::set_cpu(CPU_TYPE type) -{ -{ - mimpl->set_task_cpu(this, type); -} - -void -set_post(PostFunction func,void *read, void *write) - this->post_func = func; - this->post_arg1 = read; - this->post_arg2 = write; -} diff -r f8d9830d94cd -r 125a72948e44 TaskManager/kernel/ppe/HTask.h --- a/TaskManager/kernel/ppe/HTask.h Mon Oct 12 21:53:50 2009 +0900 +++ b/TaskManager/kernel/ppe/HTask.h Fri Oct 16 17:57:17 2009 +0900 @@ -9,12 +9,12 @@ class TaskManagerImpl; class SchedTask; -typedef void (*PostFunction)(SchedTask *s, void *read, void *write); - /*! @class @brief + + Host に依存した Task の情報 Cerium の Task で、spawn() でキューに格納されて順次実行される。 cpu の指定があれば並列に実行される。 @@ -28,17 +28,16 @@ TaskQueueInfo *wait_me; // List of task waiting for me TaskQueueInfo *wait_i; // List of task for which I am waiting - PostFunction func; + + PostFunction post_func; void *post_arg1; void *post_arg2; CPU_TYPE cpu_type; - TaskManagerImpl *mimpl; HTask *waiter; HTask *next; HTask *prev; - void spawn(void); void wait_for(HTask *); void set_cpu(CPU_TYPE type); void set_post(PostFunction func, void *read, void *write); diff -r f8d9830d94cd -r 125a72948e44 TaskManager/kernel/ppe/Task.cc --- a/TaskManager/kernel/ppe/Task.cc Mon Oct 12 21:53:50 2009 +0900 +++ b/TaskManager/kernel/ppe/Task.cc Fri Oct 16 17:57:17 2009 +0900 @@ -65,3 +65,19 @@ return 0; } + +void +Task::set_cpu(CPU_TYPE type) +{ + cpu = type; +} + +void +Task::set_post(PostFunction func_,void *read, void *write) +{ + post_func = func_; + post_arg1 = read; + post_arg2 = write; +} + +/* end */ diff -r f8d9830d94cd -r 125a72948e44 TaskManager/kernel/ppe/Task.h --- a/TaskManager/kernel/ppe/Task.h Mon Oct 12 21:53:50 2009 +0900 +++ b/TaskManager/kernel/ppe/Task.h Fri Oct 16 17:57:17 2009 +0900 @@ -8,10 +8,32 @@ #define MAX_PARAMS 8 class TaskQueue; +class SchedTask; + + +/*! + @class + + @brief + + Host に依存しない Task + + 以下の三つの可変長データを含む + param + inData + outData + param は inData の最初の部分となる + + self はメインホストの中のHTaskのアドレスで、task id として使う + + */ + class Task { public: // variables +typedef void (*PostFunction)(SchedTask *s, void *read, void *write); + BASE_NEW_DELETE(Task); int command; // 4 byte @@ -19,6 +41,7 @@ int param_size; // 4 byte int param[MAX_PARAMS]; // 4*MAX_PARAMS byte + ListData inData __attribute__ ((aligned (DEFAULT_ALIGNMENT))); // 4 byte 64bit であるべき ListData outData __attribute__ ((aligned (DEFAULT_ALIGNMENT))); // 4 byte 64bit であるべき @@ -27,6 +50,8 @@ int add_outData_t(unsigned int addr, int size); // unsigned int ではなく 64bit int add_data(ListData &list, unsigned int addr, int size); int add_param(int param); + void set_cpu(CPU_TYPE type); + void set_post(PostFunction func, void *read, void *write); #define add_inData(addr, size) \ add_inData_t((unsigned int)(addr), (size)); diff -r f8d9830d94cd -r 125a72948e44 TaskManager/kernel/ppe/TaskManagerImpl.cc --- a/TaskManager/kernel/ppe/TaskManagerImpl.cc Mon Oct 12 21:53:50 2009 +0900 +++ b/TaskManager/kernel/ppe/TaskManagerImpl.cc Fri Oct 16 17:57:17 2009 +0900 @@ -1,5 +1,7 @@ #include #include "TaskManagerImpl.h" +#include "SchedTask.h" +#include "SchedTaskManager.h" #include "types.h" #include "error.h" #include "../sys_task/SysTask.h" @@ -7,11 +9,6 @@ static HTaskPtr systask_start; static HTaskPtr systask_finish; -void -noaction(SchdTask *s, void *read, void *write) -{ -} - TaskManagerImpl::TaskManagerImpl(int num) : machineNum(num) { activeTaskQueue = new HTaskInfo(); @@ -20,6 +17,11 @@ taskQueueImpl = new TaskQueueInfo(); } +static void +noaction(SchedTask *s, void *read, void *write) +{ +} + /** * 一番最初に PPE で実行される systask_start * 一番最後に、全てのタスクの終了を待つ systask_finish @@ -57,24 +59,6 @@ } /** - * task の依存関係を設定 - * master task が終わってから、slave task を実行するように - * master->wait_for(slave); - */ -void -TaskManagerImpl::set_task_depend(HTaskPtr master, HTaskPtr slave) -{ - TaskQueuePtr m, s; - - m = taskQueueImpl->create(master); - s = taskQueueImpl->create(slave); - - master->wait_me->addLast(s); - slave->wait_i->addLast(m); - s->waiter = m; -} - -/** * タスクを実行可能キューまたは待機キューへ追加する。 * 依存関係が満たされていれば active, まだだったら wait へ。 * task->spawn(); @@ -103,18 +87,6 @@ } /** - * タスクが実行する CPU を選択する - * - * 現在は CPU_PPE, CPU_SPE, SPE_ANY, SPE_0, SPE_1, ..., SPE_5 - * types.h に書いてます。 - */ -void -TaskManagerImpl::set_task_cpu(HTaskPtr task, CPU_TYPE type) -{ - task->cpu_type = type; -} - -/** * 終了したタスクから依存の処理とか * post_func() はこのタスクが終了したら実行する関数。 * diff -r f8d9830d94cd -r 125a72948e44 TaskManager/kernel/ppe/TaskManagerImpl.h --- a/TaskManager/kernel/ppe/TaskManagerImpl.h Mon Oct 12 21:53:50 2009 +0900 +++ b/TaskManager/kernel/ppe/TaskManagerImpl.h Fri Oct 16 17:57:17 2009 +0900 @@ -20,7 +20,7 @@ TaskListInfo *taskListImpl; TaskQueueInfo *taskQueueImpl; HTaskInfo *htaskImpl; - SchedTask *schdTaskManager; + SchedTask *schedTaskManager; /* constructor */ TaskManagerImpl(int num = 1) ; diff -r f8d9830d94cd -r 125a72948e44 TaskManager/kernel/schedule/SchedTask.cc --- a/TaskManager/kernel/schedule/SchedTask.cc Mon Oct 12 21:53:50 2009 +0900 +++ b/TaskManager/kernel/schedule/SchedTask.cc Fri Oct 16 17:57:17 2009 +0900 @@ -496,9 +496,11 @@ return task->param[index]; } -TaskPtr +HTaskPtr SchedTask::create_task(int cmd) { + HTaskPtr htask = scheduler->create_task(cmd); +#if 0 TaskListPtr taskList = scheduler->get_renewListBuf(); TaskPtr p = &taskList->tasks[taskList->length++]; p->command = cmd; @@ -512,6 +514,7 @@ p->self = (int)MY_SPE_NOP; p->param_size = 0; +#endif return p; } diff -r f8d9830d94cd -r 125a72948e44 TaskManager/kernel/schedule/SchedTask.h --- a/TaskManager/kernel/schedule/SchedTask.h Mon Oct 12 21:53:50 2009 +0900 +++ b/TaskManager/kernel/schedule/SchedTask.h Fri Oct 16 17:57:17 2009 +0900 @@ -9,6 +9,7 @@ #include "ListData.h" #include "TaskGroup.h" #include "MemList.h" +#include "HTask.h" class SchedTask : public SchedTaskBase { public: @@ -116,6 +117,7 @@ int get_outputSize(int index); int get_param(int index); + void set_post(PostFunction func,void *read, void *write); TaskPtr create_task(int cmd); void wait_task(TaskPtr waitTask); diff -r f8d9830d94cd -r 125a72948e44 TaskManager/kernel/schedule/SchedTaskManager.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/TaskManager/kernel/schedule/SchedTaskManager.h Fri Oct 16 17:57:17 2009 +0900 @@ -0,0 +1,19 @@ +#ifndef SchedTaskManager_H +#define SchedTaskManager_H + +#include "SchedTask.h" +#include "TaskManagerImpl.h" + +class SchedTaskManager : public SchedTask { + +public: + + TaskManagerImpl *manager; + + SchedTaskManager(TaskManagerImpl *m) { + manager = m; + } + +}; + +#endif diff -r f8d9830d94cd -r 125a72948e44 TaskManager/kernel/sys_task/SysTask.h --- a/TaskManager/kernel/sys_task/SysTask.h Mon Oct 12 21:53:50 2009 +0900 +++ b/TaskManager/kernel/sys_task/SysTask.h Fri Oct 16 17:57:17 2009 +0900 @@ -1,6 +1,6 @@ #include "Scheduler.h" -enum SysTask_ID{ +enum SysTask_ID { SYSTASK_START = MAX_USER_TASK, SYSTASK_FINISH, }; diff -r f8d9830d94cd -r 125a72948e44 example/basic/main.cc --- a/example/basic/main.cc Mon Oct 12 21:53:50 2009 +0900 +++ b/example/basic/main.cc Fri Oct 16 17:57:17 2009 +0900 @@ -28,7 +28,7 @@ * タスク終了後の data1, data2 の確認 */ void -twice_result(void *a) +twice_result(SchedTask *s, void *a, void *b) { int* data = (int*)a; print_data(data, length, "after"); @@ -90,7 +90,7 @@ /* * set_post() で ppe task を渡せるようにしたい */ - twice->set_post(twice_result, (void*)data); + twice->set_post(twice_result, (void*)data, 0); // add Active Queue twice->spawn(); diff -r f8d9830d94cd -r 125a72948e44 example/many_task/sort.cc --- a/example/many_task/sort.cc Mon Oct 12 21:53:50 2009 +0900 +++ b/example/many_task/sort.cc Fri Oct 16 17:57:17 2009 +0900 @@ -13,7 +13,7 @@ static int last_half_block_num; static TaskManager *manager; -static void sort_restart(void *); +static void sort_restart(SchedTask *s, void *, void *); static void sort_start(); /** @@ -44,7 +44,7 @@ * @param d 生成された btask の数 */ static void -sort_restart(void *d) +sort_restart(SchedTask *s, void *d, void *e) { static int cnt = 0; int max = (int)d; @@ -111,7 +111,7 @@ for (int i = 0; i < half_num; i++) { bsort[i]->wait_for(fsort[i]); bsort[i]->wait_for(fsort[i+1]); - bsort[i]->set_post(sort_restart, (void*)(half_num)); + bsort[i]->set_post(sort_restart, (void*)(half_num), 0); bsort[i]->spawn(); } } diff -r f8d9830d94cd -r 125a72948e44 example/post_function/main.cc --- a/example/post_function/main.cc Mon Oct 12 21:53:50 2009 +0900 +++ b/example/post_function/main.cc Fri Oct 16 17:57:17 2009 +0900 @@ -13,8 +13,8 @@ const char *usr_help_str = "Usage: ./post [-cpu spe_num] [-count N]\n\ -count Number of print \"Hello, World!!\""; -void -func1(void *p) +static void +func1(SchedTask *s, void *p, void *q) { int i = (int)p; @@ -23,7 +23,7 @@ if (i > 0) { HTaskPtr next = manager->create_task(HELLO_TASK); next->add_param(i); - next->set_post(func1, (void*)i); + next->set_post(func1, (void*)i, 0); next->set_cpu(SPE_ANY); next->spawn(); } @@ -49,7 +49,7 @@ task = manager->create_task(HELLO_TASK); task->add_param(count); - task->set_post(func1, (void*)count); + task->set_post(func1, (void*)count, 0); task->set_cpu(SPE_ANY); task->spawn(); } diff -r f8d9830d94cd -r 125a72948e44 example/renew_task/main.cc --- a/example/renew_task/main.cc Mon Oct 12 21:53:50 2009 +0900 +++ b/example/renew_task/main.cc Fri Oct 16 17:57:17 2009 +0900 @@ -2,6 +2,7 @@ #include #include #include "TaskManager.h" +#include "SchedTask.h" #include "Func.h" extern void task_init(); @@ -14,21 +15,17 @@ static int task_count = 1; static void -renewRepeat(void *arg) +renewRepeat(SchedTask *manager,void *arg, void *arg1) { - TaskManager *manager = (TaskManager *)arg; - if (count-->0) { HTask *repeat = manager->create_task(RENEW_REPEAT); - repeat->set_post(renewRepeat, (void*)manager); + repeat->set_post(renewRepeat, 0, 0); repeat->spawn(); - HTask *renew; - printf("[PPE] Create Task : RenewStart\n\n"); for(int i=0;icreate_task(RENEW_START); + HTask *renew = manager->create_task(RENEW_START); renew->set_cpu(SPE_ANY); renew->add_param(i); renew->add_param((int)&task_count); @@ -39,12 +36,6 @@ } } -static int -run(SchedTask *s, void *rbuf, void *wbuf) -{ - // RewnewRepeat Task - return 0; -} static int init(int argc, char **argv) @@ -69,7 +60,7 @@ printf("[PPE] Create Task : RenewRepeat\n\n"); repeat = manager->create_task(RENEW_REPEAT); - repeat->set_post(renewRepeat, (void*)manager); + repeat->set_post(renewRepeat, 0, 0); // add Active Queue repeat->spawn(); @@ -92,3 +83,5 @@ return 0; } + +/* end */ diff -r f8d9830d94cd -r 125a72948e44 example/renew_task/ppe/Renew1.cc --- a/example/renew_task/ppe/Renew1.cc Mon Oct 12 21:53:50 2009 +0900 +++ b/example/renew_task/ppe/Renew1.cc Fri Oct 16 17:57:17 2009 +0900 @@ -11,8 +11,17 @@ s->printf("[PPE] ** running Renew1\n"); s->printf("[PPE] Create Task : Renew2\n"); +#if 0 TaskPtr nextTask = s->create_task(RENEW2); s->wait_task(nextTask); +#endif +#if 1 + HTaskPtr nextTask = s->create_task(RENEW2); + nextTask->spawn(); +#endif +#if 1 + s->set_post(task_list[RENEW2].entry,0,0); +#endif s->printf("[PPE] ** finish Renew1\n"); s->printf("\n");