diff TaskManager/Cell/CellTaskManagerImpl.cc @ 637:5530fa36d42e

not yet worked...
author Shinji KONO <kono@ie.u-ryukyu.ac.jp>
date Thu, 19 Nov 2009 11:13:42 +0900
parents 8cc609285bbe
children 671fca057ad3
line wrap: on
line diff
--- a/TaskManager/Cell/CellTaskManagerImpl.cc	Wed Nov 18 19:09:40 2009 +0900
+++ b/TaskManager/Cell/CellTaskManagerImpl.cc	Thu Nov 19 11:13:42 2009 +0900
@@ -28,6 +28,7 @@
 void
 CellTaskManagerImpl::init()
 {
+    spe_running = 0;
     taskListImpl = new CellTaskListInfo;
     taskListImpl->init(machineNum*2);
 
@@ -53,9 +54,12 @@
     // PPE 側の管理をする Manager
     ppeManager = new FifoTaskManagerImpl(machineNum);
     // 大半のTaskQueueInfoは、共有される
-    ppeManager->init(new MainScheduler, this);
+    MainScheduler *mscheduler = new MainScheduler;
+    set_scheduler((Scheduler*)mscheduler);
+    ppeManager->init(mscheduler, this);
     
     ppeManager->get_scheduler()->set_manager(this);
+
     schedTaskManager = new SchedTask();
     schedTaskManager->init(0,0,0,ppeManager->get_scheduler());
 }
@@ -137,6 +141,8 @@
     // PPE 側で動く TaskList です
     // FifoTaskManagerImpl::run と上手く合うように
     // こんなことやってますよ
+    //
+    // 本来は、別 thread で動かすべきだろう...
     ppeTaskList = ppeManager->get_runTaskList();
     if (!ppeTaskList) {
 	goto cont;
@@ -146,11 +152,16 @@
     // PPE 側の schedule から抜けて来たときに行う
     // (speThreads で Blocking Mailbox read と
     // セマフォとか使ってやってもいいが、今はこの方式で)
+    //
+    // すべてのspe task が finish task を待つ場合は、ppeTaskList の
+    // 判定だけで十分だが、そうでない場合は、spe の task が残っているか
+    // どうかを調べる必要がある。
+    //
     do {
 	ppeMail = ppeManager->schedule(ppeTaskList);
     cont:
 	ppeTaskList = mail_check(ppeMail);
-    } while (ppeTaskList);
+    } while (ppeTaskList || spe_running >0);
 }
 
 /**
@@ -187,6 +198,7 @@
 		if (data == (memaddr)MY_SPE_STATUS_READY) {
 		    //__debug_ppe("[SPE %d] finish\n", id);
 		    flag_sendTaskList[id] = 1;
+		    spe_running--;
 		} else if (data == (memaddr)MY_SPE_COMMAND_MALLOC) {
 		    //__debug_ppe("[PPE] MALLOC COMMAND from [SPE %d]\n", id);
 
@@ -235,6 +247,7 @@
 	for (int i = 0; i < machineNum; i++)  {
 	    if (flag_sendTaskList[i] == 1 && speTaskList_bg[i]->length >= 1 ) {
 		send_taskList(i);
+		spe_running++;
 	    }
 	}
 
@@ -272,7 +285,7 @@
     flag_sendTaskList[id] = 0;
 }
 
-
+#if 0
 void*
 CellTaskManagerImpl::allocate(int size, int alignment)
 {
@@ -301,6 +314,7 @@
 {
     return ppeManager->get_scheduler();
 }
+#endif
 
 #ifdef __CERIUM_CELL__
 TaskManagerImpl*