Mercurial > hg > Game > Cerium
changeset 1879:ab37578f03c3 draft
fix speTaskList
author | Shinji KONO <kono@ie.u-ryukyu.ac.jp> |
---|---|
date | Thu, 02 Jan 2014 00:39:41 +0900 |
parents | 11c70b35a83f |
children | a865ba7acb08 |
files | TaskManager/Cell/CellTaskManagerImpl.cc TaskManager/Cell/SpeThreads.cc TaskManager/ChangeLog |
diffstat | 3 files changed, 32 insertions(+), 30 deletions(-) [+] |
line wrap: on
line diff
--- a/TaskManager/Cell/CellTaskManagerImpl.cc Tue Dec 31 20:04:31 2013 +0900 +++ b/TaskManager/Cell/CellTaskManagerImpl.cc Thu Jan 02 00:39:41 2014 +0900 @@ -144,7 +144,7 @@ tl = tl->next; } } - set_taskList(htask, taskListInfo[0+id_offset]); + set_taskList(htask, taskListInfo[0+id_offset]); // send original to SPE_0 } else set_taskList(htask, taskListInfo[speid]); @@ -159,13 +159,13 @@ for (int id = 0; id < machineNum; id++) { mail_check(id); if ((! taskListInfo[id]->empty()) && speTaskList[id]->empty()) { - // SPE に送る TaskList の準備 send_taskList(id); } } } void CellTaskManagerImpl::poll() { + // SPE に送る TaskList の準備 set_runTaskList(activeTaskQueue); // TaskList 待ちの SPE に TaskList を送る sendTaskList(); @@ -267,7 +267,6 @@ while (speThreads->has_mail(id,1,&data)) { if (data == (memaddr) MY_SPE_STATUS_READY) { // MY_SPE_STATUS_READY: SPE が持ってた Task 全て終了 - // freeAll する前に循環リストに戻す spe_running--; // printf("SPE %d status ready, %d running\n",id, spe_running); } else if (data == (memaddr) MY_SPE_COMMAND_MALLOC) { @@ -279,17 +278,20 @@ #ifdef TASK_LIST_MAIL // multi dimensionだったらcount downする TaskListPtr list = (TaskListPtr)data; - if (--list->self->flag.dim_count == 0) { + if (--list->self->flag.dim_count == 0) check_task_list_finish(schedTaskManager, list, waitTaskQueue); - if (speTaskList[id]->getFirst() == list) { - speTaskList[id]->next = list->next; - speTaskList[id]->free_(list); - } - if (taskListInfo[id]->getFirst() == list) { - taskListInfo[id]->next = list->next; - taskListInfo[id]->free_(list); - } - } + if (speTaskList[id]->getFirst() == list) { + speTaskList[id]->next = list->next; + speTaskList[id]->free_(list); + if (! list->next) // make it normal empty cyclic list + speTaskList[id]->next = speTaskList[id]; + } + if (taskListInfo[id]->getFirst() == list) { + taskListInfo[id]->next = list->next; + taskListInfo[id]->free_(list); + if (! list->next) // make it normal empty cyclic list + taskListInfo[id]->next = taskListInfo[id]; + } #else // 終了したタスク(PPEにあるのでアドレス) HTaskPtr task = (HTaskPtr) data; @@ -383,8 +385,8 @@ // printf("SPE %d task list sending\n",id); // speThreads->send_mail(id, 1, p); - int run = speThreads->spawn_task(id, p); - spe_running += run; + speThreads->spawn_task(id, p); + spe_running ++; // printf("SPE %d task list sent\n",id); }
--- a/TaskManager/Cell/SpeThreads.cc Tue Dec 31 20:04:31 2013 +0900 +++ b/TaskManager/Cell/SpeThreads.cc Thu Jan 02 00:39:41 2014 +0900 @@ -103,22 +103,11 @@ } } -void +int SpeThreads::spawn_task(int id, TaskListPtr p) { - - p->self->flag.dim_count = 1; // always dim_count set min cpu. min cpu is 1. - if (p->dim>0 && id >= SPE_0) { - int dim_count = (p->x)*(p->y)*(p->z); - if (cpu_num < dim_count) - dim_count = cpu_num; - } - p->slef->flag.dim_count = dim_count; - for (int i = 0; i < dim_count; i++) { - send_mail(i+SPE_0,1,(memaddr*)p); - } - } else { - send_mail(id ,1,(memaddr*)p); - } + p->cpu = id; + send_mail(id ,1,(memaddr*)p); + return 1; } /**
--- a/TaskManager/ChangeLog Tue Dec 31 20:04:31 2013 +0900 +++ b/TaskManager/ChangeLog Thu Jan 02 00:39:41 2014 +0900 @@ -1,3 +1,14 @@ +2014-1-1 Shinji kONO <kono@ie.u-ryukyu.ac.jp> + + check_task_list_finish は dim_count を見る必要があるが、taskList はcopyされているので、 + dim_count に関係なく削除する必要がある。 + + MY_SPE_STATUS_READY って要らないんじゃないの? Pipeline の邪魔しているだけだし。 + + taskListInfo 側にどんどん足されてしまうので、taskListInfo を早めに送信してしまうのはだめらしい。 + + dead lock の原因は? GPU でも SPU でも起きる。 + 2013-12-27 Masataka Kohagura <kohagura@cr.ie.u-ryukyu.ac.jp> spe側のTaskListのpipelineの間が空いているので、それを埋める必要がある