changeset 853:fc521121ca8a

fix
author game@zeus.cr.ie.u-ryukyu.ac.jp
date Wed, 09 Jun 2010 10:33:24 +0900
parents 5389de58734f
children 6aa20c0dd8f8
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 &#x3067;&#x66f8;&#x304d;&#x76f4;&#x3059;"/>
 </node>
 <node CREATED="1274590776014" ID="Freemind_Link_1512564455" MODIFIED="1274590781674" TEXT="DrawSpan">
-<node CREATED="1274591872323" ID="Freemind_Link_694643331" MODIFIED="1274591883214" TEXT="Task Array &#x3067;&#x66f8;&#x304d;&#x76f4;&#x3059;"/>
+<node CREATED="1274591872323" ID="Freemind_Link_694643331" MODIFIED="1274782798929" TEXT="Task Array &#x3067;&#x66f8;&#x304d;&#x76f4;&#x3059;">
+<icon BUILTIN="ksmiletris"/>
+</node>
 </node>
 </node>
 <node CREATED="1271152865996" ID="Freemind_Link_1369046890" MODIFIED="1274591464598" TEXT="ppu &#x306e; multi threads &#x5316;">
@@ -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="&#x3068;&#x308a;&#x3042;&#x3048;&#x305a;FifoManager &#x3067;&#x52d5;&#x304b;&#x3059;"/>
 </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(); 
 }
 
--- 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);