Mercurial > hg > Game > Cerium
diff TaskManager/Cell/CellTaskManagerImpl.cc @ 808:3c404a32719c draft
TaskListInfo version
author | Shinji KONO <kono@ie.u-ryukyu.ac.jp> |
---|---|
date | Sat, 22 May 2010 22:32:41 +0900 |
parents | fb49e881f2ed |
children | 13c736659c63 |
line wrap: on
line diff
--- a/TaskManager/Cell/CellTaskManagerImpl.cc Sat May 22 18:21:13 2010 +0900 +++ b/TaskManager/Cell/CellTaskManagerImpl.cc Sat May 22 22:32:41 2010 +0900 @@ -17,13 +17,6 @@ { delete speThreads; delete [] speTaskList; - delete [] speTaskList_bg; - /** - * bufferManager は - * ppeManager のなかで delete してもらう - */ - // delete bufferManager; - delete [] flag_sendTaskList; delete ppeManager; } @@ -33,7 +26,7 @@ { spe_running = 0; taskListImpl = new CellTaskListInfo; - taskListImpl->init(16); + activeTaskQueue = new HTaskInfo(); @@ -42,18 +35,12 @@ speThreads = new SpeThreads(machineNum); speThreads->init(); - speTaskList = new TaskListPtr[machineNum]; - speTaskList_bg = new TaskListPtr[machineNum]; + speTaskList = new TaskListInfoPtr[machineNum]; for (int i = 0; i < machineNum; i++) { - speTaskList[i] = taskListImpl->create(); - speTaskList_bg[i] = taskListImpl->create(); + speTaskList[i] = new TaskListInfo(); } - flag_sendTaskList = new int[machineNum]; - for (int i = 0; i < machineNum; i++) { - flag_sendTaskList[i] = 1; - } // PPE 側の管理をする Manager ppeManager = new FifoTaskManagerImpl(machineNum); // 大半のTaskQueueInfoは、共有される @@ -114,9 +101,7 @@ speid %= machineNum; } } - - TaskListInfoPtr list = speTaskList_bg[speid]; - set_taskList(htask, list); + set_taskList(htask, taskListInfo[speid]); } } @@ -124,7 +109,7 @@ CellTaskManagerImpl::sendTaskList() { for (int i = 0; i < machineNum; i++) { - if (flag_sendTaskList[i] == 1 && speTaskList_bg[i]->length >= 1 ) { + if ( taskListInfo[i]->length() > 0 ) { send_taskList(i); spe_running++; } @@ -132,25 +117,26 @@ } void +CellTaskManagerImpl::poll() +{ + mail_check(); + // SPE に送る TaskList の準備 + set_runTaskList(); + // TaskList 待ちの SPE に TaskList を送る + sendTaskList(); +} + +void CellTaskManagerImpl::run() { - TaskListPtr ppeTaskList = NULL; - do { // PPE side - ppeTaskList = ppeManager->set_runTaskList(); - if (ppeTaskList) - ppeManager->sendTaskList(ppeTaskList); - ppeManager->mail_check(); + ppeManager->poll(); // SPE side do { - mail_check(); - // SPE に送る TaskList の準備 - set_runTaskList(); - // TaskList 待ちの SPE に TaskList を送る - sendTaskList(); + poll(); } while (ppeManager->activeTaskQueue->empty() && spe_running >0 ); - } while (ppeTaskList || spe_running >0); + } while (!ppeManager->taskListInfo->empty() || spe_running >0); if (!waitTaskQueue->empty()) { get_scheduler()->printf("Dead lock detected\n"); } @@ -170,7 +156,7 @@ while (speThreads->has_mail(id, 1, &data)) { if (data == (memaddr)MY_SPE_STATUS_READY) { // MY_SPE_STATUS_READY: SPE が持ってた Task 全て終了 - flag_sendTaskList[id] = 1; + speTaskList[id]->freeAll(); spe_running--; } else if (data == (memaddr)MY_SPE_COMMAND_MALLOC) { // MY_SPE_COMMAND_MALLOC SPE からのmain memory request @@ -218,22 +204,18 @@ * 条件1. SPE が持ってた TaskList を終了して、次の TaskList を待ってる * 条件2. SPE に送る TaskList に Task がある * - * SPE で実行終了した TaskList [speTaskList] と - * これから実行する TaskList [speTaskList_bg] のバッファを入れ替える - * ついでに実行終了したやつは clear しておく。 + * SPE で実行終了した speTaskList と + * これから実行する taskListInfo のバッファを入れ替える */ void CellTaskManagerImpl::send_taskList(int id) { - TaskListPtr tmp; + if (taskListInfo[id]->empty()) return; + TaskListInfoPtr tmp = taskListInfo[id]; + taskListInfo[id] = speTaskList[id]; + speTaskList[id] = tmp; - tmp = speTaskList[id]; - speTaskList[id] = speTaskList_bg[id]; - speTaskList_bg[id] = tmp; - - taskListImpl->clear_taskList(speTaskList_bg[id]); - - speThreads->send_mail(id, 1, (memaddr *)&speTaskList[id]); + speThreads->send_mail(id, 1, (memaddr *)tmp->getFirst()); } void CellTaskManagerImpl::show_profile() {