Mercurial > hg > Game > Cerium
annotate TaskManager/kernel/ppe/TaskManagerImpl.cc @ 2030:258498680128 draft
indent-region
author | Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp> |
---|---|
date | Tue, 25 Nov 2014 05:08:50 +0900 |
parents | ac16a57f5dd7 |
children |
rev | line source |
---|---|
1142
801d57ae1e29
cut compile CreatePolygonTask on spe side because not enough spe memory. We have to use code loading.
yutaka@localhost.localdomain
parents:
1064
diff
changeset
|
1 //#include <stdio.h> |
3 | 2 #include "TaskManagerImpl.h" |
46 | 3 #include "types.h" |
4 #include "error.h" | |
546 | 5 #include "SchedTask.h" |
619 | 6 #include "Scheduler.h" |
634 | 7 #include "SysTask.h" |
8 #include "SysFunc.h" | |
1423
515a0f15b5d2
add to log taskdependency
Daichi TOMA <toma@cr.ie.u-ryukyu.ac.jp>
parents:
1230
diff
changeset
|
9 #include "rdtsc.h" |
806 | 10 #include <string.h> |
11 | |
955 | 12 // singleton |
13 QueueInfo<TaskQueue> *taskQueuePool = new QueueInfo<TaskQueue>() ; | |
14 QueueInfo<HTask> *htaskPool = new QueueInfo<HTask>() ; | |
15 QueueInfo<TaskList> *taskListPool = new QueueInfo<TaskList>() ; | |
1428
af2adce9752e
add to export TaskLog
Daichi TOMA <toma@cr.ie.u-ryukyu.ac.jp>
parents:
1424
diff
changeset
|
16 QueueInfo<TaskLog> *taskLogQueue = new QueueInfo<TaskLog>(); |
955 | 17 |
220 | 18 static HTaskPtr systask_start; |
109 | 19 static HTaskPtr systask_finish; |
42 | 20 |
550 | 21 static void |
22 noaction(SchedTask *s, void *read, void *write) | |
3 | 23 { |
24 } | |
25 | |
835 | 26 TaskManagerImpl::TaskManagerImpl(int num) |
1605
5b99bcc6bdb0
fix mail_check and init dim_count and init _export_task_log.
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
1588
diff
changeset
|
27 : machineNum(num) ,_export_task_log(0){ |
853 | 28 // 実行可能なHTaskのリスト |
955 | 29 activeTaskQueue = new QueueInfo<HTask>(htaskPool); |
853 | 30 // wait_forで止まっているHTaskのリスト。必要ないが、Dead lock detection に使う |
955 | 31 waitTaskQueue = new QueueInfo<HTask>(htaskPool); |
32 // HTask の factory. QueueInfo<HTask> ならなんでもいい。 | |
33 htaskImpl = waitTaskQueue ; // any QueueInfo<HTask> | |
34 // Task の dependency を表現する double linked list. QueueInfo<HTask> とは別に必要。 | |
1542
9ccfdc408d51
fix gpu word count.but not count line num.
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
1492
diff
changeset
|
35 taskQueueImpl = new QueueInfo<TaskQueue>(taskQueuePool); |
1423
515a0f15b5d2
add to log taskdependency
Daichi TOMA <toma@cr.ie.u-ryukyu.ac.jp>
parents:
1230
diff
changeset
|
36 |
480
75e4afa40da2
TaskQueueInfo initiaization...
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
479
diff
changeset
|
37 } |
50 | 38 |
220 | 39 /** |
298 | 40 * 一番最初に PPE で実行される systask_start |
220 | 41 */ |
42 | 42 void |
499 | 43 TaskManagerImpl::systask_init() |
42 | 44 { |
109 | 45 systask_register(); |
897
6bd218d3f643
add return address in SimpleTask for debugging.
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
855
diff
changeset
|
46 systask_start = create_task(StartTask,0,0,0,0,__builtin_return_address(0)); |
6bd218d3f643
add return address in SimpleTask for debugging.
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
855
diff
changeset
|
47 systask_finish = create_task(FinishTask,0,0,0,0,__builtin_return_address(0)); |
220 | 48 |
49 systask_start->spawn(); | |
50 | |
634 | 51 // すべての Task が FinishTask を wait_for すると、 |
52 // あらゆる Task が FinishTask の waiting task queue を操作する | |
53 // ことになる。それは、重すぎる。PPE/SPE Task が終了した時点で、 | |
54 // TaskManager が実行する方が安い。 | |
55 // append_waitTask(systask_finish); | |
56 } | |
57 | |
945
9ed1c4a877ca
sort example fix ( simple task accepts one param and more compatible with old task)
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
941
diff
changeset
|
58 /** |
9ed1c4a877ca
sort example fix ( simple task accepts one param and more compatible with old task)
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
941
diff
changeset
|
59 * Create Simple Task |
9ed1c4a877ca
sort example fix ( simple task accepts one param and more compatible with old task)
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
941
diff
changeset
|
60 */ |
634 | 61 HTaskPtr |
897
6bd218d3f643
add return address in SimpleTask for debugging.
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
855
diff
changeset
|
62 TaskManagerImpl::create_task(int cmd,memaddr rbuf, long r_size, memaddr wbuf, long w_size, void *from) { |
1465 | 63 HTaskPtr new_task = htaskImpl->create(); |
1474 | 64 new_task->init(cmd, rbuf, r_size, wbuf, w_size); // この引数はもう意味がない |
1465 | 65 new_task->mimpl = this; |
1474 | 66 new_task->command = TaskArray1; |
67 new_task->create_task_array(cmd, 1, 8, 8, 8) ; // この引数はもう意味がない | |
634 | 68 new_task->post_func = noaction; |
897
6bd218d3f643
add return address in SimpleTask for debugging.
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
855
diff
changeset
|
69 new_task->from = (memaddr)from; |
1423
515a0f15b5d2
add to log taskdependency
Daichi TOMA <toma@cr.ie.u-ryukyu.ac.jp>
parents:
1230
diff
changeset
|
70 |
1474 | 71 Task *t = new_task->next_task_array(cmd,0,8,1,1); |
72 t->set_inData(0,rbuf,r_size); | |
73 t->set_outData(0,wbuf,w_size); | |
74 | |
1479
163220e54cc0
remove hard code for TaskLog
Daichi TOMA <toma@cr.ie.u-ryukyu.ac.jp>
parents:
1474
diff
changeset
|
75 if (_export_task_log) { |
1989 | 76 tasklog = new TaskLog(); |
1479
163220e54cc0
remove hard code for TaskLog
Daichi TOMA <toma@cr.ie.u-ryukyu.ac.jp>
parents:
1474
diff
changeset
|
77 tasklog->set_cmd(cmd); |
163220e54cc0
remove hard code for TaskLog
Daichi TOMA <toma@cr.ie.u-ryukyu.ac.jp>
parents:
1474
diff
changeset
|
78 taskLogQueue->addLast(tasklog); |
163220e54cc0
remove hard code for TaskLog
Daichi TOMA <toma@cr.ie.u-ryukyu.ac.jp>
parents:
1474
diff
changeset
|
79 } |
1423
515a0f15b5d2
add to log taskdependency
Daichi TOMA <toma@cr.ie.u-ryukyu.ac.jp>
parents:
1230
diff
changeset
|
80 |
949 | 81 #ifdef EARLY_TOUCH |
82 if (rbuf) { | |
1542
9ccfdc408d51
fix gpu word count.but not count line num.
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
1492
diff
changeset
|
83 if ((unsigned long)rbuf&0xf) { |
9ccfdc408d51
fix gpu word count.but not count line num.
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
1492
diff
changeset
|
84 printf("Data is not aligned. command = %d, addr = 0x%lx, size = %ld\n", |
9ccfdc408d51
fix gpu word count.but not count line num.
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
1492
diff
changeset
|
85 cmd, (unsigned long)rbuf, r_size); |
9ccfdc408d51
fix gpu word count.but not count line num.
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
1492
diff
changeset
|
86 } |
9ccfdc408d51
fix gpu word count.but not count line num.
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
1492
diff
changeset
|
87 char *p = (char *)rbuf; char b = *p; // これはコンパイラが落としてしまうのではないか... |
9ccfdc408d51
fix gpu word count.but not count line num.
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
1492
diff
changeset
|
88 p = (char *)(rbuf+r_size-1); b += *p; |
949 | 89 } |
90 if (wbuf) { | |
1542
9ccfdc408d51
fix gpu word count.but not count line num.
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
1492
diff
changeset
|
91 if ((unsigned long)wbuf&0xf) { |
9ccfdc408d51
fix gpu word count.but not count line num.
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
1492
diff
changeset
|
92 printf("Data is not aligned. command = %d, addr = 0x%lx, size = %ld\n", |
9ccfdc408d51
fix gpu word count.but not count line num.
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
1492
diff
changeset
|
93 cmd, (unsigned long)wbuf, w_size); |
9ccfdc408d51
fix gpu word count.but not count line num.
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
1492
diff
changeset
|
94 } |
9ccfdc408d51
fix gpu word count.but not count line num.
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
1492
diff
changeset
|
95 char *p = (char *)wbuf; char b = *p; |
9ccfdc408d51
fix gpu word count.but not count line num.
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
1492
diff
changeset
|
96 p = (char *)(wbuf+w_size-1); b += *p; |
949 | 97 } |
98 #endif | |
634 | 99 |
100 return new_task; | |
42 | 101 } |
102 | |
945
9ed1c4a877ca
sort example fix ( simple task accepts one param and more compatible with old task)
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
941
diff
changeset
|
103 /** |
9ed1c4a877ca
sort example fix ( simple task accepts one param and more compatible with old task)
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
941
diff
changeset
|
104 * Create Compatible Task (TaskArray1) |
9ed1c4a877ca
sort example fix ( simple task accepts one param and more compatible with old task)
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
941
diff
changeset
|
105 */ |
3 | 106 HTaskPtr |
897
6bd218d3f643
add return address in SimpleTask for debugging.
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
855
diff
changeset
|
107 TaskManagerImpl::create_task(int cmd,void *from) |
3 | 108 { |
109 | |
1465 | 110 HTaskPtr new_task = create_task(TaskArray,0,0,0,0, from); |
703 | 111 new_task->post_func = noaction; |
112 new_task->mimpl = this; | |
736 | 113 new_task->create_task_array(cmd,1,8,8,8); |
713
97adb3fe85c6
remove SIMPLE_TASK conditional
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
704
diff
changeset
|
114 // rbuf, r_size were set |
704
ec6c897448ca
Compatibility mode works.
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
703
diff
changeset
|
115 new_task->command = TaskArray1; |
897
6bd218d3f643
add return address in SimpleTask for debugging.
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
855
diff
changeset
|
116 new_task->from = (memaddr)from; |
1551
57317332f6ef
create fft example
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
1543
diff
changeset
|
117 new_task->next_task_array(cmd,0,8,8,8); |
63 | 118 |
1479
163220e54cc0
remove hard code for TaskLog
Daichi TOMA <toma@cr.ie.u-ryukyu.ac.jp>
parents:
1474
diff
changeset
|
119 if (_export_task_log) { |
1989 | 120 tasklog = new TaskLog(); |
1479
163220e54cc0
remove hard code for TaskLog
Daichi TOMA <toma@cr.ie.u-ryukyu.ac.jp>
parents:
1474
diff
changeset
|
121 tasklog->set_cmd(cmd); |
163220e54cc0
remove hard code for TaskLog
Daichi TOMA <toma@cr.ie.u-ryukyu.ac.jp>
parents:
1474
diff
changeset
|
122 taskLogQueue->addLast(tasklog); |
163220e54cc0
remove hard code for TaskLog
Daichi TOMA <toma@cr.ie.u-ryukyu.ac.jp>
parents:
1474
diff
changeset
|
123 } |
1428
af2adce9752e
add to export TaskLog
Daichi TOMA <toma@cr.ie.u-ryukyu.ac.jp>
parents:
1424
diff
changeset
|
124 |
3 | 125 return new_task; |
126 } | |
127 | |
945
9ed1c4a877ca
sort example fix ( simple task accepts one param and more compatible with old task)
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
941
diff
changeset
|
128 /** |
9ed1c4a877ca
sort example fix ( simple task accepts one param and more compatible with old task)
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
941
diff
changeset
|
129 * Create Task Array |
9ed1c4a877ca
sort example fix ( simple task accepts one param and more compatible with old task)
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
941
diff
changeset
|
130 */ |
800
54f0180cea0f
run16 word count ( not yet worked. )
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
736
diff
changeset
|
131 HTaskPtr |
897
6bd218d3f643
add return address in SimpleTask for debugging.
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
855
diff
changeset
|
132 TaskManagerImpl::create_task_array(int id, int num_task, int num_param, int num_inData, int num_outData, void *from) |
800
54f0180cea0f
run16 word count ( not yet worked. )
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
736
diff
changeset
|
133 { |
897
6bd218d3f643
add return address in SimpleTask for debugging.
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
855
diff
changeset
|
134 HTaskPtr ta = create_task(TaskArray,0,0,0,0, from); |
800
54f0180cea0f
run16 word count ( not yet worked. )
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
736
diff
changeset
|
135 ta->create_task_array(id, num_task, num_param, num_inData, num_outData) ; |
54f0180cea0f
run16 word count ( not yet worked. )
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
736
diff
changeset
|
136 return ta; |
54f0180cea0f
run16 word count ( not yet worked. )
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
736
diff
changeset
|
137 } |
54f0180cea0f
run16 word count ( not yet worked. )
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
736
diff
changeset
|
138 |
1432 | 139 TaskListPtr |
140 TaskManagerImpl::createTaskList() | |
141 { | |
142 return NULL; | |
143 } | |
144 | |
1062
f994f5032299
add TaskManagerImpl::get_task_name()
kazz <kazz@cr.ie.u-ryukyu.ac.jp>
parents:
955
diff
changeset
|
145 /* call get_task_name from ppu only */ |
f994f5032299
add TaskManagerImpl::get_task_name()
kazz <kazz@cr.ie.u-ryukyu.ac.jp>
parents:
955
diff
changeset
|
146 const char * |
f994f5032299
add TaskManagerImpl::get_task_name()
kazz <kazz@cr.ie.u-ryukyu.ac.jp>
parents:
955
diff
changeset
|
147 TaskManagerImpl::get_task_name(int cmd) { |
1147 | 148 if (0 <= cmd && cmd < MAX_TASK_OBJECT) { |
1542
9ccfdc408d51
fix gpu word count.but not count line num.
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
1492
diff
changeset
|
149 return task_list[cmd].name; |
1887 | 150 } else { |
1147 | 151 return NULL; |
152 } | |
1062
f994f5032299
add TaskManagerImpl::get_task_name()
kazz <kazz@cr.ie.u-ryukyu.ac.jp>
parents:
955
diff
changeset
|
153 } |
f994f5032299
add TaskManagerImpl::get_task_name()
kazz <kazz@cr.ie.u-ryukyu.ac.jp>
parents:
955
diff
changeset
|
154 const char * |
f994f5032299
add TaskManagerImpl::get_task_name()
kazz <kazz@cr.ie.u-ryukyu.ac.jp>
parents:
955
diff
changeset
|
155 TaskManagerImpl::get_task_name(TaskPtr task) { |
1542
9ccfdc408d51
fix gpu word count.but not count line num.
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
1492
diff
changeset
|
156 return task != NULL ? get_task_name(task->command) : NULL; |
1062
f994f5032299
add TaskManagerImpl::get_task_name()
kazz <kazz@cr.ie.u-ryukyu.ac.jp>
parents:
955
diff
changeset
|
157 } |
f994f5032299
add TaskManagerImpl::get_task_name()
kazz <kazz@cr.ie.u-ryukyu.ac.jp>
parents:
955
diff
changeset
|
158 const char * |
f994f5032299
add TaskManagerImpl::get_task_name()
kazz <kazz@cr.ie.u-ryukyu.ac.jp>
parents:
955
diff
changeset
|
159 TaskManagerImpl::get_task_name(SimpleTaskPtr simple_task) { |
1542
9ccfdc408d51
fix gpu word count.but not count line num.
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
1492
diff
changeset
|
160 return simple_task != NULL ? get_task_name(simple_task->command) : NULL; |
1062
f994f5032299
add TaskManagerImpl::get_task_name()
kazz <kazz@cr.ie.u-ryukyu.ac.jp>
parents:
955
diff
changeset
|
161 } |
f994f5032299
add TaskManagerImpl::get_task_name()
kazz <kazz@cr.ie.u-ryukyu.ac.jp>
parents:
955
diff
changeset
|
162 const char * |
f994f5032299
add TaskManagerImpl::get_task_name()
kazz <kazz@cr.ie.u-ryukyu.ac.jp>
parents:
955
diff
changeset
|
163 TaskManagerImpl::get_task_name(SchedTaskBase *sched_task) { |
1542
9ccfdc408d51
fix gpu word count.but not count line num.
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
1492
diff
changeset
|
164 if (sched_task == NULL) return NULL; |
9ccfdc408d51
fix gpu word count.but not count line num.
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
1492
diff
changeset
|
165 if (sched_task->atask != NULL) { |
1464
3f2230d79eba
TaskList no compile errors
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
1462
diff
changeset
|
166 return get_task_name(sched_task->atask->command); |
1542
9ccfdc408d51
fix gpu word count.but not count line num.
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
1492
diff
changeset
|
167 } |
9ccfdc408d51
fix gpu word count.but not count line num.
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
1492
diff
changeset
|
168 return NULL; |
1062
f994f5032299
add TaskManagerImpl::get_task_name()
kazz <kazz@cr.ie.u-ryukyu.ac.jp>
parents:
955
diff
changeset
|
169 } |
f994f5032299
add TaskManagerImpl::get_task_name()
kazz <kazz@cr.ie.u-ryukyu.ac.jp>
parents:
955
diff
changeset
|
170 const char * |
f994f5032299
add TaskManagerImpl::get_task_name()
kazz <kazz@cr.ie.u-ryukyu.ac.jp>
parents:
955
diff
changeset
|
171 TaskManagerImpl::get_task_name(HTaskPtr htask) { |
1147 | 172 |
173 return get_task_name(htask, 0); | |
174 | |
1561
e8c9a7099bcc
add set NDRange param
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
1551
diff
changeset
|
175 } |
1062
f994f5032299
add TaskManagerImpl::get_task_name()
kazz <kazz@cr.ie.u-ryukyu.ac.jp>
parents:
955
diff
changeset
|
176 const char * |
f994f5032299
add TaskManagerImpl::get_task_name()
kazz <kazz@cr.ie.u-ryukyu.ac.jp>
parents:
955
diff
changeset
|
177 TaskManagerImpl::get_task_name(HTaskPtr htask, int index) { |
1542
9ccfdc408d51
fix gpu word count.but not count line num.
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
1492
diff
changeset
|
178 if (!htask) return NULL; |
9ccfdc408d51
fix gpu word count.but not count line num.
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
1492
diff
changeset
|
179 switch (htask->command) { |
9ccfdc408d51
fix gpu word count.but not count line num.
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
1492
diff
changeset
|
180 case TaskArray1: |
9ccfdc408d51
fix gpu word count.but not count line num.
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
1492
diff
changeset
|
181 return get_task_name((TaskPtr)htask->rbuf); |
9ccfdc408d51
fix gpu word count.but not count line num.
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
1492
diff
changeset
|
182 break; |
9ccfdc408d51
fix gpu word count.but not count line num.
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
1492
diff
changeset
|
183 case TaskArray: { |
1147 | 184 |
1542
9ccfdc408d51
fix gpu word count.but not count line num.
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
1492
diff
changeset
|
185 TaskPtr tmp = (TaskPtr)htask->rbuf; |
9ccfdc408d51
fix gpu word count.but not count line num.
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
1492
diff
changeset
|
186 return get_task_name(tmp[0].command); |
1147 | 187 |
1542
9ccfdc408d51
fix gpu word count.but not count line num.
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
1492
diff
changeset
|
188 } |
9ccfdc408d51
fix gpu word count.but not count line num.
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
1492
diff
changeset
|
189 default: |
9ccfdc408d51
fix gpu word count.but not count line num.
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
1492
diff
changeset
|
190 return get_task_name(htask->command); |
9ccfdc408d51
fix gpu word count.but not count line num.
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
1492
diff
changeset
|
191 } |
9ccfdc408d51
fix gpu word count.but not count line num.
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
1492
diff
changeset
|
192 return NULL; |
1062
f994f5032299
add TaskManagerImpl::get_task_name()
kazz <kazz@cr.ie.u-ryukyu.ac.jp>
parents:
955
diff
changeset
|
193 } |
f994f5032299
add TaskManagerImpl::get_task_name()
kazz <kazz@cr.ie.u-ryukyu.ac.jp>
parents:
955
diff
changeset
|
194 |
3 | 195 /** |
298 | 196 * task の依存関係を設定 |
197 * master task が終わってから、slave task を実行するように | |
109 | 198 * master->wait_for(slave); |
3 | 199 */ |
200 void | |
201 TaskManagerImpl::set_task_depend(HTaskPtr master, HTaskPtr slave) | |
547 | 202 { |
1989 | 203 if (_export_task_log) { |
204 waitTask* wait_task = new waitTask; | |
205 wait_task->task_id = tasklog->mtask_id; | |
206 wait_task->cmd = tasklog->cmd; | |
207 tasklog->wait_for_list.addLast(wait_task); | |
208 } | |
209 | |
3 | 210 TaskQueuePtr m, s; |
941
fc6cfaae6de7
add no_auto_free flag on HTask
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
940
diff
changeset
|
211 if (!master->self) return; |
547 | 212 |
955 | 213 m = taskQueueImpl->create(); m->init(master); |
214 s = taskQueueImpl->create(); s->init(slave); | |
547 | 215 |
479
bf2d2625485e
Double Linked List base TaskQueue
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
475
diff
changeset
|
216 master->wait_me->addLast(s); |
bf2d2625485e
Double Linked List base TaskQueue
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
475
diff
changeset
|
217 slave->wait_i->addLast(m); |
481
f9ffcffb6d09
Double linked list modification done (tested on Mac OS X)
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
480
diff
changeset
|
218 s->waiter = m; |
547 | 219 } |
220 | |
3 | 221 /** |
298 | 222 * タスクを実行可能キューまたは待機キューへ追加する。 |
223 * 依存関係が満たされていれば active, まだだったら wait へ。 | |
109 | 224 * task->spawn(); |
225 */ | |
3 | 226 void |
18 | 227 TaskManagerImpl::spawn_task(HTaskPtr task) |
3 | 228 { |
1989 | 229 if (_export_task_log) |
230 tasklog->create_time = rdtsc(); | |
109 | 231 // waiter // master |
232 // waitee // slave | |
480
75e4afa40da2
TaskQueueInfo initiaization...
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
479
diff
changeset
|
233 if (task->wait_i->empty()) { |
498
bce667ff20b9
double linked HTaskInfo/HTask
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
497
diff
changeset
|
234 append_activeTask(task); |
3 | 235 } else { |
498
bce667ff20b9
double linked HTaskInfo/HTask
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
497
diff
changeset
|
236 append_waitTask(task); |
3 | 237 } |
238 } | |
42 | 239 |
800
54f0180cea0f
run16 word count ( not yet worked. )
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
736
diff
changeset
|
240 |
109 | 241 /** |
298 | 242 * Task を実行可能キューに追加する |
109 | 243 */ |
244 void | |
498
bce667ff20b9
double linked HTaskInfo/HTask
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
497
diff
changeset
|
245 TaskManagerImpl::append_activeTask(HTaskPtr q) |
109 | 246 { |
479
bf2d2625485e
Double Linked List base TaskQueue
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
475
diff
changeset
|
247 activeTaskQueue->addLast(q); |
109 | 248 } |
249 | |
250 /** | |
298 | 251 * タスクが実行する CPU を選択する |
109 | 252 * |
298 | 253 * 現在は CPU_PPE, CPU_SPE, SPE_ANY, SPE_0, SPE_1, ..., SPE_5 |
254 * types.h に書いてます。 | |
109 | 255 */ |
65 | 256 void |
257 TaskManagerImpl::set_task_cpu(HTaskPtr task, CPU_TYPE type) | |
258 { | |
1492
73f4bfaeaf99
fix select cpu type
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
1482
diff
changeset
|
259 task_list->cpu_type = type; |
664 | 260 if (machineNum==0) |
1588
f7d35318ea76
fix min_cpu() anc max_cpu()
Shohei KOKUBO <e105744@ie.u-ryukyu.ac.jp>
parents:
1561
diff
changeset
|
261 task->cpu_type = CPU_PPE ; |
664 | 262 else |
1588
f7d35318ea76
fix min_cpu() anc max_cpu()
Shohei KOKUBO <e105744@ie.u-ryukyu.ac.jp>
parents:
1561
diff
changeset
|
263 task->cpu_type = type; |
65 | 264 } |
265 | |
940
e01b551f25d6
unknown dead lock still...
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
939
diff
changeset
|
266 #if 0 |
1542
9ccfdc408d51
fix gpu word count.but not count line num.
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
1492
diff
changeset
|
267 static void |
955 | 268 check_wait(TaskManagerImpl *tm, QueueInfo<TaskQueue> *wait_i) { |
940
e01b551f25d6
unknown dead lock still...
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
939
diff
changeset
|
269 for(TaskQueue *t = wait_i->getFirst(); t; t = wait_i->getNext(t)) { |
1542
9ccfdc408d51
fix gpu word count.but not count line num.
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
1492
diff
changeset
|
270 if (!tm->waitTaskQueue->find(t->task)) { |
9ccfdc408d51
fix gpu word count.but not count line num.
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
1492
diff
changeset
|
271 //this->printf("stray waiting task%d %lx\n",t->task->command, (long)t->task); |
9ccfdc408d51
fix gpu word count.but not count line num.
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
1492
diff
changeset
|
272 printf("stray waiting task%d %lx\n",t->task->command, (long)t->task); |
9ccfdc408d51
fix gpu word count.but not count line num.
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
1492
diff
changeset
|
273 } else if (tm->activeTaskQueue->find(t->task)) { |
9ccfdc408d51
fix gpu word count.but not count line num.
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
1492
diff
changeset
|
274 //this->printf(" active task%d in waiting queue %lx\n",t->task->command, (long)t->task); |
9ccfdc408d51
fix gpu word count.but not count line num.
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
1492
diff
changeset
|
275 printf(" active task%d in waiting queue %lx\n",t->task->command, (long)t->task); |
9ccfdc408d51
fix gpu word count.but not count line num.
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
1492
diff
changeset
|
276 } else |
9ccfdc408d51
fix gpu word count.but not count line num.
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
1492
diff
changeset
|
277 printf("."); |
940
e01b551f25d6
unknown dead lock still...
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
939
diff
changeset
|
278 } |
e01b551f25d6
unknown dead lock still...
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
939
diff
changeset
|
279 } |
e01b551f25d6
unknown dead lock still...
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
939
diff
changeset
|
280 #endif |
e01b551f25d6
unknown dead lock still...
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
939
diff
changeset
|
281 |
109 | 282 /** |
830 | 283 * @brief 終了したタスクから依存の処理とか |
298 | 284 * post_func() はこのタスクが終了したら実行する関数。 |
109 | 285 * |
298 | 286 * @param [task] 終了したタスク |
109 | 287 */ |
288 void | |
955 | 289 TaskManagerImpl::check_task_finish(HTaskPtr me, QueueInfo<HTask> *wait_queue) |
42 | 290 { |
1479
163220e54cc0
remove hard code for TaskLog
Daichi TOMA <toma@cr.ie.u-ryukyu.ac.jp>
parents:
1474
diff
changeset
|
291 if (_export_task_log) |
1989 | 292 tasklog->finish_time = rdtsc(); |
1423
515a0f15b5d2
add to log taskdependency
Daichi TOMA <toma@cr.ie.u-ryukyu.ac.jp>
parents:
1230
diff
changeset
|
293 |
497 | 294 while(TaskQueue *p = me->wait_me->poll()) { |
2000 | 295 HTaskPtr you = p->task; |
296 QueueInfo<TaskQueue> *wait_i = you->wait_i; | |
297 // 相手の wait queue から自分(を指しているTaskQueue)を削除 | |
298 wait_i->remove(p->waiter); | |
299 // queue を free する | |
300 wait_i->free_(p->waiter); | |
301 | |
302 if (wait_i->empty()) { | |
303 wait_queue->remove(you); | |
304 append_activeTask(you); | |
305 } | |
483
5f4ffff2c2aa
renew task worked. but not test_nogl...
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
481
diff
changeset
|
306 |
2000 | 307 wait_i->free_(p); // p->wait_i, p->wait_me は再利用される |
479
bf2d2625485e
Double Linked List base TaskQueue
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
475
diff
changeset
|
308 } |
bf2d2625485e
Double Linked List base TaskQueue
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
475
diff
changeset
|
309 |
1466 | 310 // このTaskList は終わったので、今 free して良いが、TaskListInfo に入っているので、 |
311 // MY_SPE_STATUS_READY 時に、まとめてfree する。FifoTaskManager/CellTaskManager | |
1542
9ccfdc408d51
fix gpu word count.but not count line num.
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
1492
diff
changeset
|
312 |
939 | 313 // me を誰かが持っていて、me が finish した後に、 |
314 // me->wait_for(i) とか、やられると気まずい。 | |
315 // 特に、me が他人に再利用されていると。そういう時には、 | |
316 // このfreeをコメントアウトしてみる。 | |
317 | |
318 // id かななんかでチェックした方が良いが... | |
319 | |
320 me->self = 0; | |
941
fc6cfaae6de7
add no_auto_free flag on HTask
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
940
diff
changeset
|
321 if (!me->flag.no_auto_free) |
1666 | 322 htaskImpl->free_(me); |
109 | 323 } |
42 | 324 |
830 | 325 /** |
326 * @brief 終了したタスクリストの依存の処理 | |
327 * @param [task] 終了したタスク | |
328 */ | |
329 void | |
955 | 330 TaskManagerImpl::check_task_list_finish(SchedTask *s, TaskListPtr list, QueueInfo<HTask> *wait_queue) |
830 | 331 { |
1462
8cf62aea798f
HTask/TaskList fix (on going)
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
1424
diff
changeset
|
332 HTask *me = list->self; |
8cf62aea798f
HTask/TaskList fix (on going)
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
1424
diff
changeset
|
333 if (me) { |
8cf62aea798f
HTask/TaskList fix (on going)
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
1424
diff
changeset
|
334 me->post_func(s, me->post_arg1, me->post_arg2); |
8cf62aea798f
HTask/TaskList fix (on going)
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
1424
diff
changeset
|
335 check_task_finish(me, wait_queue); |
830 | 336 } |
337 } | |
109 | 338 |
830 | 339 /** |
340 * @brief waitTaskqueue への挿入 。必須ではない。 | |
341 * 現状では、dead lock 検出にしか使ってない | |
342 * | |
343 * @param [task] 終了したタスク | |
344 */ | |
109 | 345 void |
498
bce667ff20b9
double linked HTaskInfo/HTask
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
497
diff
changeset
|
346 TaskManagerImpl::append_waitTask(HTaskPtr q) |
109 | 347 { |
479
bf2d2625485e
Double Linked List base TaskQueue
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
475
diff
changeset
|
348 waitTaskQueue ->addLast(q); |
109 | 349 } |
350 | |
830 | 351 /** |
1542
9ccfdc408d51
fix gpu word count.but not count line num.
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
1492
diff
changeset
|
352 @brief htask のTaskListを DMA でCPUに渡すための TaskListQueue に入れる |
9ccfdc408d51
fix gpu word count.but not count line num.
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
1492
diff
changeset
|
353 @param htask |
9ccfdc408d51
fix gpu word count.but not count line num.
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
1492
diff
changeset
|
354 @param taskList |
830 | 355 */ |
806 | 356 void |
1423
515a0f15b5d2
add to log taskdependency
Daichi TOMA <toma@cr.ie.u-ryukyu.ac.jp>
parents:
1230
diff
changeset
|
357 TaskManagerImpl::set_taskList(HTaskPtr htask, QueueInfo<TaskList> * taskList) |
515a0f15b5d2
add to log taskdependency
Daichi TOMA <toma@cr.ie.u-ryukyu.ac.jp>
parents:
1230
diff
changeset
|
358 { |
1479
163220e54cc0
remove hard code for TaskLog
Daichi TOMA <toma@cr.ie.u-ryukyu.ac.jp>
parents:
1474
diff
changeset
|
359 if (_export_task_log) |
1989 | 360 tasklog->execute_time = rdtsc(); |
1542
9ccfdc408d51
fix gpu word count.but not count line num.
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
1492
diff
changeset
|
361 |
1462
8cf62aea798f
HTask/TaskList fix (on going)
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
1424
diff
changeset
|
362 TaskListPtr tl = (TaskList*)htask->rbuf; |
8cf62aea798f
HTask/TaskList fix (on going)
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
1424
diff
changeset
|
363 while(tl->prev) tl=tl->prev; |
8cf62aea798f
HTask/TaskList fix (on going)
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
1424
diff
changeset
|
364 while(tl) { |
8cf62aea798f
HTask/TaskList fix (on going)
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
1424
diff
changeset
|
365 TaskListPtr next = tl->next; |
8cf62aea798f
HTask/TaskList fix (on going)
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
1424
diff
changeset
|
366 taskList->addLast(tl); |
8cf62aea798f
HTask/TaskList fix (on going)
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
1424
diff
changeset
|
367 tl = next; |
806 | 368 } |
369 } | |
1561
e8c9a7099bcc
add set NDRange param
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
1551
diff
changeset
|
370 |
1543 | 371 void |
372 error(const char *error_message) | |
373 { | |
374 fprintf(stderr,"%s \n",error_message); | |
375 exit(1); | |
376 } | |
54 | 377 |
479
bf2d2625485e
Double Linked List base TaskQueue
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
475
diff
changeset
|
378 /* end */ |