Mercurial > hg > Members > kono > Cerium
annotate 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 |
rev | line source |
---|---|
321 | 1 #define DEBUG |
2 #include "error.h" | |
57 | 3 #include <stdio.h> |
4 #include <stdlib.h> | |
5 #include <string.h> | |
6 #include "CellTaskManagerImpl.h" | |
501
4a2c9ff53605
Cell inData/outData DMA removal
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
496
diff
changeset
|
7 #include "HTaskInfo.h" |
621 | 8 #include "SchedTask.h" |
635
8cc609285bbe
SimpleTask worked on Mac OS X
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
629
diff
changeset
|
9 #include "MainScheduler.h" |
57 | 10 #include "types.h" |
672 | 11 #include "SysFunc.h" |
12 | |
720 | 13 static void send_alloc_reply(CellTaskManagerImpl *tm, int id, SpeThreads *speThreads); |
57 | 14 |
501
4a2c9ff53605
Cell inData/outData DMA removal
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
496
diff
changeset
|
15 CellTaskManagerImpl::~CellTaskManagerImpl() |
67 | 16 { |
109 | 17 delete speThreads; |
18 delete [] speTaskList; | |
19 | |
20 delete ppeManager; | |
67 | 21 } |
22 | |
57 | 23 void |
501
4a2c9ff53605
Cell inData/outData DMA removal
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
496
diff
changeset
|
24 CellTaskManagerImpl::init() |
57 | 25 { |
637 | 26 spe_running = 0; |
476
926d6aff886c
CellBufferManager removed
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
380
diff
changeset
|
27 |
853 | 28 // 実行可能な HTask のリスト。 FifoTaskManager と共有される |
501
4a2c9ff53605
Cell inData/outData DMA removal
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
496
diff
changeset
|
29 activeTaskQueue = new HTaskInfo(); |
853 | 30 // HTask の factory。 HTaskInfo ならなんでもいい。 |
501
4a2c9ff53605
Cell inData/outData DMA removal
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
496
diff
changeset
|
31 htaskImpl = activeTaskQueue ; // any HTaskInfo |
853 | 32 |
65 | 33 speThreads = new SpeThreads(machineNum); |
34 speThreads->init(); | |
109 | 35 |
853 | 36 // 実行される Task 用の パイプライン用のダブルバッファ |
37 speTaskList = new TaskListInfoPtr[machineNum]; // spe上の走っている Task の配列 | |
38 taskListInfo = new TaskListInfoPtr[machineNum]; // 次に走る Task の配列 | |
476
926d6aff886c
CellBufferManager removed
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
380
diff
changeset
|
39 |
109 | 40 for (int i = 0; i < machineNum; i++) { |
812 | 41 taskListInfo[i] = new TaskListInfo(); |
808 | 42 speTaskList[i] = new TaskListInfo(); |
109 | 43 } |
44 | |
321 | 45 // PPE 側の管理をする Manager |
835 | 46 ppeManager = new FifoTaskManagerImpl(machineNum); |
479
5bda98b0b56d
Double Linked List base TaskQueue
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
476
diff
changeset
|
47 // 大半のTaskQueueInfoは、共有される |
637 | 48 MainScheduler *mscheduler = new MainScheduler; |
873
3b9536925fb8
fix hash problem ( unsigned int-> long overflow )
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
860
diff
changeset
|
49 set_scheduler(mscheduler); |
853 | 50 ppeManager->init(mscheduler, this); // ここで HTaskInfo が共有される。 |
619 | 51 |
52 ppeManager->get_scheduler()->set_manager(this); | |
637 | 53 |
853 | 54 // Task 内からManager->task_create() とかするときに必要なTaskManager。 |
55 // 現状では ppe 側からしか動かない | |
56 // spe 側から Task create できない | |
619 | 57 schedTaskManager = new SchedTask(); |
58 schedTaskManager->init(0,0,0,ppeManager->get_scheduler()); | |
936
14fb1c888931
dead lock on spu/ppu mail
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
923
diff
changeset
|
59 ppeManager->schedTaskManager = schedTaskManager; |
57 | 60 } |
61 | |
109 | 62 void |
501
4a2c9ff53605
Cell inData/outData DMA removal
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
496
diff
changeset
|
63 CellTaskManagerImpl::append_activeTask(HTaskPtr task) |
109 | 64 { |
65 if (task->cpu_type == CPU_PPE) { | |
501
4a2c9ff53605
Cell inData/outData DMA removal
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
496
diff
changeset
|
66 ppeManager->append_activeTask(task); |
109 | 67 } else { |
501
4a2c9ff53605
Cell inData/outData DMA removal
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
496
diff
changeset
|
68 activeTaskQueue->addLast(task); |
109 | 69 } |
70 } | |
71 | |
321 | 72 // SPE_ANY が指定されていた時に |
73 // これをインクリメントしつつ呼ぶことにする。 | |
940
0d404f6c36a8
unknown dead lock still...
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
939
diff
changeset
|
74 unsigned int cur_anySpeid = 0; |
109 | 75 |
76 /** | |
321 | 77 * ActiveTaskQueue から Task を |
938
8733ad41297d
dead lock still remains. zombi problem?
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
937
diff
changeset
|
78 * 各 SPE に渡す (backgound) TaskList に入れる |
109 | 79 * |
321 | 80 * ここの activeTaskQueue は FifoTaskManagerImpl のと意味が違い、 |
81 * spe に渡される Task だけ入っている | |
109 | 82 */ |
83 void | |
501
4a2c9ff53605
Cell inData/outData DMA removal
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
496
diff
changeset
|
84 CellTaskManagerImpl::set_runTaskList() |
70 | 85 { |
109 | 86 int speid; |
70 | 87 |
501
4a2c9ff53605
Cell inData/outData DMA removal
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
496
diff
changeset
|
88 while (HTaskPtr htask = activeTaskQueue->poll()) { |
70 | 89 |
109 | 90 if (htask->cpu_type == SPE_ANY) { |
91 speid = cur_anySpeid++; | |
70 | 92 } else { |
321 | 93 // -1 してるのは |
94 // htask->cpu_type - CPU_SPE で | |
95 // SPE0 = 1, SPE1 = 2, ... SPE5 = 6 ってなってるので | |
96 // 配列的 (SPE0 = arr[0], SPE1 = arr[1]) にするため | |
109 | 97 speid = htask->cpu_type - CPU_SPE - 1; |
70 | 98 } |
940
0d404f6c36a8
unknown dead lock still...
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
939
diff
changeset
|
99 speid %= machineNum; |
808 | 100 set_taskList(htask, taskListInfo[speid]); |
70 | 101 } |
109 | 102 } |
103 | |
104 void | |
722 | 105 CellTaskManagerImpl::sendTaskList() |
721 | 106 { |
937
9689cba44964
Sort working on spu cpu == 1 or -a case
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
936
diff
changeset
|
107 for (int id = 0; id < machineNum; id++) { |
9689cba44964
Sort working on spu cpu == 1 or -a case
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
936
diff
changeset
|
108 mail_check(id); |
9689cba44964
Sort working on spu cpu == 1 or -a case
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
936
diff
changeset
|
109 if (!speTaskList[id]->empty()) |
9689cba44964
Sort working on spu cpu == 1 or -a case
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
936
diff
changeset
|
110 continue; // まだ、走ってる |
9689cba44964
Sort working on spu cpu == 1 or -a case
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
936
diff
changeset
|
111 if (! taskListInfo[id]->empty() ) { |
936
14fb1c888931
dead lock on spu/ppu mail
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
923
diff
changeset
|
112 // SPE に送る TaskList の準備 |
937
9689cba44964
Sort working on spu cpu == 1 or -a case
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
936
diff
changeset
|
113 send_taskList(id); |
721 | 114 spe_running++; |
115 } | |
116 } | |
117 } | |
118 | |
119 void | |
808 | 120 CellTaskManagerImpl::poll() |
121 { | |
122 set_runTaskList(); | |
123 // TaskList 待ちの SPE に TaskList を送る | |
124 sendTaskList(); | |
125 } | |
126 | |
127 void | |
501
4a2c9ff53605
Cell inData/outData DMA removal
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
496
diff
changeset
|
128 CellTaskManagerImpl::run() |
109 | 129 { |
130 do { | |
719
cafffff0f45a
clean up scheduler main loop
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
718
diff
changeset
|
131 // PPE side |
808 | 132 ppeManager->poll(); |
719
cafffff0f45a
clean up scheduler main loop
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
718
diff
changeset
|
133 // SPE side |
cafffff0f45a
clean up scheduler main loop
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
718
diff
changeset
|
134 do { |
808 | 135 poll(); |
854 | 136 } while (ppeManager->activeTaskQueue->empty() && spe_running >0 ); |
937
9689cba44964
Sort working on spu cpu == 1 or -a case
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
936
diff
changeset
|
137 } while (!ppeManager->activeTaskQueue->empty() || |
9689cba44964
Sort working on spu cpu == 1 or -a case
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
936
diff
changeset
|
138 !activeTaskQueue->empty() || |
9689cba44964
Sort working on spu cpu == 1 or -a case
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
936
diff
changeset
|
139 spe_running >0); |
721 | 140 if (!waitTaskQueue->empty()) { |
937
9689cba44964
Sort working on spu cpu == 1 or -a case
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
936
diff
changeset
|
141 show_dead_lock_info(); |
9689cba44964
Sort working on spu cpu == 1 or -a case
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
936
diff
changeset
|
142 } |
9689cba44964
Sort working on spu cpu == 1 or -a case
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
936
diff
changeset
|
143 } |
9689cba44964
Sort working on spu cpu == 1 or -a case
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
936
diff
changeset
|
144 |
939 | 145 static void |
146 loop_check(HTask *p,HTask *me, int depth) | |
147 { | |
148 if (p==me) printf("*%lx ",(long)p); // loop | |
149 if (depth==0) return; | |
150 TaskQueueInfo *w = p->wait_i; | |
151 if (w) { | |
152 for( TaskQueue *q = w->getFirst(); q; q = w->getNext(q)) { | |
153 loop_check(q->task,me, depth-1); | |
154 } | |
155 } | |
156 } | |
157 | |
937
9689cba44964
Sort working on spu cpu == 1 or -a case
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
936
diff
changeset
|
158 void |
9689cba44964
Sort working on spu cpu == 1 or -a case
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
936
diff
changeset
|
159 CellTaskManagerImpl::show_dead_lock_info() |
9689cba44964
Sort working on spu cpu == 1 or -a case
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
936
diff
changeset
|
160 { |
9689cba44964
Sort working on spu cpu == 1 or -a case
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
936
diff
changeset
|
161 get_scheduler()-> printf("Dead lock detected\n ppe queue %d\n", |
9689cba44964
Sort working on spu cpu == 1 or -a case
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
936
diff
changeset
|
162 ppeManager->activeTaskQueue->length()); |
939 | 163 // 確か waitQueue は共通... |
164 // get_scheduler()-> printf(" wait queue %d\n",ppeManager->waitTaskQueue->length()); | |
937
9689cba44964
Sort working on spu cpu == 1 or -a case
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
936
diff
changeset
|
165 get_scheduler()-> printf(" wait queue %d\n",waitTaskQueue->length()); |
939 | 166 for( HTask *p = waitTaskQueue->getFirst(); p; p = waitTaskQueue->getNext(p)) { |
167 printf(" Waiting task%d %lx",p->command, (long)p); | |
168 TaskQueueInfo *w = p->wait_i; | |
169 if (w) { | |
170 for( TaskQueue *q = w->getFirst(); q; q = w->getNext(q)) { | |
171 printf(" waiting task%d %lx",q->task->command, (long)q->task); | |
940
0d404f6c36a8
unknown dead lock still...
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
939
diff
changeset
|
172 if (!waitTaskQueue->find(q->task)) { |
0d404f6c36a8
unknown dead lock still...
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
939
diff
changeset
|
173 printf("!"); // stray task |
0d404f6c36a8
unknown dead lock still...
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
939
diff
changeset
|
174 } |
939 | 175 loop_check(q->task,p, 10); |
176 } | |
177 } | |
178 printf("\n"); | |
179 } | |
937
9689cba44964
Sort working on spu cpu == 1 or -a case
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
936
diff
changeset
|
180 get_scheduler()-> printf(" spe queue %d\n",activeTaskQueue->length()); |
9689cba44964
Sort working on spu cpu == 1 or -a case
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
936
diff
changeset
|
181 for (int i = 0; i < machineNum; i++) { |
9689cba44964
Sort working on spu cpu == 1 or -a case
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
936
diff
changeset
|
182 get_scheduler()-> printf(" spe %d send %d wait %d\n",i, |
9689cba44964
Sort working on spu cpu == 1 or -a case
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
936
diff
changeset
|
183 speTaskList[i]->length(), taskListInfo[i]->length()); |
721 | 184 } |
70 | 185 } |
186 | |
65 | 187 /** |
321 | 188 * SPE からのメールをチェックする |
640
a909c50081c2
SimpeTask on Cell worked.
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
638
diff
changeset
|
189 */ |
a909c50081c2
SimpeTask on Cell worked.
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
638
diff
changeset
|
190 |
719
cafffff0f45a
clean up scheduler main loop
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
718
diff
changeset
|
191 void |
936
14fb1c888931
dead lock on spu/ppu mail
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
923
diff
changeset
|
192 CellTaskManagerImpl::mail_check(int id) |
57 | 193 { |
719
cafffff0f45a
clean up scheduler main loop
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
718
diff
changeset
|
194 memaddr data; |
109 | 195 |
719
cafffff0f45a
clean up scheduler main loop
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
718
diff
changeset
|
196 // SPE Scheduler からの mail check |
936
14fb1c888931
dead lock on spu/ppu mail
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
923
diff
changeset
|
197 while (speThreads->has_mail(id, 1, &data)) { |
14fb1c888931
dead lock on spu/ppu mail
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
923
diff
changeset
|
198 if (data == (memaddr)MY_SPE_STATUS_READY) { |
14fb1c888931
dead lock on spu/ppu mail
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
923
diff
changeset
|
199 // MY_SPE_STATUS_READY: SPE が持ってた Task 全て終了 |
14fb1c888931
dead lock on spu/ppu mail
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
923
diff
changeset
|
200 // freeAll する前に循環リストに戻す |
14fb1c888931
dead lock on spu/ppu mail
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
923
diff
changeset
|
201 speTaskList[id]->getLast()->next = speTaskList[id]; |
14fb1c888931
dead lock on spu/ppu mail
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
923
diff
changeset
|
202 speTaskList[id]->freeAll(); |
14fb1c888931
dead lock on spu/ppu mail
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
923
diff
changeset
|
203 spe_running--; |
938
8733ad41297d
dead lock still remains. zombi problem?
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
937
diff
changeset
|
204 // printf("SPE %d status ready, %d running\n",id, spe_running); |
936
14fb1c888931
dead lock on spu/ppu mail
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
923
diff
changeset
|
205 } else if (data == (memaddr)MY_SPE_COMMAND_MALLOC) { |
14fb1c888931
dead lock on spu/ppu mail
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
923
diff
changeset
|
206 // MY_SPE_COMMAND_MALLOC SPE からのmain memory request |
14fb1c888931
dead lock on spu/ppu mail
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
923
diff
changeset
|
207 send_alloc_reply(this, id, speThreads); |
14fb1c888931
dead lock on spu/ppu mail
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
923
diff
changeset
|
208 } else if (data > (memaddr)MY_SPE_NOP) { |
830 | 209 #ifdef TASK_LIST_MAIL |
936
14fb1c888931
dead lock on spu/ppu mail
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
923
diff
changeset
|
210 TaskListPtr list = (TaskListPtr)data; |
14fb1c888931
dead lock on spu/ppu mail
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
923
diff
changeset
|
211 check_task_list_finish(schedTaskManager, list, waitTaskQueue); |
830 | 212 #else |
936
14fb1c888931
dead lock on spu/ppu mail
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
923
diff
changeset
|
213 // 終了したタスク(PPEにあるのでアドレス) |
14fb1c888931
dead lock on spu/ppu mail
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
923
diff
changeset
|
214 HTaskPtr task = (HTaskPtr)data; |
14fb1c888931
dead lock on spu/ppu mail
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
923
diff
changeset
|
215 task->post_func(schedTaskManager, task->post_arg1, task->post_arg2); |
14fb1c888931
dead lock on spu/ppu mail
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
923
diff
changeset
|
216 check_task_finish(task, waitTaskQueue); |
830 | 217 #endif |
719
cafffff0f45a
clean up scheduler main loop
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
718
diff
changeset
|
218 } |
936
14fb1c888931
dead lock on spu/ppu mail
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
923
diff
changeset
|
219 // MY_SPE_NOP: 特に意味のないコマンド |
719
cafffff0f45a
clean up scheduler main loop
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
718
diff
changeset
|
220 } |
cafffff0f45a
clean up scheduler main loop
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
718
diff
changeset
|
221 } |
109 | 222 |
832
29094b48d966
poling (may recurse..)
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
830
diff
changeset
|
223 void |
29094b48d966
poling (may recurse..)
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
830
diff
changeset
|
224 CellTaskManagerImpl::polling() |
29094b48d966
poling (may recurse..)
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
830
diff
changeset
|
225 { |
29094b48d966
poling (may recurse..)
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
830
diff
changeset
|
226 // may call recursively check_task_list_finish() |
29094b48d966
poling (may recurse..)
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
830
diff
changeset
|
227 // we need fifo here |
936
14fb1c888931
dead lock on spu/ppu mail
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
923
diff
changeset
|
228 for (int i = 0; i < machineNum; i++) { |
14fb1c888931
dead lock on spu/ppu mail
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
923
diff
changeset
|
229 mail_check(i); |
14fb1c888931
dead lock on spu/ppu mail
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
923
diff
changeset
|
230 } |
832
29094b48d966
poling (may recurse..)
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
830
diff
changeset
|
231 } |
29094b48d966
poling (may recurse..)
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
830
diff
changeset
|
232 |
719
cafffff0f45a
clean up scheduler main loop
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
718
diff
changeset
|
233 static void |
720 | 234 send_alloc_reply(CellTaskManagerImpl *tm, int id, SpeThreads *speThreads) |
719
cafffff0f45a
clean up scheduler main loop
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
718
diff
changeset
|
235 { |
273 | 236 |
719
cafffff0f45a
clean up scheduler main loop
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
718
diff
changeset
|
237 /** |
cafffff0f45a
clean up scheduler main loop
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
718
diff
changeset
|
238 * info[0] = alloc_id; (CellScheduler::mainMem_alloc 参照) |
cafffff0f45a
clean up scheduler main loop
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
718
diff
changeset
|
239 * info[1] = alloc_addr; |
cafffff0f45a
clean up scheduler main loop
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
718
diff
changeset
|
240 */ |
cafffff0f45a
clean up scheduler main loop
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
718
diff
changeset
|
241 memaddr alloc_info[2]; |
cafffff0f45a
clean up scheduler main loop
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
718
diff
changeset
|
242 long alloc_size; |
cafffff0f45a
clean up scheduler main loop
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
718
diff
changeset
|
243 long command; |
cafffff0f45a
clean up scheduler main loop
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
718
diff
changeset
|
244 |
cafffff0f45a
clean up scheduler main loop
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
718
diff
changeset
|
245 speThreads->get_mail(id, 2, alloc_info); |
cafffff0f45a
clean up scheduler main loop
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
718
diff
changeset
|
246 command = (long)alloc_info[0]; |
cafffff0f45a
clean up scheduler main loop
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
718
diff
changeset
|
247 alloc_size = (long)alloc_info[1]; |
109 | 248 |
719
cafffff0f45a
clean up scheduler main loop
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
718
diff
changeset
|
249 |
720 | 250 alloc_info[1] = (memaddr)tm->allocate(alloc_size); |
719
cafffff0f45a
clean up scheduler main loop
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
718
diff
changeset
|
251 //__debug_ppe("[PPE] MALLOCED 0x%lx from [SPE %d]\n", alloc_info[1],id); |
cafffff0f45a
clean up scheduler main loop
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
718
diff
changeset
|
252 // 今のところ何もしてない。どうも、この allocate を free |
cafffff0f45a
clean up scheduler main loop
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
718
diff
changeset
|
253 // するのは、SPE task が返した値を見て行うらしい。それは、 |
cafffff0f45a
clean up scheduler main loop
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
718
diff
changeset
|
254 // 忘れやすいのではないか? |
cafffff0f45a
clean up scheduler main loop
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
718
diff
changeset
|
255 speThreads->add_output_tasklist(command, alloc_info[1], alloc_size); |
109 | 256 |
719
cafffff0f45a
clean up scheduler main loop
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
718
diff
changeset
|
257 speThreads->send_mail(id, 2, alloc_info); |
109 | 258 } |
66 | 259 |
109 | 260 /** |
321 | 261 * 条件を満たしたら SPE に TaskList を送信する |
262 * 条件1. SPE が持ってた TaskList を終了して、次の TaskList を待ってる | |
263 * 条件2. SPE に送る TaskList に Task がある | |
109 | 264 * |
808 | 265 * SPE で実行終了した speTaskList と |
266 * これから実行する taskListInfo のバッファを入れ替える | |
109 | 267 */ |
268 void | |
269 CellTaskManagerImpl::send_taskList(int id) | |
270 { | |
853 | 271 // speTaskList は走り終わった ppe の Task の List. |
272 // taskListInfo はこれから走る Task の List. | |
273 // 交換して実行する | |
808 | 274 TaskListInfoPtr tmp = taskListInfo[id]; |
275 taskListInfo[id] = speTaskList[id]; | |
276 speTaskList[id] = tmp; | |
109 | 277 |
853 | 278 // speTaskList は本来は循環リストなのだけど、実行中は線形リストである。 |
279 // spe の Task が終了した時点でなおす。 | |
809 | 280 tmp->getLast()->next = 0; |
812 | 281 TaskListPtr p = tmp->getFirst(); |
938
8733ad41297d
dead lock still remains. zombi problem?
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
937
diff
changeset
|
282 // printf("SPE %d task list sending\n",id); |
812 | 283 speThreads->send_mail(id, 1, (memaddr *)&p); |
938
8733ad41297d
dead lock still remains. zombi problem?
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
937
diff
changeset
|
284 // printf("SPE %d task list sent\n",id); |
57 | 285 } |
286 | |
672 | 287 void CellTaskManagerImpl::show_profile() { |
288 for (int id = 0; id < machineNum; id++) { | |
923
e015a4e5e4b0
fix DMA/Mail wait profiler
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
897
diff
changeset
|
289 HTaskPtr t = schedTaskManager->create_task(ShowTime,0,0,0,0); |
672 | 290 t->set_cpu((CPU_TYPE)(id+2)); |
291 t->spawn(); | |
292 } | |
293 } | |
294 | |
295 void CellTaskManagerImpl::start_profile() { | |
296 for (int id = 0; id < machineNum; id++) { | |
923
e015a4e5e4b0
fix DMA/Mail wait profiler
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
897
diff
changeset
|
297 HTaskPtr t = schedTaskManager->create_task(StartProfile,0,0,0,0); |
672 | 298 t->set_cpu((CPU_TYPE)(id+2)); |
299 t->spawn(); | |
300 } | |
301 } | |
302 | |
380 | 303 |
109 | 304 #ifdef __CERIUM_CELL__ |
57 | 305 TaskManagerImpl* |
306 create_impl(int num) | |
307 { | |
835 | 308 return new CellTaskManagerImpl(num); |
57 | 309 } |
109 | 310 #endif // __CERIUM_CELL |