comparison TaskManager/Cell/CellTaskManagerImpl.cc @ 936:14fb1c888931

dead lock on spu/ppu mail
author Shinji KONO <kono@ie.u-ryukyu.ac.jp>
date Sat, 31 Jul 2010 05:31:12 +0900
parents e015a4e5e4b0
children 9689cba44964
comparison
equal deleted inserted replaced
935:e54842e4d97b 936:14fb1c888931
54 // Task 内からManager->task_create() とかするときに必要なTaskManager。 54 // Task 内からManager->task_create() とかするときに必要なTaskManager。
55 // 現状では ppe 側からしか動かない 55 // 現状では ppe 側からしか動かない
56 // spe 側から Task create できない 56 // spe 側から Task create できない
57 schedTaskManager = new SchedTask(); 57 schedTaskManager = new SchedTask();
58 schedTaskManager->init(0,0,0,ppeManager->get_scheduler()); 58 schedTaskManager->init(0,0,0,ppeManager->get_scheduler());
59 ppeManager->schedTaskManager = schedTaskManager;
59 } 60 }
60 61
61 void 62 void
62 CellTaskManagerImpl::append_activeTask(HTaskPtr task) 63 CellTaskManagerImpl::append_activeTask(HTaskPtr task)
63 { 64 {
112 113
113 void 114 void
114 CellTaskManagerImpl::sendTaskList() 115 CellTaskManagerImpl::sendTaskList()
115 { 116 {
116 for (int i = 0; i < machineNum; i++) { 117 for (int i = 0; i < machineNum; i++) {
117 if ( taskListInfo[i]->length() > 0 ) { 118 if (! taskListInfo[i]->empty() ) {
119 mail_check(i);
120 // SPE に送る TaskList の準備
118 send_taskList(i); 121 send_taskList(i);
119 spe_running++; 122 spe_running++;
120 } 123 }
121 } 124 }
122 } 125 }
123 126
124 void 127 void
125 CellTaskManagerImpl::poll() 128 CellTaskManagerImpl::poll()
126 { 129 {
127 mail_check();
128 // SPE に送る TaskList の準備
129 set_runTaskList(); 130 set_runTaskList();
130 // TaskList 待ちの SPE に TaskList を送る 131 // TaskList 待ちの SPE に TaskList を送る
131 sendTaskList(); 132 sendTaskList();
132 } 133 }
133 134
150 /** 151 /**
151 * SPE からのメールをチェックする 152 * SPE からのメールをチェックする
152 */ 153 */
153 154
154 void 155 void
155 CellTaskManagerImpl::mail_check() 156 CellTaskManagerImpl::mail_check(int id)
156 { 157 {
157 memaddr data; 158 memaddr data;
158 159
159 // SPE Scheduler からの mail check 160 // SPE Scheduler からの mail check
160 for (int id = 0; id < machineNum; id++) { 161 while (speThreads->has_mail(id, 1, &data)) {
161 while (speThreads->has_mail(id, 1, &data)) { 162 if (data == (memaddr)MY_SPE_STATUS_READY) {
162 if (data == (memaddr)MY_SPE_STATUS_READY) { 163 // MY_SPE_STATUS_READY: SPE が持ってた Task 全て終了
163 // MY_SPE_STATUS_READY: SPE が持ってた Task 全て終了 164 // freeAll する前に循環リストに戻す
164 // freeAll する前に循環リストに戻す 165 speTaskList[id]->getLast()->next = speTaskList[id];
165 speTaskList[id]->getLast()->next = speTaskList[id]; 166 speTaskList[id]->freeAll();
166 speTaskList[id]->freeAll(); 167 spe_running--;
167 spe_running--; 168 } else if (data == (memaddr)MY_SPE_COMMAND_MALLOC) {
168 } else if (data == (memaddr)MY_SPE_COMMAND_MALLOC) { 169 // MY_SPE_COMMAND_MALLOC SPE からのmain memory request
169 // MY_SPE_COMMAND_MALLOC SPE からのmain memory request 170 send_alloc_reply(this, id, speThreads);
170 send_alloc_reply(this, id, speThreads); 171 } else if (data > (memaddr)MY_SPE_NOP) {
171 } else if (data > (memaddr)MY_SPE_NOP) {
172 #ifdef TASK_LIST_MAIL 172 #ifdef TASK_LIST_MAIL
173 TaskListPtr list = (TaskListPtr)data; 173 TaskListPtr list = (TaskListPtr)data;
174 check_task_list_finish(schedTaskManager, list, waitTaskQueue); 174 check_task_list_finish(schedTaskManager, list, waitTaskQueue);
175 #else 175 #else
176 // 終了したタスク(PPEにあるのでアドレス) 176 // 終了したタスク(PPEにあるのでアドレス)
177 HTaskPtr task = (HTaskPtr)data; 177 HTaskPtr task = (HTaskPtr)data;
178 task->post_func(schedTaskManager, task->post_arg1, task->post_arg2); 178 task->post_func(schedTaskManager, task->post_arg1, task->post_arg2);
179 check_task_finish(task, waitTaskQueue); 179 check_task_finish(task, waitTaskQueue);
180 #endif 180 #endif
181 }
182 // MY_SPE_NOP: 特に意味のないコマンド
183 } 181 }
182 // MY_SPE_NOP: 特に意味のないコマンド
184 } 183 }
185 } 184 }
186 185
187 void 186 void
188 CellTaskManagerImpl::polling() 187 CellTaskManagerImpl::polling()
189 { 188 {
190 // may call recursively check_task_list_finish() 189 // may call recursively check_task_list_finish()
191 // we need fifo here 190 // we need fifo here
192 mail_check(); 191 for (int i = 0; i < machineNum; i++) {
192 mail_check(i);
193 }
193 } 194 }
194 195
195 static void 196 static void
196 send_alloc_reply(CellTaskManagerImpl *tm, int id, SpeThreads *speThreads) 197 send_alloc_reply(CellTaskManagerImpl *tm, int id, SpeThreads *speThreads)
197 { 198 {