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 {