Mercurial > hg > Game > Cerium
comparison TaskManager/Cell/CellTaskManagerImpl.cc @ 1077:325b6c6d7d65 draft
use one activeTaskQueue
author | yutaka@localhost.localdomain |
---|---|
date | Fri, 17 Dec 2010 02:23:09 +0900 |
parents | ce992190388b |
children | cfabe454e7cc |
comparison
equal
deleted
inserted
replaced
1076:2a59f318cb67 | 1077:325b6c6d7d65 |
---|---|
13 | 13 |
14 static void send_alloc_reply(CellTaskManagerImpl *tm, int id, SpeThreads *speThreads); | 14 static void send_alloc_reply(CellTaskManagerImpl *tm, int id, SpeThreads *speThreads); |
15 | 15 |
16 CellTaskManagerImpl::~CellTaskManagerImpl() | 16 CellTaskManagerImpl::~CellTaskManagerImpl() |
17 { | 17 { |
18 | |
19 | |
18 delete speThreads; | 20 delete speThreads; |
19 delete [] speTaskList; | 21 delete [] speTaskList; |
20 | 22 |
21 delete ppeManager; | 23 delete ppeManager; |
22 } | 24 } |
24 void | 26 void |
25 CellTaskManagerImpl::init(int spuIdle_) | 27 CellTaskManagerImpl::init(int spuIdle_) |
26 { | 28 { |
27 spe_running = 0; | 29 spe_running = 0; |
28 spuIdle = spuIdle_; | 30 spuIdle = spuIdle_; |
29 | |
30 // 実行可能な HTask のリスト。 FifoTaskManager と共有される | |
31 activeTaskQueue = new QueueInfo<HTask>(htaskPool); | |
32 // HTask の factory。 HTaskInfo ならなんでもいい。 | |
33 htaskImpl = activeTaskQueue ; // any HTaskInfo | |
34 | 31 |
35 speThreads = new SpeThreads(machineNum); | 32 speThreads = new SpeThreads(machineNum); |
36 speThreads->init(); | 33 speThreads->init(); |
37 | 34 |
38 // 実行される Task 用の パイプライン用のダブルバッファ | 35 // 実行される Task 用の パイプライン用のダブルバッファ |
39 speTaskList = new QueueInfo<TaskList>*[machineNum]; // spe上の走っている Task の配列 | 36 speTaskList = new QueueInfo<TaskList>*[machineNum]; // spe上の走っている Task の配列 |
40 taskListInfo = new QueueInfo<TaskList>*[machineNum]; // 次に走る Task の配列 | 37 taskListInfo = new QueueInfo<TaskList>*[machineNum]; // 次に走る Task の配列 |
38 | |
41 | 39 |
42 for (int i = 0; i < machineNum; i++) { | 40 for (int i = 0; i < machineNum; i++) { |
43 taskListInfo[i] = new QueueInfo<TaskList>(taskListPool); | 41 taskListInfo[i] = new QueueInfo<TaskList>(taskListPool); |
44 speTaskList[i] = new QueueInfo<TaskList>(taskListPool); | 42 speTaskList[i] = new QueueInfo<TaskList>(taskListPool); |
45 } | 43 } |
48 ppeManager = new FifoTaskManagerImpl(machineNum); | 46 ppeManager = new FifoTaskManagerImpl(machineNum); |
49 // 大半のTaskQueueInfoは、共有される | 47 // 大半のTaskQueueInfoは、共有される |
50 MainScheduler *mscheduler = new MainScheduler; | 48 MainScheduler *mscheduler = new MainScheduler; |
51 set_scheduler(mscheduler); | 49 set_scheduler(mscheduler); |
52 ppeManager->init(mscheduler, this); // ここで HTaskInfo が共有される。 | 50 ppeManager->init(mscheduler, this); // ここで HTaskInfo が共有される。 |
53 | 51 |
52 // 実行可能な HTask のリスト。 FifoTaskManager と共有される | |
53 activeTaskQueue = ppeManager->activeTaskQueue; | |
54 // HTask の factory。 HTaskInfo ならなんでもいい。 | |
55 htaskImpl = activeTaskQueue ; // any HTaskInfo | |
56 | |
57 | |
54 ppeManager->get_scheduler()->set_manager(this); | 58 ppeManager->get_scheduler()->set_manager(this); |
55 | 59 |
56 // Task 内からManager->task_create() とかするときに必要なTaskManager。 | 60 // Task 内からManager->task_create() とかするときに必要なTaskManager。 |
57 // 現状では ppe 側からしか動かない | 61 // 現状では ppe 側からしか動かない |
58 // spe 側から Task create できない | 62 // spe 側から Task create できない |
81 * | 85 * |
82 * ここの activeTaskQueue は FifoTaskManagerImpl のと意味が違い、 | 86 * ここの activeTaskQueue は FifoTaskManagerImpl のと意味が違い、 |
83 * spe に渡される Task だけ入っている | 87 * spe に渡される Task だけ入っている |
84 */ | 88 */ |
85 void | 89 void |
86 CellTaskManagerImpl::set_runTaskList() | 90 CellTaskManagerImpl::set_runTaskList(QueueInfo<HTask> *activeTaskQueue) |
87 { | 91 { |
88 int speid; | 92 int speid; |
89 | 93 HTaskPtr htask = activeTaskQueue->getFirst(); |
90 while (HTaskPtr htask = activeTaskQueue->poll()) { | 94 while (htask != NULL) { |
91 | 95 |
96 if (htask->cpu_type == CPU_PPE) { | |
97 | |
98 htask = activeTaskQueue->getNext(htask); | |
99 | |
100 } else{ | |
92 if (htask->cpu_type == SPE_ANY) { | 101 if (htask->cpu_type == SPE_ANY) { |
93 speid = cur_anySpeid++; | 102 speid = cur_anySpeid++; |
94 } else { | 103 } else { |
95 // -1 してるのは | 104 // -1 してるのは |
96 // htask->cpu_type - CPU_SPE で | 105 // htask->cpu_type - CPU_SPE で |
97 // SPE0 = 1, SPE1 = 2, ... SPE5 = 6 ってなってるので | 106 // SPE0 = 1, SPE1 = 2, ... SPE5 = 6 ってなってるので |
98 // 配列的 (SPE0 = arr[0], SPE1 = arr[1]) にするため | 107 // 配列的 (SPE0 = arr[0], SPE1 = arr[1]) にするため |
99 speid = htask->cpu_type - CPU_SPE - 1; | 108 speid = htask->cpu_type - CPU_SPE - 1; |
100 } | 109 } |
101 speid %= machineNum; | 110 |
102 set_taskList(htask, taskListInfo[speid]); | 111 speid %= machineNum; |
112 set_taskList(htask, taskListInfo[speid]); | |
113 | |
114 HTaskPtr next = activeTaskQueue->getNext(htask); | |
115 activeTaskQueue->remove(htask); | |
116 htask = next; | |
117 | |
118 } | |
103 } | 119 } |
104 } | 120 } |
105 | 121 |
106 void | 122 void |
107 CellTaskManagerImpl::sendTaskList() | 123 CellTaskManagerImpl::sendTaskList() |
120 } | 136 } |
121 | 137 |
122 void | 138 void |
123 CellTaskManagerImpl::poll() | 139 CellTaskManagerImpl::poll() |
124 { | 140 { |
125 set_runTaskList(); | 141 set_runTaskList(activeTaskQueue); |
126 // TaskList 待ちの SPE に TaskList を送る | 142 // TaskList 待ちの SPE に TaskList を送る |
127 sendTaskList(); | 143 sendTaskList(); |
128 } | 144 } |
129 | 145 |
130 | 146 |