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