changeset 1879:ab37578f03c3 draft

fix speTaskList
author Shinji KONO <kono@ie.u-ryukyu.ac.jp>
date Thu, 02 Jan 2014 00:39:41 +0900
parents 11c70b35a83f
children a865ba7acb08
files TaskManager/Cell/CellTaskManagerImpl.cc TaskManager/Cell/SpeThreads.cc TaskManager/ChangeLog
diffstat 3 files changed, 32 insertions(+), 30 deletions(-) [+]
line wrap: on
line diff
--- a/TaskManager/Cell/CellTaskManagerImpl.cc	Tue Dec 31 20:04:31 2013 +0900
+++ b/TaskManager/Cell/CellTaskManagerImpl.cc	Thu Jan 02 00:39:41 2014 +0900
@@ -144,7 +144,7 @@
                         tl = tl->next;
                     }
                 }
-                set_taskList(htask, taskListInfo[0+id_offset]);
+                set_taskList(htask, taskListInfo[0+id_offset]); // send  original to SPE_0
             } else
                 set_taskList(htask, taskListInfo[speid]);
             
@@ -159,13 +159,13 @@
     for (int id = 0; id < machineNum; id++) {
         mail_check(id);
         if ((! taskListInfo[id]->empty()) && speTaskList[id]->empty()) {
-            // SPE に送る TaskList の準備
             send_taskList(id);
         }
     }
 }
 
 void CellTaskManagerImpl::poll() {
+    // SPE に送る TaskList の準備
     set_runTaskList(activeTaskQueue);
     // TaskList 待ちの SPE に TaskList を送る
     sendTaskList();
@@ -267,7 +267,6 @@
      while (speThreads->has_mail(id,1,&data)) {
         if (data == (memaddr) MY_SPE_STATUS_READY) {
             //  MY_SPE_STATUS_READY: SPE が持ってた Task 全て終了
-            // freeAll する前に循環リストに戻す
             spe_running--;
             // printf("SPE %d status ready, %d running\n",id, spe_running);
         } else if (data == (memaddr) MY_SPE_COMMAND_MALLOC) {
@@ -279,17 +278,20 @@
 #ifdef TASK_LIST_MAIL
             // multi dimensionだったらcount downする 
             TaskListPtr list = (TaskListPtr)data;
-            if (--list->self->flag.dim_count == 0) {
+            if (--list->self->flag.dim_count == 0) 
                 check_task_list_finish(schedTaskManager, list, waitTaskQueue);
-		if (speTaskList[id]->getFirst() == list) {
-		    speTaskList[id]->next = list->next;
-		    speTaskList[id]->free_(list);
-		}
-		if (taskListInfo[id]->getFirst() == list) {
-		    taskListInfo[id]->next = list->next;
-		    taskListInfo[id]->free_(list);
-		}
-	    }
+            if (speTaskList[id]->getFirst() == list) {
+                speTaskList[id]->next = list->next;
+                speTaskList[id]->free_(list);
+                if (! list->next)   // make it normal empty cyclic list
+                    speTaskList[id]->next = speTaskList[id];
+            }
+            if (taskListInfo[id]->getFirst() == list) {
+                taskListInfo[id]->next = list->next;
+                taskListInfo[id]->free_(list);
+                if (! list->next)   // make it normal empty cyclic list
+                    taskListInfo[id]->next = taskListInfo[id];
+            }
 #else
             // 終了したタスク(PPEにあるのでアドレス)
             HTaskPtr task = (HTaskPtr) data;
@@ -383,8 +385,8 @@
     // printf("SPE %d task list sending\n",id);
 
     // speThreads->send_mail(id, 1, p);
-    int run = speThreads->spawn_task(id, p);
-    spe_running += run;
+    speThreads->spawn_task(id, p);
+    spe_running ++;
     // printf("SPE %d task list sent\n",id);
 }
 
--- a/TaskManager/Cell/SpeThreads.cc	Tue Dec 31 20:04:31 2013 +0900
+++ b/TaskManager/Cell/SpeThreads.cc	Thu Jan 02 00:39:41 2014 +0900
@@ -103,22 +103,11 @@
     }
 }
 
-void
+int
 SpeThreads::spawn_task(int id, TaskListPtr p) {
-
-    p->self->flag.dim_count = 1; // always dim_count set min cpu. min cpu is 1.
-    if (p->dim>0 && id >= SPE_0) {
-        int dim_count = (p->x)*(p->y)*(p->z);
-        if (cpu_num < dim_count)
-            dim_count = cpu_num;
-        }
-        p->slef->flag.dim_count = dim_count;
-        for (int i = 0; i < dim_count; i++) {
-            send_mail(i+SPE_0,1,(memaddr*)p);
-        }
-    } else {
-        send_mail(id ,1,(memaddr*)p);
-    }
+    p->cpu = id;
+    send_mail(id ,1,(memaddr*)p);
+    return 1;
 }
 
 /**
--- a/TaskManager/ChangeLog	Tue Dec 31 20:04:31 2013 +0900
+++ b/TaskManager/ChangeLog	Thu Jan 02 00:39:41 2014 +0900
@@ -1,3 +1,14 @@
+2014-1-1 Shinji kONO <kono@ie.u-ryukyu.ac.jp>
+
+	check_task_list_finish は dim_count を見る必要があるが、taskList はcopyされているので、
+	dim_count に関係なく削除する必要がある。
+
+	MY_SPE_STATUS_READY って要らないんじゃないの? Pipeline の邪魔しているだけだし。
+
+	taskListInfo 側にどんどん足されてしまうので、taskListInfo を早めに送信してしまうのはだめらしい。
+
+	dead lock の原因は? GPU でも SPU でも起きる。
+
 2013-12-27 Masataka Kohagura <kohagura@cr.ie.u-ryukyu.ac.jp>
 
 	spe側のTaskListのpipelineの間が空いているので、それを埋める必要がある