# HG changeset patch # User yutaka@localhost.localdomain # Date 1292520189 -32400 # Node ID 325b6c6d7d652f5c0b5b09902cd4c5fff5420af1 # Parent 2a59f318cb677b658a1b241b26b2f13ad6948e65 use one activeTaskQueue diff -r 2a59f318cb67 -r 325b6c6d7d65 TaskManager/Cell/CellTaskManagerImpl.cc --- a/TaskManager/Cell/CellTaskManagerImpl.cc Fri Dec 17 00:23:52 2010 +0900 +++ b/TaskManager/Cell/CellTaskManagerImpl.cc Fri Dec 17 02:23:09 2010 +0900 @@ -15,6 +15,8 @@ CellTaskManagerImpl::~CellTaskManagerImpl() { + + delete speThreads; delete [] speTaskList; @@ -26,11 +28,6 @@ { spe_running = 0; spuIdle = spuIdle_; - - // 実行可能な HTask のリスト。 FifoTaskManager と共有される - activeTaskQueue = new QueueInfo(htaskPool); - // HTask の factory。 HTaskInfo ならなんでもいい。 - htaskImpl = activeTaskQueue ; // any HTaskInfo speThreads = new SpeThreads(machineNum); speThreads->init(); @@ -39,6 +36,7 @@ speTaskList = new QueueInfo*[machineNum]; // spe上の走っている Task の配列 taskListInfo = new QueueInfo*[machineNum]; // 次に走る Task の配列 + for (int i = 0; i < machineNum; i++) { taskListInfo[i] = new QueueInfo(taskListPool); speTaskList[i] = new QueueInfo(taskListPool); @@ -50,7 +48,13 @@ MainScheduler *mscheduler = new MainScheduler; set_scheduler(mscheduler); ppeManager->init(mscheduler, this); // ここで HTaskInfo が共有される。 - + + // 実行可能な HTask のリスト。 FifoTaskManager と共有される + activeTaskQueue = ppeManager->activeTaskQueue; + // HTask の factory。 HTaskInfo ならなんでもいい。 + htaskImpl = activeTaskQueue ; // any HTaskInfo + + ppeManager->get_scheduler()->set_manager(this); // Task 内からManager->task_create() とかするときに必要なTaskManager。 @@ -83,23 +87,35 @@ * spe に渡される Task だけ入っている */ void -CellTaskManagerImpl::set_runTaskList() +CellTaskManagerImpl::set_runTaskList(QueueInfo *activeTaskQueue) { int speid; + HTaskPtr htask = activeTaskQueue->getFirst(); + while (htask != NULL) { - while (HTaskPtr htask = activeTaskQueue->poll()) { + if (htask->cpu_type == CPU_PPE) { + htask = activeTaskQueue->getNext(htask); + + } else{ if (htask->cpu_type == SPE_ANY) { - speid = cur_anySpeid++; + speid = cur_anySpeid++; } else { - // -1 してるのは - // htask->cpu_type - CPU_SPE で - // SPE0 = 1, SPE1 = 2, ... SPE5 = 6 ってなってるので - // 配列的 (SPE0 = arr[0], SPE1 = arr[1]) にするため + // -1 してるのは + // htask->cpu_type - CPU_SPE で + // SPE0 = 1, SPE1 = 2, ... SPE5 = 6 ってなってるので + // 配列的 (SPE0 = arr[0], SPE1 = arr[1]) にするため speid = htask->cpu_type - CPU_SPE - 1; } - speid %= machineNum; - set_taskList(htask, taskListInfo[speid]); + + speid %= machineNum; + set_taskList(htask, taskListInfo[speid]); + + HTaskPtr next = activeTaskQueue->getNext(htask); + activeTaskQueue->remove(htask); + htask = next; + + } } } @@ -122,7 +138,7 @@ void CellTaskManagerImpl::poll() { - set_runTaskList(); + set_runTaskList(activeTaskQueue); // TaskList 待ちの SPE に TaskList を送る sendTaskList(); } diff -r 2a59f318cb67 -r 325b6c6d7d65 TaskManager/Cell/CellTaskManagerImpl.h --- a/TaskManager/Cell/CellTaskManagerImpl.h Fri Dec 17 00:23:52 2010 +0900 +++ b/TaskManager/Cell/CellTaskManagerImpl.h Fri Dec 17 02:23:09 2010 +0900 @@ -26,7 +26,8 @@ void run(); void poll(); void mail_check(int id); - void set_runTaskList(); + //void set_runTaskList(*QueueInfo); + void set_runTaskList(QueueInfo* activeTaskQueue); void sendTaskList(); void append_activeTask(HTaskPtr); void show_profile() ; diff -r 2a59f318cb67 -r 325b6c6d7d65 TaskManager/Fifo/FifoTaskManagerImpl.cc --- a/TaskManager/Fifo/FifoTaskManagerImpl.cc Fri Dec 17 00:23:52 2010 +0900 +++ b/TaskManager/Fifo/FifoTaskManagerImpl.cc Fri Dec 17 02:23:09 2010 +0900 @@ -65,6 +65,7 @@ taskQueueImpl = tm-> taskQueueImpl ; htaskImpl = tm-> htaskImpl ; waitTaskQueue = tm->waitTaskQueue; + activeTaskQueue = tm->activeTaskQueue; taskListInfo = new QueueInfo(taskListPool); ppeTaskList = new QueueInfo(taskListPool); @@ -87,18 +88,26 @@ * 実行タスクリストに入れる */ void -FifoTaskManagerImpl::set_runTaskList() +FifoTaskManagerImpl::set_runTaskList(QueueInfo *activeTaskQueue) { // printf("active task queue length = %d\n",activeTaskQueue->length()); - while (HTaskPtr htask = activeTaskQueue->poll()) { + HTaskPtr htask = activeTaskQueue->getFirst(); + while (htask != NULL) { + if (htask->cpu_type == CPU_PPE) { set_taskList(htask, taskListInfo ); + HTaskPtr next = activeTaskQueue->getNext(htask); + activeTaskQueue->remove(htask); + htask = next; + } else { + htask = activeTaskQueue->getNext(htask); + } } } void FifoTaskManagerImpl::poll() { - set_runTaskList(); + set_runTaskList(activeTaskQueue); // list を実行する sendTaskList(); // ppe scheduler からの mail を調べる diff -r 2a59f318cb67 -r 325b6c6d7d65 TaskManager/Fifo/FifoTaskManagerImpl.h --- a/TaskManager/Fifo/FifoTaskManagerImpl.h Fri Dec 17 00:23:52 2010 +0900 +++ b/TaskManager/Fifo/FifoTaskManagerImpl.h Fri Dec 17 02:23:09 2010 +0900 @@ -32,7 +32,8 @@ void mail_check(); - void set_runTaskList(); + void set_runTaskList(QueueInfo* activeTaskQueue); + //void set_runTaskList(); void sendTaskList(); void print_arch();