# HG changeset patch # User Shinji KONO # Date 1280538701 -32400 # Node ID 9689cba44964ebb54462581b5fe8605d3527676c # Parent 14fb1c888931ea4ae45993cb67e98176548fd088 Sort working on spu cpu == 1 or -a case diff -r 14fb1c888931 -r 9689cba44964 TaskManager/Cell/CellTaskManagerImpl.cc --- a/TaskManager/Cell/CellTaskManagerImpl.cc Sat Jul 31 05:31:12 2010 +0900 +++ b/TaskManager/Cell/CellTaskManagerImpl.cc Sat Jul 31 10:11:41 2010 +0900 @@ -114,11 +114,13 @@ void CellTaskManagerImpl::sendTaskList() { - for (int i = 0; i < machineNum; i++) { - if (! taskListInfo[i]->empty() ) { - mail_check(i); + for (int id = 0; id < machineNum; id++) { + mail_check(id); + if (!speTaskList[id]->empty()) + continue; // まだ、走ってる + if (! taskListInfo[id]->empty() ) { // SPE に送る TaskList の準備 - send_taskList(i); + send_taskList(id); spe_running++; } } @@ -142,9 +144,24 @@ do { poll(); } while (ppeManager->activeTaskQueue->empty() && spe_running >0 ); - } while (!ppeManager->activeTaskQueue->empty() || spe_running >0); + } while (!ppeManager->activeTaskQueue->empty() || + !activeTaskQueue->empty() || + spe_running >0); if (!waitTaskQueue->empty()) { - get_scheduler()->printf("Dead lock detected\n"); + show_dead_lock_info(); + } +} + +void +CellTaskManagerImpl::show_dead_lock_info() +{ + get_scheduler()-> printf("Dead lock detected\n ppe queue %d\n", + ppeManager->activeTaskQueue->length()); + get_scheduler()-> printf(" wait queue %d\n",waitTaskQueue->length()); + get_scheduler()-> printf(" spe queue %d\n",activeTaskQueue->length()); + for (int i = 0; i < machineNum; i++) { + get_scheduler()-> printf(" spe %d send %d wait %d\n",i, + speTaskList[i]->length(), taskListInfo[i]->length()); } } @@ -165,6 +182,7 @@ speTaskList[id]->getLast()->next = speTaskList[id]; speTaskList[id]->freeAll(); spe_running--; +printf("SPE %d status ready\n",id); } else if (data == (memaddr)MY_SPE_COMMAND_MALLOC) { // MY_SPE_COMMAND_MALLOC SPE からのmain memory request send_alloc_reply(this, id, speThreads); @@ -231,7 +249,6 @@ void CellTaskManagerImpl::send_taskList(int id) { - if (taskListInfo[id]->empty()) return; // speTaskList は走り終わった ppe の Task の List. // taskListInfo はこれから走る Task の List. // 交換して実行する @@ -243,7 +260,9 @@ // spe の Task が終了した時点でなおす。 tmp->getLast()->next = 0; TaskListPtr p = tmp->getFirst(); +printf("SPE %d task list sending\n",id); speThreads->send_mail(id, 1, (memaddr *)&p); +printf("SPE %d task list sent\n",id); } void CellTaskManagerImpl::show_profile() { diff -r 14fb1c888931 -r 9689cba44964 TaskManager/Cell/CellTaskManagerImpl.h --- a/TaskManager/Cell/CellTaskManagerImpl.h Sat Jul 31 05:31:12 2010 +0900 +++ b/TaskManager/Cell/CellTaskManagerImpl.h Sat Jul 31 10:11:41 2010 +0900 @@ -34,6 +34,8 @@ private: void send_taskList(int id); + void show_dead_lock_info(); + }; #endif diff -r 14fb1c888931 -r 9689cba44964 TaskManager/Makefile.def --- a/TaskManager/Makefile.def Sat Jul 31 05:31:12 2010 +0900 +++ b/TaskManager/Makefile.def Sat Jul 31 10:11:41 2010 +0900 @@ -29,8 +29,8 @@ ABIBIT = 32 -# OPT = -g -O9 -OPT = -g -DTASK_LIST_MAIL -O9 +OPT = -g -O9 +# OPT = -g -DTASK_LIST_MAIL -O9 CC = g++ CFLAGS = -Wall `sdl-config --cflags` -m$(ABIBIT) $(OPT)