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