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