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