comparison TaskManager/Cell/CellTaskManagerImpl.cc @ 647:7c9ded1ea750

MailManager rewrite. not yet worked.
author Shinji KONO <kono@ie.u-ryukyu.ac.jp>
date Sat, 21 Nov 2009 16:18:47 +0900
parents a909c50081c2
children 7405d92733a8
comparison
equal deleted inserted replaced
646:ffcc25c7c566 647:7c9ded1ea750
133 133
134 void 134 void
135 CellTaskManagerImpl::run() 135 CellTaskManagerImpl::run()
136 { 136 {
137 TaskListPtr ppeTaskList = NULL; 137 TaskListPtr ppeTaskList = NULL;
138 MailQueuePtr ppeMail = NULL;
139 138
140 // PPE 側で動く TaskList です 139 // PPE 側で動く TaskList です
141 // FifoTaskManagerImpl::run と上手く合うように 140 // FifoTaskManagerImpl::run と上手く合うように
142 // こんなことやってますよ 141 // こんなことやってますよ
143 // 142 //
155 // すべてのspe task が finish task を待つ場合は、ppeTaskList の 154 // すべてのspe task が finish task を待つ場合は、ppeTaskList の
156 // 判定だけで十分だが、そうでない場合は、spe の task が残っているか 155 // 判定だけで十分だが、そうでない場合は、spe の task が残っているか
157 // どうかを調べる必要がある。 156 // どうかを調べる必要がある。
158 // 157 //
159 do { 158 do {
160 ppeMail = ppeManager->schedule(ppeTaskList); 159 ppeManager->schedule(ppeTaskList);
161 cont: 160 cont:
162 ppeTaskList = mail_check(ppeMail); 161 ppeTaskList = mail_check(waitTaskQueue);
163 } while (ppeTaskList || spe_running >0); 162 } while (ppeTaskList || spe_running >0);
164 } 163 }
165 164
166 /** 165 /**
167 * SPE からのメールをチェックする 166 * SPE からのメールをチェックする
173 * @return PPE Scheduler に対してのメール。 172 * @return PPE Scheduler に対してのメール。
174 * 次に実行する TaskList のアドレスや、終了コマンドを送る 173 * 次に実行する TaskList のアドレスや、終了コマンドを送る
175 */ 174 */
176 175
177 TaskListPtr 176 TaskListPtr
178 CellTaskManagerImpl::mail_check(MailQueuePtr mail_list) 177 CellTaskManagerImpl::mail_check(HTaskInfo *wait_queue)
179 { 178 {
180 // PPE Scheduler からの mail check 179 // PPE Scheduler からの mail check
181 ppeManager->mail_check(mail_list, waitTaskQueue); 180 ppeManager->mail_check(waitTaskQueue);
182 181
183 do { 182 do {
184 memaddr data; 183 memaddr data;
185 184
186 // SPE Scheduler からの mail check 185 // SPE Scheduler からの mail check
187 for (int id = 0; id < machineNum; id++) { 186 for (int id = 0; id < machineNum; id++) {
188 while (speThreads->check_mail(id, 1, &data)) { 187 while (speThreads->has_mail(id, 1, &data)) {
189 /** 188 /**
190 * MY_SPE_STATUS_READY: SPE が持ってた Task 全て終了 189 * MY_SPE_STATUS_READY: SPE が持ってた Task 全て終了
191 * MY_SPE_NOP: 特に意味のないコマンド 190 * MY_SPE_NOP: 特に意味のないコマンド
192 * それ以外:終了したタスク(PPEにあるのでアドレス 191 * それ以外:終了したタスク(PPEにあるのでアドレス
193 * 192 *
231 speThreads->send_mail(id, 2, alloc_info); 230 speThreads->send_mail(id, 2, alloc_info);
232 } else if (data > (memaddr)MY_SPE_NOP) { 231 } else if (data > (memaddr)MY_SPE_NOP) {
233 //__debug_ppe("[PPE] recv from [SPE %d] : 0x%x\n", id, data); 232 //__debug_ppe("[PPE] recv from [SPE %d] : 0x%x\n", id, data);
234 HTaskPtr task = (HTaskPtr)data; 233 HTaskPtr task = (HTaskPtr)data;
235 task->post_func(schedTaskManager, task->post_arg1, task->post_arg2); 234 task->post_func(schedTaskManager, task->post_arg1, task->post_arg2);
236 check_task_finish(task); 235 check_task_finish(task,waitTaskQueue);
237 } 236 }
238 } 237 }
239 } 238 }
240 239
241 // 依存関係を満たしたタスクをアクティブに 240 // 依存関係を満たしたタスクをアクティブに