# HG changeset patch # User Shinji KONO # Date 1280562250 -32400 # Node ID 0d404f6c36a8d82a53deed3c9686b2c56481a40a # Parent 9cfac2e8fc2e706bf005035067f50150169eb472 unknown dead lock still... diff -r 9cfac2e8fc2e -r 0d404f6c36a8 TaskManager/Cell/CellTaskManagerImpl.cc --- a/TaskManager/Cell/CellTaskManagerImpl.cc Sat Jul 31 12:18:19 2010 +0900 +++ b/TaskManager/Cell/CellTaskManagerImpl.cc Sat Jul 31 16:44:10 2010 +0900 @@ -71,8 +71,7 @@ // SPE_ANY が指定されていた時に // これをインクリメントしつつ呼ぶことにする。 -// 乱数使ってもいいけどさ。 -int cur_anySpeid = 0; +unsigned int cur_anySpeid = 0; /** * ActiveTaskQueue から Task を @@ -90,23 +89,14 @@ if (htask->cpu_type == SPE_ANY) { speid = cur_anySpeid++; - cur_anySpeid = (cur_anySpeid < machineNum) - ? cur_anySpeid : 0; } else { // -1 してるのは // htask->cpu_type - CPU_SPE で // SPE0 = 1, SPE1 = 2, ... SPE5 = 6 ってなってるので // 配列的 (SPE0 = arr[0], SPE1 = arr[1]) にするため speid = htask->cpu_type - CPU_SPE - 1; - - // SPU の数以上が指定されていれば - // とりあえず MAX_USE_SPE_NUM (実際に動く SPE の最大数) で - // あまり求めてそれを使うことにする。 - // ここで判定するもんでもないか? - if (speid >= machineNum) { - speid %= machineNum; - } } + speid %= machineNum; set_taskList(htask, taskListInfo[speid]); } } @@ -179,7 +169,9 @@ if (w) { for( TaskQueue *q = w->getFirst(); q; q = w->getNext(q)) { printf(" waiting task%d %lx",q->task->command, (long)q->task); - if (!waitTaskQueue->find(q->task)) printf("!"); // stray task + if (!waitTaskQueue->find(q->task)) { + printf("!"); // stray task + } loop_check(q->task,p, 10); } } diff -r 9cfac2e8fc2e -r 0d404f6c36a8 TaskManager/ChangeLog --- a/TaskManager/ChangeLog Sat Jul 31 12:18:19 2010 +0900 +++ b/TaskManager/ChangeLog Sat Jul 31 16:44:10 2010 +0900 @@ -1,3 +1,13 @@ +2010-7-31 Shinji KONO + + なんと、simple task を SchedTaskManager 経由で作ると、 + PPE task しか作れなくなっていたらしい。それな遅いよ。 + SchedTaskManagerのtask managerがFifoManagerだったのが + 原因。CellTaskManager を使う時には、FifoManagerは消せる? + + その代わり、dead lock が起きる。待ち先のtaskが消滅する場合が + あるらしい。 + 2010-7-30 Shinji KONO TASK_LIST_MAIL でない方が高速なみたい diff -r 9cfac2e8fc2e -r 0d404f6c36a8 TaskManager/kernel/ppe/TaskManagerImpl.cc --- a/TaskManager/kernel/ppe/TaskManagerImpl.cc Sat Jul 31 12:18:19 2010 +0900 +++ b/TaskManager/kernel/ppe/TaskManagerImpl.cc Sat Jul 31 16:44:10 2010 +0900 @@ -147,6 +147,20 @@ task->cpu_type = type; } +#if 0 +static void +check_wait(TaskManagerImpl *tm, TaskQueueInfo *wait_i) { + for(TaskQueue *t = wait_i->getFirst(); t; t = wait_i->getNext(t)) { + if (!tm->waitTaskQueue->find(t->task)) { + printf("stray waiting task%d %lx\n",t->task->command, (long)t->task); + } else if (tm->activeTaskQueue->find(t->task)) { + printf(" active task%d in waiting queue %lx\n",t->task->command, (long)t->task); + } else + printf("."); + } +} +#endif + /** * @brief 終了したタスクから依存の処理とか * post_func() はこのタスクが終了したら実行する関数。 @@ -156,9 +170,6 @@ void TaskManagerImpl::check_task_finish(HTaskPtr me, HTaskInfo *wait_queue) { - if (me->self == 0) - printf(" wait for zombi! %ld\n",(long)me); - while(TaskQueue *p = me->wait_me->poll()) { HTaskPtr you = p->task; TaskQueueInfo *wait_i = you->wait_i; @@ -172,7 +183,7 @@ append_activeTask(you); } - wait_i->free_(p); + wait_i->free_(p); // p->wait_i, p->wait_me は再利用される } // me を誰かが持っていて、me が finish した後に、 diff -r 9cfac2e8fc2e -r 0d404f6c36a8 example/many_task/ppe/QuickSort.cc --- a/example/many_task/ppe/QuickSort.cc Sat Jul 31 12:18:19 2010 +0900 +++ b/example/many_task/ppe/QuickSort.cc Sat Jul 31 16:44:10 2010 +0900 @@ -27,7 +27,7 @@ Data *w_data = (Data*)wbuff; #endif #else - int end = (long)s->get_param(0); + int end = (int)s->get_param(0); DataPtr r_data = (DataPtr)s->get_input(0); #ifdef USE_MEMCPY DataPtr w_data = (DataPtr)s->get_output(0); diff -r 9cfac2e8fc2e -r 0d404f6c36a8 example/many_task/sort.cc --- a/example/many_task/sort.cc Sat Jul 31 12:18:19 2010 +0900 +++ b/example/many_task/sort.cc Sat Jul 31 16:44:10 2010 +0900 @@ -4,14 +4,13 @@ #include "Func.h" #include -static void sort_start(SchedTask *); extern void check_data(); +extern int all; // allocate task at once -static DataPtr data; -static int data_length; -static int cpuNum; - -extern int all; +static void sort_start(SchedTask *); +static int data_length; +static int cpuNum; +static int split_num; /** * 一つの block にある data の数が MAX_BLOCK_SIZE 超えないような @@ -37,10 +36,10 @@ } -HTaskPtr *fsort; -HTaskPtr *bsort; -int split_num; +static HTaskPtr *fsort; +static HTaskPtr *bsort; +static DataPtr data; /** * btask が全て終了したら、再び sort_start を実行する @@ -218,27 +217,25 @@ } } - HTask *restart = manager->create_task(RESTART,0,0,0,0); + HTaskPtr restart = manager->create_task(RESTART,0,0,0,0); for (int i = 0; i < split_num; i++) { if (!all) restart->wait_for(fsort[i]); fsort[i]->spawn(); } restart->spawn(); +} -} #endif void check_data() { - int flag = 1; for(int i=0; i< data_length-1;i++) { if (data[i].index>data[i+1].index) { printf("Data are not sorted at %d. %d > %d \n",i, data[i].index,data[i+1].index); - flag = 0; - break; + return; } } - if (flag) printf("Data are sorted\n"); + printf("Data are sorted\n"); } diff -r 9cfac2e8fc2e -r 0d404f6c36a8 example/many_task/spe/QuickSort.cc --- a/example/many_task/spe/QuickSort.cc Sat Jul 31 12:18:19 2010 +0900 +++ b/example/many_task/spe/QuickSort.cc Sat Jul 31 16:44:10 2010 +0900 @@ -27,7 +27,7 @@ Data *w_data = (Data*)wbuff; #endif #else - int end = (long)s->get_param(0); + int end = (int)s->get_param(0); DataPtr r_data = (DataPtr)s->get_input(0); #ifdef USE_MEMCPY DataPtr w_data = (DataPtr)s->get_output(0);