# HG changeset patch # User game@zeus.cr.ie.u-ryukyu.ac.jp # Date 1276047204 -32400 # Node ID fc521121ca8a5414fca3953399d057e434b81ada # Parent 5389de58734f0239922e6b80dd2c6c04d5c2bdc3 fix diff -r 5389de58734f -r fc521121ca8a Document/Cerium2010.mm --- 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 @@ - + + + @@ -169,7 +171,8 @@ - + + diff -r 5389de58734f -r fc521121ca8a TaskManager/Cell/CellTaskManagerImpl.cc --- 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); diff -r 5389de58734f -r fc521121ca8a TaskManager/Fifo/FifoTaskManagerImpl.cc --- 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; + } /** diff -r 5389de58734f -r fc521121ca8a TaskManager/kernel/ppe/TaskListInfo.cc --- 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); } diff -r 5389de58734f -r fc521121ca8a TaskManager/kernel/ppe/TaskManagerImpl.cc --- 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(); } diff -r 5389de58734f -r fc521121ca8a TaskManager/kernel/ppe/TaskQueue.h --- a/TaskManager/kernel/ppe/TaskQueue.h Mon Jun 07 15:07:30 2010 +0900 +++ b/TaskManager/kernel/ppe/TaskQueue.h Wed Jun 09 10:33:24 2010 +0900 @@ -6,6 +6,10 @@ class HTask; class TaskQueue { + + /** + HTask 間の dependency を表すリスト。HTask の wait_me と wait_i がこれ。 + */ public: TaskQueue(HTask *q = NULL);