Mercurial > hg > Members > kono > Cerium
diff TaskManager/Cell/CellTaskManagerImpl.cc @ 637:5530fa36d42e
not yet worked...
author | Shinji KONO <kono@ie.u-ryukyu.ac.jp> |
---|---|
date | Thu, 19 Nov 2009 11:13:42 +0900 |
parents | 8cc609285bbe |
children | 671fca057ad3 |
line wrap: on
line diff
--- a/TaskManager/Cell/CellTaskManagerImpl.cc Wed Nov 18 19:09:40 2009 +0900 +++ b/TaskManager/Cell/CellTaskManagerImpl.cc Thu Nov 19 11:13:42 2009 +0900 @@ -28,6 +28,7 @@ void CellTaskManagerImpl::init() { + spe_running = 0; taskListImpl = new CellTaskListInfo; taskListImpl->init(machineNum*2); @@ -53,9 +54,12 @@ // PPE 側の管理をする Manager ppeManager = new FifoTaskManagerImpl(machineNum); // 大半のTaskQueueInfoは、共有される - ppeManager->init(new MainScheduler, this); + MainScheduler *mscheduler = new MainScheduler; + set_scheduler((Scheduler*)mscheduler); + ppeManager->init(mscheduler, this); ppeManager->get_scheduler()->set_manager(this); + schedTaskManager = new SchedTask(); schedTaskManager->init(0,0,0,ppeManager->get_scheduler()); } @@ -137,6 +141,8 @@ // PPE 側で動く TaskList です // FifoTaskManagerImpl::run と上手く合うように // こんなことやってますよ + // + // 本来は、別 thread で動かすべきだろう... ppeTaskList = ppeManager->get_runTaskList(); if (!ppeTaskList) { goto cont; @@ -146,11 +152,16 @@ // PPE 側の schedule から抜けて来たときに行う // (speThreads で Blocking Mailbox read と // セマフォとか使ってやってもいいが、今はこの方式で) + // + // すべてのspe task が finish task を待つ場合は、ppeTaskList の + // 判定だけで十分だが、そうでない場合は、spe の task が残っているか + // どうかを調べる必要がある。 + // do { ppeMail = ppeManager->schedule(ppeTaskList); cont: ppeTaskList = mail_check(ppeMail); - } while (ppeTaskList); + } while (ppeTaskList || spe_running >0); } /** @@ -187,6 +198,7 @@ if (data == (memaddr)MY_SPE_STATUS_READY) { //__debug_ppe("[SPE %d] finish\n", id); flag_sendTaskList[id] = 1; + spe_running--; } else if (data == (memaddr)MY_SPE_COMMAND_MALLOC) { //__debug_ppe("[PPE] MALLOC COMMAND from [SPE %d]\n", id); @@ -235,6 +247,7 @@ for (int i = 0; i < machineNum; i++) { if (flag_sendTaskList[i] == 1 && speTaskList_bg[i]->length >= 1 ) { send_taskList(i); + spe_running++; } } @@ -272,7 +285,7 @@ flag_sendTaskList[id] = 0; } - +#if 0 void* CellTaskManagerImpl::allocate(int size, int alignment) { @@ -301,6 +314,7 @@ { return ppeManager->get_scheduler(); } +#endif #ifdef __CERIUM_CELL__ TaskManagerImpl*