Mercurial > hg > Game > Cerium
changeset 1077:325b6c6d7d65 draft
use one activeTaskQueue
author | yutaka@localhost.localdomain |
---|---|
date | Fri, 17 Dec 2010 02:23:09 +0900 |
parents | 2a59f318cb67 |
children | 6dabcd1a9ccf |
files | TaskManager/Cell/CellTaskManagerImpl.cc TaskManager/Cell/CellTaskManagerImpl.h TaskManager/Fifo/FifoTaskManagerImpl.cc TaskManager/Fifo/FifoTaskManagerImpl.h |
diffstat | 4 files changed, 48 insertions(+), 21 deletions(-) [+] |
line wrap: on
line diff
--- 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<HTask>(htaskPool); - // HTask の factory。 HTaskInfo ならなんでもいい。 - htaskImpl = activeTaskQueue ; // any HTaskInfo speThreads = new SpeThreads(machineNum); speThreads->init(); @@ -39,6 +36,7 @@ speTaskList = new QueueInfo<TaskList>*[machineNum]; // spe上の走っている Task の配列 taskListInfo = new QueueInfo<TaskList>*[machineNum]; // 次に走る Task の配列 + for (int i = 0; i < machineNum; i++) { taskListInfo[i] = new QueueInfo<TaskList>(taskListPool); speTaskList[i] = new QueueInfo<TaskList>(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<HTask> *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(); }
--- 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<HTask>); + void set_runTaskList(QueueInfo<HTask>* activeTaskQueue); void sendTaskList(); void append_activeTask(HTaskPtr); void show_profile() ;
--- 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<TaskList>(taskListPool); ppeTaskList = new QueueInfo<TaskList>(taskListPool); @@ -87,18 +88,26 @@ * 実行タスクリストに入れる */ void -FifoTaskManagerImpl::set_runTaskList() +FifoTaskManagerImpl::set_runTaskList(QueueInfo<HTask> *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 を調べる
--- 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<HTask>* activeTaskQueue); + //void set_runTaskList(); void sendTaskList(); void print_arch();