Mercurial > hg > Members > kono > Cerium
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 // 依存関係を満たしたタスクをアクティブに |