Mercurial > hg > Game > Cerium
annotate TaskManager/kernel/ppe/CpuThreads.cc @ 1599:549d0961980b draft
fix
author | one |
---|---|
date | Tue, 02 Apr 2013 19:01:35 +0900 |
parents | 046695c73cb0 |
children | 5b99bcc6bdb0 |
rev | line source |
---|---|
817 | 1 #include <stdlib.h> |
2 #include "types.h" | |
3 #include "CpuThreads.h" | |
1482 | 4 #ifdef __CERIUM_GPU__ |
5 #include "GpuThreads.h" | |
6 #endif | |
817 | 7 #include "MainScheduler.h" |
8 #include "SysFunc.h" | |
9 #include "SchedNop.h" | |
1179 | 10 #include "SpeTaskManagerImpl.h" |
1310 | 11 #include "CellScheduler.h" |
1522
027d99ecb50e
run example/many_task
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
1501
diff
changeset
|
12 #include <fcntl.h> |
1482 | 13 |
1310 | 14 SchedExternTask(ShowTime); |
15 SchedExternTask(StartProfile); | |
817 | 16 |
1561
e8c9a7099bcc
add set NDRange param
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
1524
diff
changeset
|
17 CpuThreads::CpuThreads(int num, int useRefDma, int start_id) : cpu_num(num), use_refdma(useRefDma), id_offset(start_id){ |
1477
5ca4e9469c65
remove GpuTaskManagerImpl
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
1362
diff
changeset
|
18 #ifdef __CERIUM_GPU__ |
1482 | 19 gpu = new GpuThreads(useRefDma); |
1477
5ca4e9469c65
remove GpuTaskManagerImpl
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
1362
diff
changeset
|
20 #endif |
1181 | 21 threads = new pthread_t[cpu_num]; |
22 args = new cpu_thread_arg_t[cpu_num]; | |
1499 | 23 wait = new Sem(0); |
1181 | 24 |
25 } | |
817 | 26 |
27 CpuThreads::~CpuThreads() | |
28 { | |
29 memaddr mail = (memaddr)MY_SPE_COMMAND_EXIT; | |
1561
e8c9a7099bcc
add set NDRange param
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
1524
diff
changeset
|
30 |
817 | 31 for (int i = 0; i < cpu_num; i++) { |
1501
8d6fee66ff65
it looks like working...
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
1499
diff
changeset
|
32 send_mail(i+id_offset, 1, &mail); |
817 | 33 } |
34 | |
35 for (int i = 0; i < cpu_num; i++) { | |
1499 | 36 pthread_join(threads[i], NULL); |
37 } | |
1179 | 38 |
39 for (int i = 0; i < cpu_num; i++) { | |
1522
027d99ecb50e
run example/many_task
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
1501
diff
changeset
|
40 delete args[i].scheduler; |
817 | 41 } |
42 | |
43 delete [] threads; | |
44 delete [] args; | |
1477
5ca4e9469c65
remove GpuTaskManagerImpl
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
1362
diff
changeset
|
45 #ifdef __CERIUM_GPU__ |
1487
6b451d72daf5
normal task run on GPU.
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
1483
diff
changeset
|
46 delete gpu; |
1477
5ca4e9469c65
remove GpuTaskManagerImpl
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
1362
diff
changeset
|
47 #endif |
817 | 48 } |
49 | |
50 void * | |
51 CpuThreads::cpu_thread_run(void *args) | |
52 { | |
53 cpu_thread_arg_t *argt = (cpu_thread_arg_t *) args; | |
54 Scheduler *c_scheduler = argt->scheduler; | |
55 | |
1179 | 56 TaskManagerImpl *manager = new SpeTaskManagerImpl(); |
1229
424c1f16e704
add args useRefDma
Daichi TOMA <e085740@ie.u-ryukyu.ac.jp>
parents:
1182
diff
changeset
|
57 c_scheduler->init(manager,argt->useRefDma); |
1179 | 58 c_scheduler->id = (int)argt->cpuid; |
817 | 59 |
1179 | 60 manager->set_scheduler(c_scheduler); |
1310 | 61 SchedRegister(ShowTime); |
62 SchedRegister(StartProfile); | |
817 | 63 |
1522
027d99ecb50e
run example/many_task
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
1501
diff
changeset
|
64 argt->wait->sem_v(); //準備完了したスレッドができるたびに+1していく |
1181 | 65 |
817 | 66 c_scheduler->run(new SchedNop()); |
67 c_scheduler->finish(); | |
68 | |
69 return NULL; | |
70 } | |
71 | |
1561
e8c9a7099bcc
add set NDRange param
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
1524
diff
changeset
|
72 |
817 | 73 void |
74 CpuThreads::init() | |
75 { | |
1482 | 76 #ifdef __CERIUM_GPU__ |
77 gpu->set_wait(wait); | |
78 gpu->init(); | |
79 wait->sem_p(); | |
80 #endif | |
81 | |
1499 | 82 for (int i = 0; i < cpu_num; i++) { |
83 args[i].cpuid = i + id_offset; | |
84 args[i].scheduler = new MainScheduler(); | |
85 args[i].wait = wait; | |
86 args[i].useRefDma = use_refdma; | |
87 } | |
1362
6b4a0846afcb
Spe Threads Init moved
Daichi TOMA <toma@cr.ie.u-ryukyu.ac.jp>
parents:
1310
diff
changeset
|
88 |
817 | 89 for (int i = 0; i < cpu_num; i++) { |
1522
027d99ecb50e
run example/many_task
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
1501
diff
changeset
|
90 pthread_create(&threads[i], NULL, |
027d99ecb50e
run example/many_task
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
1501
diff
changeset
|
91 &cpu_thread_run, (void*)&args[i]); |
817 | 92 } |
93 | |
94 for (int i = 0; i < cpu_num; i++) { | |
1522
027d99ecb50e
run example/many_task
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
1501
diff
changeset
|
95 wait->sem_p(); |
817 | 96 } |
97 } | |
98 | |
1561
e8c9a7099bcc
add set NDRange param
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
1524
diff
changeset
|
99 void |
e8c9a7099bcc
add set NDRange param
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
1524
diff
changeset
|
100 CpuThreads::set_NDRange(void *ndr) { |
e8c9a7099bcc
add set NDRange param
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
1524
diff
changeset
|
101 gpu->set_NDRange(ndr); |
e8c9a7099bcc
add set NDRange param
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
1524
diff
changeset
|
102 } |
e8c9a7099bcc
add set NDRange param
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
1524
diff
changeset
|
103 |
1580
806b4658ced6
add multi dimension
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
1561
diff
changeset
|
104 void |
806b4658ced6
add multi dimension
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
1561
diff
changeset
|
105 CpuThreads::spawn_task(int cpu_num, TaskListPtr p) { |
806b4658ced6
add multi dimension
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
1561
diff
changeset
|
106 if (p->dim>0) { |
1581
8ee897303cd0
fix multi_dimention
Shohei KOKUBO <e105744@ie.u-ryukyu.ac.jp>
parents:
1580
diff
changeset
|
107 int dim_count = (p->x+1)*(p->y+1)*(p->z+1); |
1582
046695c73cb0
add min_cpu(), max_cpu() (Who implements these?)
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
1581
diff
changeset
|
108 if (cpu_num < dim_count) |
1581
8ee897303cd0
fix multi_dimention
Shohei KOKUBO <e105744@ie.u-ryukyu.ac.jp>
parents:
1580
diff
changeset
|
109 p->self->flag.dim_count = cpu_num; |
1580
806b4658ced6
add multi dimension
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
1561
diff
changeset
|
110 for (int i = 0; i < cpu_num; i++) { |
1599 | 111 send_mail(i+SPE_0,1,(memaddr*)&p); // i+min_cpu() |
1580
806b4658ced6
add multi dimension
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
1561
diff
changeset
|
112 } |
806b4658ced6
add multi dimension
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
1561
diff
changeset
|
113 } else { |
1599 | 114 send_mail(cpu_num,1,(memaddr*)&p); |
1580
806b4658ced6
add multi dimension
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
1561
diff
changeset
|
115 } |
806b4658ced6
add multi dimension
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
1561
diff
changeset
|
116 } |
806b4658ced6
add multi dimension
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
1561
diff
changeset
|
117 |
817 | 118 /** |
119 * このCPU からのメールを受信する。 | |
120 * | |
121 * @param [cpuid] SPE ID | |
122 * | |
123 * @return Received 32-bit mailbox messages | |
124 * if ([ret] < 0) no data read | |
125 */ | |
126 int | |
127 CpuThreads::get_mail(int cpuid, int count, memaddr *ret) | |
1522
027d99ecb50e
run example/many_task
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
1501
diff
changeset
|
128 { |
1483
f402f6444237
create gpuTaskinit
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
1482
diff
changeset
|
129 #ifdef __CERIUM_GPU__ |
1499 | 130 if (is_gpu(cpuid)) return gpu->get_mail(cpuid, count, ret); |
1483
f402f6444237
create gpuTaskinit
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
1482
diff
changeset
|
131 #endif |
f402f6444237
create gpuTaskinit
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
1482
diff
changeset
|
132 *ret = args[cpuid-id_offset].scheduler->mail_read_from_host(); |
f402f6444237
create gpuTaskinit
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
1482
diff
changeset
|
133 return 1; |
817 | 134 } |
135 | |
136 int | |
137 CpuThreads::has_mail(int cpuid, int count, memaddr *ret) | |
138 { | |
1483
f402f6444237
create gpuTaskinit
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
1482
diff
changeset
|
139 #ifdef __CERIUM_GPU__ |
1499 | 140 if (is_gpu(cpuid)) return gpu->has_mail(cpuid, count, ret); |
1483
f402f6444237
create gpuTaskinit
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
1482
diff
changeset
|
141 #endif |
f402f6444237
create gpuTaskinit
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
1482
diff
changeset
|
142 if (args[cpuid-id_offset].scheduler->has_mail_from_host() != 0) { |
f402f6444237
create gpuTaskinit
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
1482
diff
changeset
|
143 return get_mail(cpuid,count,ret); |
1480
f2512fb94223
GpuTaskManager no compile error
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
1478
diff
changeset
|
144 } else { |
1483
f402f6444237
create gpuTaskinit
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
1482
diff
changeset
|
145 return 0; //mailがないとき0を返す |
1480
f2512fb94223
GpuTaskManager no compile error
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
1478
diff
changeset
|
146 } |
1522
027d99ecb50e
run example/many_task
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
1501
diff
changeset
|
147 |
817 | 148 } |
149 /** | |
150 * Inbound Mailbox | |
151 * メール送信 Front End -> CPU | |
152 * | |
153 * なるべく NONBLOCKING なんだけど、 | |
154 * Inbound Mailbox キューに空きがないと送信できないので | |
155 * 送信する数だけ空いているか確認してから送る。空いて無い場合は待つ。 | |
156 * | |
157 * 結局待つんだよな。しかも ALL_BLOCKING って実は busy wait だったりするし | |
158 * | |
159 * @param [cpuid] SPE ID | |
160 * @param [data] Send 32-bit mailbox messages | |
161 * @param [num] The number of messages | |
162 */ | |
163 void | |
164 CpuThreads::send_mail(int cpuid, int num, memaddr *data) | |
165 { | |
1483
f402f6444237
create gpuTaskinit
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
1482
diff
changeset
|
166 #ifdef __CERIUM_GPU__ |
1499 | 167 if (is_gpu(cpuid)){ |
1481 | 168 gpu->send_mail(cpuid, num, data); |
1483
f402f6444237
create gpuTaskinit
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
1482
diff
changeset
|
169 return; |
1480
f2512fb94223
GpuTaskManager no compile error
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
1478
diff
changeset
|
170 } |
1483
f402f6444237
create gpuTaskinit
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
1482
diff
changeset
|
171 #endif |
f402f6444237
create gpuTaskinit
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
1482
diff
changeset
|
172 args[cpuid-id_offset].scheduler->mail_write_from_host(*data); |
817 | 173 } |
174 | |
1179 | 175 void |
176 CpuThreads::add_output_tasklist(int command, memaddr buff, int alloc_size) | |
177 { | |
178 /* | |
179 * output TaskList が無ければ新しく作る | |
180 * あれば TaskList に allocate した Task を追加 | |
181 * command に対応した Task の初期化を実行する | |
182 * SPE に data が書き出し終わった後に PPE 側で初期化 | |
183 */ | |
184 } | |
817 | 185 |
1501
8d6fee66ff65
it looks like working...
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
1499
diff
changeset
|
186 //GPUなら1を返す |
1480
f2512fb94223
GpuTaskManager no compile error
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
1478
diff
changeset
|
187 int |
1499 | 188 CpuThreads::is_gpu(int cpuid) |
1480
f2512fb94223
GpuTaskManager no compile error
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
1478
diff
changeset
|
189 { |
1501
8d6fee66ff65
it looks like working...
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
1499
diff
changeset
|
190 if ( cpuid < id_offset ) { |
8d6fee66ff65
it looks like working...
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
1499
diff
changeset
|
191 return 1; |
8d6fee66ff65
it looks like working...
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
1499
diff
changeset
|
192 } else { |
1480
f2512fb94223
GpuTaskManager no compile error
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
1478
diff
changeset
|
193 return 0; |
f2512fb94223
GpuTaskManager no compile error
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
1478
diff
changeset
|
194 } |
f2512fb94223
GpuTaskManager no compile error
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
1478
diff
changeset
|
195 } |
f2512fb94223
GpuTaskManager no compile error
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
1478
diff
changeset
|
196 |
817 | 197 /* end */ |