Mercurial > hg > Game > Cerium
annotate TaskManager/Cell/SpeThreads.cc @ 1671:6b34346cf23a draft
SPE
author | Shinji KONO <kono@ie.u-ryukyu.ac.jp> |
---|---|
date | Thu, 18 Jul 2013 10:35:40 +0900 |
parents | 90c0ad32655f |
children | ab37578f03c3 |
rev | line source |
---|---|
109 | 1 #include <stdlib.h> |
76 | 2 #include "types.h" |
65 | 3 #include "SpeThreads.h" |
736 | 4 #include "Scheduler.h" |
65 | 5 |
824 | 6 |
806 | 7 SpeThreads::SpeThreads(int num) : cpu_num(num) {} |
65 | 8 |
76 | 9 SpeThreads::~SpeThreads(void) |
10 { | |
631
30dd8a3deb4a
Cell 64 bit tried, but not yet worked.
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
621
diff
changeset
|
11 memaddr mail = (memaddr)MY_SPE_COMMAND_EXIT; |
76 | 12 int ret; |
13 | |
806 | 14 for (int i = 0; i < cpu_num; i++) { |
244 | 15 send_mail(i, 1, &mail); |
76 | 16 } |
17 | |
806 | 18 for (int i = 0; i < cpu_num; i++) { |
1585 | 19 pthread_join(threads[i], NULL); |
20 ret = spe_context_destroy(spe_ctx[i]); | |
21 if (ret) { | |
22 perror("[~SpeThreads] spe_context_destroy"); | |
23 } | |
76 | 24 } |
25 | |
26 spe_image_close(spe_handle); | |
27 | |
28 delete [] spe_ctx; | |
29 delete [] threads; | |
30 delete [] args; | |
31 } | |
32 | |
65 | 33 void* |
34 SpeThreads::spe_thread_run(void *arg) | |
35 { | |
36 unsigned int entry = SPE_DEFAULT_ENTRY; | |
109 | 37 //spe_context_ptr_t ctx = (spe_context_ptr_t)arg; |
38 thread_arg_t *arg_t = (thread_arg_t *)arg; | |
39 | |
40 spe_stop_info_t stop_info; | |
41 unsigned long long status; | |
42 | |
43 spe_context_run(arg_t->ctx, &entry, 0, (void*)arg_t->speid, NULL, &stop_info); | |
65 | 44 |
109 | 45 status = ((stop_info.result.spe_exit_code & 0xff) << 8) |
1585 | 46 | (stop_info.result.spe_signal_code & 0xff); |
109 | 47 |
48 switch(stop_info.stop_reason) { | |
736 | 49 case SPE_EXIT: |
1585 | 50 break; |
109 | 51 case SPE_STOP_AND_SIGNAL: |
1585 | 52 printf("[SPE %d] SPE_STOP_AND_SIGNAL stop_info.result.stop_signal_code=%d\n", arg_t->speid, stop_info.result.spe_signal_code); |
53 break; | |
109 | 54 case SPE_RUNTIME_ERROR: |
1585 | 55 printf("[SPE %d] SPE_RUNTIME_ERROR stop_info.result.spe_runtime_error=%d\n", arg_t->speid, stop_info.result.spe_runtime_error); |
56 break; | |
109 | 57 case SPE_RUNTIME_EXCEPTION: |
1585 | 58 printf("[SPE %d] SPE_RUNTIME_EXCEPTION stop_info.result.spe_runtime_exception=%d\n", arg_t->speid, stop_info.result.spe_runtime_exception); |
59 break; | |
109 | 60 } |
65 | 61 |
62 pthread_exit(NULL); | |
63 } | |
64 | |
65 void* | |
66 SpeThreads::frontend_thread_run(void *arg) | |
67 { | |
68 pthread_t thread; | |
69 thread_arg_t *arg_t = (thread_arg_t *)arg; | |
70 | |
71 pthread_create(&thread, NULL, &spe_thread_run, (void*)arg_t->ctx); | |
72 | |
321 | 73 // mail read の blocking ができれば |
74 // ここで呼んだ方が早い。 | |
76 | 75 |
65 | 76 pthread_exit(NULL); |
77 } | |
78 | |
79 void | |
80 SpeThreads::init(void) | |
81 { | |
109 | 82 spe_handle = spe_image_open(SPE_ELF); |
65 | 83 |
109 | 84 if (spe_handle == NULL) { |
1585 | 85 perror("spe_image_open"); |
86 exit(EXIT_FAILURE); | |
109 | 87 } |
65 | 88 |
806 | 89 spe_ctx = new spe_context_ptr_t[cpu_num]; |
90 threads = new pthread_t[cpu_num]; | |
91 args = new thread_arg_t[cpu_num]; | |
65 | 92 |
806 | 93 for (int i = 0; i < cpu_num; i++) { |
1585 | 94 args[i].speid = i; |
95 spe_ctx[i] = spe_context_create(0, NULL); | |
96 spe_program_load(spe_ctx[i], spe_handle); | |
97 args[i].ctx = spe_ctx[i]; | |
65 | 98 } |
99 | |
806 | 100 for (int i = 0; i < cpu_num; i++) { |
1585 | 101 pthread_create(&threads[i], NULL, |
102 &spe_thread_run, (void*)&args[i]); | |
65 | 103 } |
104 } | |
105 | |
1580
806b4658ced6
add multi dimension
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
1015
diff
changeset
|
106 void |
1671 | 107 SpeThreads::spawn_task(int id, TaskListPtr p) { |
108 | |
109 p->self->flag.dim_count = 1; // always dim_count set min cpu. min cpu is 1. | |
110 if (p->dim>0 && id >= SPE_0) { | |
111 int dim_count = (p->x)*(p->y)*(p->z); | |
1585 | 112 if (cpu_num < dim_count) |
1671 | 113 dim_count = cpu_num; |
114 } | |
115 p->slef->flag.dim_count = dim_count; | |
116 for (int i = 0; i < dim_count; i++) { | |
1585 | 117 send_mail(i+SPE_0,1,(memaddr*)p); |
118 } | |
1580
806b4658ced6
add multi dimension
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
1015
diff
changeset
|
119 } else { |
1671 | 120 send_mail(id ,1,(memaddr*)p); |
1580
806b4658ced6
add multi dimension
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
1015
diff
changeset
|
121 } |
806b4658ced6
add multi dimension
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
1015
diff
changeset
|
122 } |
244 | 123 |
109 | 124 /** |
321 | 125 * SPE からのメールを受信する。 |
109 | 126 * |
127 * @param [speid] SPE ID | |
128 * | |
129 * @return Received 32-bit mailbox messages | |
130 * if ([ret] < 0) no data read | |
131 */ | |
621 | 132 int |
631
30dd8a3deb4a
Cell 64 bit tried, but not yet worked.
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
621
diff
changeset
|
133 SpeThreads::get_mail(int speid, int count, memaddr *ret) |
244 | 134 { |
631
30dd8a3deb4a
Cell 64 bit tried, but not yet worked.
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
621
diff
changeset
|
135 // only used in CellTaskManagerImpl (should be removed?) |
30dd8a3deb4a
Cell 64 bit tried, but not yet worked.
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
621
diff
changeset
|
136 return spe_out_mbox_read(spe_ctx[speid], (unsigned int*)ret, count*(sizeof(memaddr)/sizeof(int))); |
244 | 137 } |
138 | |
621 | 139 int |
647
7ba4ad4538b1
MailManager rewrite. not yet worked.
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
631
diff
changeset
|
140 SpeThreads::has_mail(int speid, int count, memaddr *ret) |
65 | 141 { |
1585 | 142 /* |
143 * spe_out_mbox_status return only 1, waiting for multiple length | |
144 * does not work. | |
145 */ | |
604 | 146 if (spe_out_mbox_status(spe_ctx[speid]) >= 1) { |
1585 | 147 return spe_out_mbox_read(spe_ctx[speid], (unsigned int*)ret, count*(sizeof(memaddr)/sizeof(int))); |
244 | 148 } else { |
1585 | 149 return 0; |
244 | 150 } |
65 | 151 } |
66 | 152 |
109 | 153 /** |
154 * Inbound Mailbox | |
321 | 155 * メール送信 PPE -> SPE |
109 | 156 * |
321 | 157 * なるべく NONBLOCKING なんだけど、 |
158 * Inbound Mailbox キューに空きがないと送信できないので | |
159 * 送信する数だけ空いているか確認してから送る。空いて無い場合は待つ。 | |
161
18c42658e0e7
texture の座標がマイナスになったあと、それを 0 にし忘れてた
gongo@localhost.localdomain
parents:
109
diff
changeset
|
160 * |
321 | 161 * 結局待つんだよな。しかも ALL_BLOCKING って実は busy wait だったりするし |
109 | 162 * |
163 * @param [speid] SPE ID | |
164 * @param [data] Send 32-bit mailbox messages | |
165 * @param [num] The number of messages | |
166 */ | |
66 | 167 void |
631
30dd8a3deb4a
Cell 64 bit tried, but not yet worked.
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
621
diff
changeset
|
168 SpeThreads::send_mail(int speid, int num, memaddr *data) |
244 | 169 { |
631
30dd8a3deb4a
Cell 64 bit tried, but not yet worked.
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
621
diff
changeset
|
170 spe_in_mbox_write(spe_ctx[speid], (unsigned int *)data, num*(sizeof(memaddr)/sizeof(int)), SPE_MBOX_ALL_BLOCKING); |
244 | 171 } |
172 | |
173 void | |
631
30dd8a3deb4a
Cell 64 bit tried, but not yet worked.
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
621
diff
changeset
|
174 SpeThreads::add_output_tasklist(int command, memaddr buff, int alloc_size) |
66 | 175 { |
244 | 176 /* |
321 | 177 * output TaskList が無ければ新しく作る |
178 * あれば TaskList に allocate した Task を追加 | |
179 * command に対応した Task の初期化を実行する | |
180 * SPE に data が書き出し終わった後に PPE 側で初期化 | |
244 | 181 */ |
182 | |
66 | 183 } |
604 | 184 |
185 /* end */ |