changeset 940:0d404f6c36a8

unknown dead lock still...
author Shinji KONO <kono@ie.u-ryukyu.ac.jp>
date Sat, 31 Jul 2010 16:44:10 +0900
parents 9cfac2e8fc2e
children 0c11c2fd7e63
files TaskManager/Cell/CellTaskManagerImpl.cc TaskManager/ChangeLog TaskManager/kernel/ppe/TaskManagerImpl.cc example/many_task/ppe/QuickSort.cc example/many_task/sort.cc example/many_task/spe/QuickSort.cc
diffstat 6 files changed, 44 insertions(+), 34 deletions(-) [+]
line wrap: on
line diff
--- a/TaskManager/Cell/CellTaskManagerImpl.cc	Sat Jul 31 12:18:19 2010 +0900
+++ b/TaskManager/Cell/CellTaskManagerImpl.cc	Sat Jul 31 16:44:10 2010 +0900
@@ -71,8 +71,7 @@
 
 // SPE_ANY が指定されていた時に
 // これをインクリメントしつつ呼ぶことにする。
-// 乱数使ってもいいけどさ。
-int cur_anySpeid = 0;
+unsigned int cur_anySpeid = 0;
 
 /**
  * ActiveTaskQueue から Task を
@@ -90,23 +89,14 @@
 
 	if (htask->cpu_type == SPE_ANY) {
 	    speid = cur_anySpeid++;
-	    cur_anySpeid = (cur_anySpeid < machineNum)
-		? cur_anySpeid : 0;
 	} else {
 	    // -1 してるのは
 	    // htask->cpu_type - CPU_SPE で
 	    // SPE0 = 1, SPE1 = 2, ... SPE5 = 6 ってなってるので
 	    // 配列的 (SPE0 = arr[0], SPE1 = arr[1]) にするため
 	    speid = htask->cpu_type - CPU_SPE - 1;
-
-	    // SPU の数以上が指定されていれば
-	    // とりあえず MAX_USE_SPE_NUM (実際に動く SPE の最大数) で
-	    // あまり求めてそれを使うことにする。
-	    // ここで判定するもんでもないか?
-	    if (speid >= machineNum) {
-		speid %= machineNum;
-	    }
 	}
+	speid %= machineNum;
 	set_taskList(htask, taskListInfo[speid]);
     }
 }
@@ -179,7 +169,9 @@
 	if (w) {
 	    for( TaskQueue *q = w->getFirst(); q; q = w->getNext(q)) {
 		printf("    waiting task%d %lx",q->task->command, (long)q->task);
-		if (!waitTaskQueue->find(q->task)) printf("!"); // stray task
+		if (!waitTaskQueue->find(q->task)) {
+		    printf("!"); // stray task
+		}
 		loop_check(q->task,p, 10);
 	    }
 	}
--- a/TaskManager/ChangeLog	Sat Jul 31 12:18:19 2010 +0900
+++ b/TaskManager/ChangeLog	Sat Jul 31 16:44:10 2010 +0900
@@ -1,3 +1,13 @@
+2010-7-31 Shinji KONO <kono@ie.u-ryukyu.ac.jp>
+
+   なんと、simple task を SchedTaskManager 経由で作ると、
+   PPE task しか作れなくなっていたらしい。それな遅いよ。
+   SchedTaskManagerのtask managerがFifoManagerだったのが
+   原因。CellTaskManager を使う時には、FifoManagerは消せる?
+
+   その代わり、dead lock が起きる。待ち先のtaskが消滅する場合が
+   あるらしい。
+
 2010-7-30 Shinji KONO <kono@ie.u-ryukyu.ac.jp>
 
    TASK_LIST_MAIL でない方が高速なみたい
--- a/TaskManager/kernel/ppe/TaskManagerImpl.cc	Sat Jul 31 12:18:19 2010 +0900
+++ b/TaskManager/kernel/ppe/TaskManagerImpl.cc	Sat Jul 31 16:44:10 2010 +0900
@@ -147,6 +147,20 @@
 	task->cpu_type = type;
 }
 
+#if 0
+static void 
+check_wait(TaskManagerImpl *tm, TaskQueueInfo *wait_i) {
+    for(TaskQueue *t = wait_i->getFirst(); t; t = wait_i->getNext(t)) {
+	if (!tm->waitTaskQueue->find(t->task)) {
+	    printf("stray waiting task%d %lx\n",t->task->command, (long)t->task);
+	} else if (tm->activeTaskQueue->find(t->task)) {
+	    printf(" active task%d in waiting queue %lx\n",t->task->command, (long)t->task);
+	} else
+	    printf(".");
+    }
+}
+#endif
+
 /**
  * @brief 終了したタスクから依存の処理とか
  * post_func() はこのタスクが終了したら実行する関数。
@@ -156,9 +170,6 @@
 void
 TaskManagerImpl::check_task_finish(HTaskPtr me, HTaskInfo *wait_queue)
 {
-    if (me->self == 0)
-	printf("  wait for zombi! %ld\n",(long)me);
-
     while(TaskQueue *p = me->wait_me->poll()) {
 	HTaskPtr you = p->task;
 	TaskQueueInfo *wait_i = you->wait_i;
@@ -172,7 +183,7 @@
 	    append_activeTask(you);
 	}
 
-	wait_i->free_(p);
+	wait_i->free_(p);   // p->wait_i, p->wait_me は再利用される
     }
 
     // me を誰かが持っていて、me が finish した後に、
--- a/example/many_task/ppe/QuickSort.cc	Sat Jul 31 12:18:19 2010 +0900
+++ b/example/many_task/ppe/QuickSort.cc	Sat Jul 31 16:44:10 2010 +0900
@@ -27,7 +27,7 @@
     Data *w_data = (Data*)wbuff;
 #endif
 #else
-    int end   = (long)s->get_param(0);
+    int end   = (int)s->get_param(0);
     DataPtr r_data = (DataPtr)s->get_input(0);
 #ifdef USE_MEMCPY
     DataPtr w_data = (DataPtr)s->get_output(0);
--- a/example/many_task/sort.cc	Sat Jul 31 12:18:19 2010 +0900
+++ b/example/many_task/sort.cc	Sat Jul 31 16:44:10 2010 +0900
@@ -4,14 +4,13 @@
 #include "Func.h"
 #include <string.h>
 
-static void sort_start(SchedTask *);
 extern void check_data();
+extern int all;  // allocate task at once
 
-static DataPtr data;
-static  int data_length;
-static  int cpuNum;
-
-extern int all;
+static void sort_start(SchedTask *);
+static int data_length;
+static int cpuNum;
+static int split_num;
 
 /**
  * 一つの block にある data の数が MAX_BLOCK_SIZE 超えないような
@@ -37,10 +36,10 @@
 }	
 
 
-HTaskPtr *fsort;
-HTaskPtr *bsort;
-int split_num;
+static HTaskPtr *fsort;
+static HTaskPtr *bsort;
 
+static DataPtr data;
 
 /**
  * btask が全て終了したら、再び sort_start を実行する
@@ -218,27 +217,25 @@
 	}
     }
 
-    HTask *restart = manager->create_task(RESTART,0,0,0,0);
+    HTaskPtr restart = manager->create_task(RESTART,0,0,0,0);
     for (int i = 0; i < split_num; i++) {
 	if (!all) restart->wait_for(fsort[i]);
 	fsort[i]->spawn();
     }
     restart->spawn();
+}
 
-}
 #endif
 
 void check_data()
 {
-    int flag = 1;
     for(int i=0; i< data_length-1;i++) {
 	if (data[i].index>data[i+1].index)  {
 	    printf("Data are not sorted at %d. %d > %d \n",i, data[i].index,data[i+1].index);
-	    flag = 0;
-	    break;
+	    return;
 	}
     }
-    if (flag) printf("Data are sorted\n");
+    printf("Data are sorted\n");
 }
 
 
--- a/example/many_task/spe/QuickSort.cc	Sat Jul 31 12:18:19 2010 +0900
+++ b/example/many_task/spe/QuickSort.cc	Sat Jul 31 16:44:10 2010 +0900
@@ -27,7 +27,7 @@
     Data *w_data = (Data*)wbuff;
 #endif
 #else
-    int end   = (long)s->get_param(0);
+    int end   = (int)s->get_param(0);
     DataPtr r_data = (DataPtr)s->get_input(0);
 #ifdef USE_MEMCPY
     DataPtr w_data = (DataPtr)s->get_output(0);