Mercurial > hg > Game > Cerium
changeset 853:0718a4e40450 draft
fix
author | game@zeus.cr.ie.u-ryukyu.ac.jp |
---|---|
date | Wed, 09 Jun 2010 10:33:24 +0900 |
parents | 0729db4d99fe |
children | 293fcceaac36 |
files | Document/Cerium2010.mm TaskManager/Cell/CellTaskManagerImpl.cc TaskManager/Fifo/FifoTaskManagerImpl.cc TaskManager/kernel/ppe/TaskListInfo.cc TaskManager/kernel/ppe/TaskManagerImpl.cc TaskManager/kernel/ppe/TaskQueue.h |
diffstat | 6 files changed, 42 insertions(+), 11 deletions(-) [+] |
line wrap: on
line diff
--- a/Document/Cerium2010.mm Mon Jun 07 15:07:30 2010 +0900 +++ b/Document/Cerium2010.mm Wed Jun 09 10:33:24 2010 +0900 @@ -46,7 +46,9 @@ <node CREATED="1274590806277" ID="Freemind_Link_956150988" MODIFIED="1274590821313" TEXT="get_segment で書き直す"/> </node> <node CREATED="1274590776014" ID="Freemind_Link_1512564455" MODIFIED="1274590781674" TEXT="DrawSpan"> -<node CREATED="1274591872323" ID="Freemind_Link_694643331" MODIFIED="1274591883214" TEXT="Task Array で書き直す"/> +<node CREATED="1274591872323" ID="Freemind_Link_694643331" MODIFIED="1274782798929" TEXT="Task Array で書き直す"> +<icon BUILTIN="ksmiletris"/> +</node> </node> </node> <node CREATED="1271152865996" ID="Freemind_Link_1369046890" MODIFIED="1274591464598" TEXT="ppu の multi threads 化"> @@ -169,7 +171,8 @@ <icon BUILTIN="full-2"/> <icon BUILTIN="full-1"/> <icon BUILTIN="full-3"/> -<node CREATED="1271153732060" ID="Freemind_Link_1208701551" MODIFIED="1271153747479" TEXT="super dandy"> +<node CREATED="1271153732060" ID="Freemind_Link_1208701551" MODIFIED="1274782926740" TEXT="super dandy"> +<icon BUILTIN="ksmiletris"/> <node CREATED="1271153867093" ID="Freemind_Link_933024710" MODIFIED="1271154718432" TEXT="scale"/> <node CREATED="1274590639383" ID="Freemind_Link_1328300488" MODIFIED="1274590660969" TEXT="とりあえずFifoManager で動かす"/> </node>
--- a/TaskManager/Cell/CellTaskManagerImpl.cc Mon Jun 07 15:07:30 2010 +0900 +++ b/TaskManager/Cell/CellTaskManagerImpl.cc Wed Jun 09 10:33:24 2010 +0900 @@ -25,15 +25,17 @@ { spe_running = 0; + // 実行可能な HTask のリスト。 FifoTaskManager と共有される activeTaskQueue = new HTaskInfo(); - + // HTask の factory。 HTaskInfo ならなんでもいい。 htaskImpl = activeTaskQueue ; // any HTaskInfo - + speThreads = new SpeThreads(machineNum); speThreads->init(); - speTaskList = new TaskListInfoPtr[machineNum]; - taskListInfo = new TaskListInfoPtr[machineNum]; + // 実行される Task 用の パイプライン用のダブルバッファ + speTaskList = new TaskListInfoPtr[machineNum]; // spe上の走っている Task の配列 + taskListInfo = new TaskListInfoPtr[machineNum]; // 次に走る Task の配列 for (int i = 0; i < machineNum; i++) { taskListInfo[i] = new TaskListInfo(); @@ -44,10 +46,13 @@ ppeManager = new FifoTaskManagerImpl(machineNum); // 大半のTaskQueueInfoは、共有される MainScheduler *mscheduler = new MainScheduler; - ppeManager->init(mscheduler, this); + ppeManager->init(mscheduler, this); // ここで HTaskInfo が共有される。 ppeManager->get_scheduler()->set_manager(this); + // Task 内からManager->task_create() とかするときに必要なTaskManager。 + // 現状では ppe 側からしか動かない + // spe 側から Task create できない schedTaskManager = new SchedTask(); schedTaskManager->init(0,0,0,ppeManager->get_scheduler()); } @@ -134,8 +139,8 @@ // SPE side do { poll(); - } while (ppeManager->activeTaskQueue->empty() && spe_running >0 ); - } while (!ppeManager->activeTaskQueue->empty() || spe_running >0); + } while (activeTaskQueue->empty() && spe_running >0 ); + } while (!activeTaskQueue->empty() || spe_running >0); if (!waitTaskQueue->empty()) { get_scheduler()->printf("Dead lock detected\n"); } @@ -155,6 +160,8 @@ while (speThreads->has_mail(id, 1, &data)) { if (data == (memaddr)MY_SPE_STATUS_READY) { // MY_SPE_STATUS_READY: SPE が持ってた Task 全て終了 + // freeAll する前に循環リストに戻す + speTaskList[id]->getLast()->next = speTaskList[id]; speTaskList[id]->freeAll(); spe_running--; } else if (data == (memaddr)MY_SPE_COMMAND_MALLOC) { @@ -223,10 +230,15 @@ CellTaskManagerImpl::send_taskList(int id) { if (taskListInfo[id]->empty()) return; + // speTaskList は走り終わった ppe の Task の List. + // taskListInfo はこれから走る Task の List. + // 交換して実行する TaskListInfoPtr tmp = taskListInfo[id]; taskListInfo[id] = speTaskList[id]; speTaskList[id] = tmp; + // speTaskList は本来は循環リストなのだけど、実行中は線形リストである。 + // spe の Task が終了した時点でなおす。 tmp->getLast()->next = 0; TaskListPtr p = tmp->getFirst(); speThreads->send_mail(id, 1, (memaddr *)&p);
--- a/TaskManager/Fifo/FifoTaskManagerImpl.cc Mon Jun 07 15:07:30 2010 +0900 +++ b/TaskManager/Fifo/FifoTaskManagerImpl.cc Wed Jun 09 10:33:24 2010 +0900 @@ -22,9 +22,9 @@ } /** + * FifoTaskManager 単独で走るときの初期化 * MailManager は PPE スケジューラとのメール交換、 * FifoScheduler は PPE 側のスケジューラ - * BufferManager は Task、TaskList などのメモリ管理(大層なことしてないが */ void FifoTaskManagerImpl::init() @@ -124,9 +124,14 @@ FifoTaskManagerImpl::sendTaskList() { if (taskListInfo->empty()) return; + // ppeTaskList は走り終わった ppe の Task の List. + // taskListInfo はこれから走る Task の List. + // 交換して実行する TaskListInfoPtr tmp = ppeTaskList; ppeTaskList = taskListInfo; taskListInfo = tmp; + // ppeTaskList は本来は循環リストなのだけど、実行中は線形リストである。 + // なので、最後に 0 を代入する. 後でなおす。 ppeTaskList->getLast()->next = 0; // TaskList のアドレスを送る mainScheduler->mail_write_from_host((memaddr)ppeTaskList->getFirst()); @@ -138,6 +143,9 @@ // scheduler は受け取ったメールを元に実行する mainScheduler->run(new SchedNop()); // すべてのlistを実行するまで戻らない + + ppeTaskList->getLast()->next = ppeTaskList; + } /**
--- a/TaskManager/kernel/ppe/TaskListInfo.cc Mon Jun 07 15:07:30 2010 +0900 +++ b/TaskManager/kernel/ppe/TaskListInfo.cc Wed Jun 09 10:33:24 2010 +0900 @@ -73,7 +73,7 @@ TaskListInfo::freeAll() { TaskListPtr t; - if (getLast()->next==0) getLast()->next = this; + //if (getLast()->next==0) getLast()->next = this; while((t=poll())) free_(t); }
--- a/TaskManager/kernel/ppe/TaskManagerImpl.cc Mon Jun 07 15:07:30 2010 +0900 +++ b/TaskManager/kernel/ppe/TaskManagerImpl.cc Wed Jun 09 10:33:24 2010 +0900 @@ -19,9 +19,13 @@ TaskManagerImpl::TaskManagerImpl(int num) : machineNum(num){ + // 実行可能なHTaskのリスト activeTaskQueue = new HTaskInfo(); + // wait_forで止まっているHTaskのリスト。必要ないが、Dead lock detection に使う waitTaskQueue = new HTaskInfo(); + // HTask の factory. HTaskInfo ならなんでもいい。 htaskImpl = waitTaskQueue ; // any HTaskInfo + // Task の dependency を表現する double linked list. HTaskInfo とは別に必要。 taskQueueImpl = new TaskQueueInfo(); }