Mercurial > hg > Members > kono > Cerium
comparison 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 |
comparison
equal
deleted
inserted
replaced
636:d433fc37587d | 637:5530fa36d42e |
---|---|
26 } | 26 } |
27 | 27 |
28 void | 28 void |
29 CellTaskManagerImpl::init() | 29 CellTaskManagerImpl::init() |
30 { | 30 { |
31 spe_running = 0; | |
31 taskListImpl = new CellTaskListInfo; | 32 taskListImpl = new CellTaskListInfo; |
32 taskListImpl->init(machineNum*2); | 33 taskListImpl->init(machineNum*2); |
33 | 34 |
34 activeTaskQueue = new HTaskInfo(); | 35 activeTaskQueue = new HTaskInfo(); |
35 | 36 |
51 flag_sendTaskList[i] = 1; | 52 flag_sendTaskList[i] = 1; |
52 } | 53 } |
53 // PPE 側の管理をする Manager | 54 // PPE 側の管理をする Manager |
54 ppeManager = new FifoTaskManagerImpl(machineNum); | 55 ppeManager = new FifoTaskManagerImpl(machineNum); |
55 // 大半のTaskQueueInfoは、共有される | 56 // 大半のTaskQueueInfoは、共有される |
56 ppeManager->init(new MainScheduler, this); | 57 MainScheduler *mscheduler = new MainScheduler; |
58 set_scheduler((Scheduler*)mscheduler); | |
59 ppeManager->init(mscheduler, this); | |
57 | 60 |
58 ppeManager->get_scheduler()->set_manager(this); | 61 ppeManager->get_scheduler()->set_manager(this); |
62 | |
59 schedTaskManager = new SchedTask(); | 63 schedTaskManager = new SchedTask(); |
60 schedTaskManager->init(0,0,0,ppeManager->get_scheduler()); | 64 schedTaskManager->init(0,0,0,ppeManager->get_scheduler()); |
61 } | 65 } |
62 | 66 |
63 void | 67 void |
135 MailQueuePtr ppeMail = NULL; | 139 MailQueuePtr ppeMail = NULL; |
136 | 140 |
137 // PPE 側で動く TaskList です | 141 // PPE 側で動く TaskList です |
138 // FifoTaskManagerImpl::run と上手く合うように | 142 // FifoTaskManagerImpl::run と上手く合うように |
139 // こんなことやってますよ | 143 // こんなことやってますよ |
144 // | |
145 // 本来は、別 thread で動かすべきだろう... | |
140 ppeTaskList = ppeManager->get_runTaskList(); | 146 ppeTaskList = ppeManager->get_runTaskList(); |
141 if (!ppeTaskList) { | 147 if (!ppeTaskList) { |
142 goto cont; | 148 goto cont; |
143 } | 149 } |
144 | 150 |
145 // SPE からの Mailbox Check は | 151 // SPE からの Mailbox Check は |
146 // PPE 側の schedule から抜けて来たときに行う | 152 // PPE 側の schedule から抜けて来たときに行う |
147 // (speThreads で Blocking Mailbox read と | 153 // (speThreads で Blocking Mailbox read と |
148 // セマフォとか使ってやってもいいが、今はこの方式で) | 154 // セマフォとか使ってやってもいいが、今はこの方式で) |
155 // | |
156 // すべてのspe task が finish task を待つ場合は、ppeTaskList の | |
157 // 判定だけで十分だが、そうでない場合は、spe の task が残っているか | |
158 // どうかを調べる必要がある。 | |
159 // | |
149 do { | 160 do { |
150 ppeMail = ppeManager->schedule(ppeTaskList); | 161 ppeMail = ppeManager->schedule(ppeTaskList); |
151 cont: | 162 cont: |
152 ppeTaskList = mail_check(ppeMail); | 163 ppeTaskList = mail_check(ppeMail); |
153 } while (ppeTaskList); | 164 } while (ppeTaskList || spe_running >0); |
154 } | 165 } |
155 | 166 |
156 /** | 167 /** |
157 * SPE からのメールをチェックする | 168 * SPE からのメールをチェックする |
158 * | 169 * |
185 */ | 196 */ |
186 // 名前あとでちゃんと決めよう => MY_SPE_... とかじゃなくて | 197 // 名前あとでちゃんと決めよう => MY_SPE_... とかじゃなくて |
187 if (data == (memaddr)MY_SPE_STATUS_READY) { | 198 if (data == (memaddr)MY_SPE_STATUS_READY) { |
188 //__debug_ppe("[SPE %d] finish\n", id); | 199 //__debug_ppe("[SPE %d] finish\n", id); |
189 flag_sendTaskList[id] = 1; | 200 flag_sendTaskList[id] = 1; |
201 spe_running--; | |
190 } else if (data == (memaddr)MY_SPE_COMMAND_MALLOC) { | 202 } else if (data == (memaddr)MY_SPE_COMMAND_MALLOC) { |
191 //__debug_ppe("[PPE] MALLOC COMMAND from [SPE %d]\n", id); | 203 //__debug_ppe("[PPE] MALLOC COMMAND from [SPE %d]\n", id); |
192 | 204 |
193 /** | 205 /** |
194 * info[0] = alloc_id; (CellScheduler::mainMem_alloc 参照) | 206 * info[0] = alloc_id; (CellScheduler::mainMem_alloc 参照) |
233 | 245 |
234 // TaskList 待ちの SPE に TaskList を送る | 246 // TaskList 待ちの SPE に TaskList を送る |
235 for (int i = 0; i < machineNum; i++) { | 247 for (int i = 0; i < machineNum; i++) { |
236 if (flag_sendTaskList[i] == 1 && speTaskList_bg[i]->length >= 1 ) { | 248 if (flag_sendTaskList[i] == 1 && speTaskList_bg[i]->length >= 1 ) { |
237 send_taskList(i); | 249 send_taskList(i); |
250 spe_running++; | |
238 } | 251 } |
239 } | 252 } |
240 | 253 |
241 // 現在の FifoTaskManager の仕様では | 254 // 現在の FifoTaskManager の仕様では |
242 // ・PPE で実行するタスクが無くなれば終了する | 255 // ・PPE で実行するタスクが無くなれば終了する |
270 | 283 |
271 speThreads->send_mail(id, 1, (memaddr *)&speTaskList[id]); | 284 speThreads->send_mail(id, 1, (memaddr *)&speTaskList[id]); |
272 flag_sendTaskList[id] = 0; | 285 flag_sendTaskList[id] = 0; |
273 } | 286 } |
274 | 287 |
275 | 288 #if 0 |
276 void* | 289 void* |
277 CellTaskManagerImpl::allocate(int size, int alignment) | 290 CellTaskManagerImpl::allocate(int size, int alignment) |
278 { | 291 { |
279 if (size==0) return 0; | 292 if (size==0) return 0; |
280 void *buff; | 293 void *buff; |
299 Scheduler* | 312 Scheduler* |
300 CellTaskManagerImpl::get_scheduler() | 313 CellTaskManagerImpl::get_scheduler() |
301 { | 314 { |
302 return ppeManager->get_scheduler(); | 315 return ppeManager->get_scheduler(); |
303 } | 316 } |
317 #endif | |
304 | 318 |
305 #ifdef __CERIUM_CELL__ | 319 #ifdef __CERIUM_CELL__ |
306 TaskManagerImpl* | 320 TaskManagerImpl* |
307 create_impl(int num) | 321 create_impl(int num) |
308 { | 322 { |