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