comparison TaskManager/Cell/CellTaskManagerImpl.cc @ 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 15026ebf7a17
comparison
equal deleted inserted replaced
939:9cfac2e8fc2e 940:0d404f6c36a8
69 } 69 }
70 } 70 }
71 71
72 // SPE_ANY が指定されていた時に 72 // SPE_ANY が指定されていた時に
73 // これをインクリメントしつつ呼ぶことにする。 73 // これをインクリメントしつつ呼ぶことにする。
74 // 乱数使ってもいいけどさ。 74 unsigned int cur_anySpeid = 0;
75 int cur_anySpeid = 0;
76 75
77 /** 76 /**
78 * ActiveTaskQueue から Task を 77 * ActiveTaskQueue から Task を
79 * 各 SPE に渡す (backgound) TaskList に入れる 78 * 各 SPE に渡す (backgound) TaskList に入れる
80 * 79 *
88 87
89 while (HTaskPtr htask = activeTaskQueue->poll()) { 88 while (HTaskPtr htask = activeTaskQueue->poll()) {
90 89
91 if (htask->cpu_type == SPE_ANY) { 90 if (htask->cpu_type == SPE_ANY) {
92 speid = cur_anySpeid++; 91 speid = cur_anySpeid++;
93 cur_anySpeid = (cur_anySpeid < machineNum)
94 ? cur_anySpeid : 0;
95 } else { 92 } else {
96 // -1 してるのは 93 // -1 してるのは
97 // htask->cpu_type - CPU_SPE で 94 // htask->cpu_type - CPU_SPE で
98 // SPE0 = 1, SPE1 = 2, ... SPE5 = 6 ってなってるので 95 // SPE0 = 1, SPE1 = 2, ... SPE5 = 6 ってなってるので
99 // 配列的 (SPE0 = arr[0], SPE1 = arr[1]) にするため 96 // 配列的 (SPE0 = arr[0], SPE1 = arr[1]) にするため
100 speid = htask->cpu_type - CPU_SPE - 1; 97 speid = htask->cpu_type - CPU_SPE - 1;
101 98 }
102 // SPU の数以上が指定されていれば 99 speid %= machineNum;
103 // とりあえず MAX_USE_SPE_NUM (実際に動く SPE の最大数) で
104 // あまり求めてそれを使うことにする。
105 // ここで判定するもんでもないか?
106 if (speid >= machineNum) {
107 speid %= machineNum;
108 }
109 }
110 set_taskList(htask, taskListInfo[speid]); 100 set_taskList(htask, taskListInfo[speid]);
111 } 101 }
112 } 102 }
113 103
114 void 104 void
177 printf(" Waiting task%d %lx",p->command, (long)p); 167 printf(" Waiting task%d %lx",p->command, (long)p);
178 TaskQueueInfo *w = p->wait_i; 168 TaskQueueInfo *w = p->wait_i;
179 if (w) { 169 if (w) {
180 for( TaskQueue *q = w->getFirst(); q; q = w->getNext(q)) { 170 for( TaskQueue *q = w->getFirst(); q; q = w->getNext(q)) {
181 printf(" waiting task%d %lx",q->task->command, (long)q->task); 171 printf(" waiting task%d %lx",q->task->command, (long)q->task);
182 if (!waitTaskQueue->find(q->task)) printf("!"); // stray task 172 if (!waitTaskQueue->find(q->task)) {
173 printf("!"); // stray task
174 }
183 loop_check(q->task,p, 10); 175 loop_check(q->task,p, 10);
184 } 176 }
185 } 177 }
186 printf("\n"); 178 printf("\n");
187 } 179 }