Mercurial > hg > Game > Cerium
comparison example/regex_mas/main.cc @ 1676:342c36d5582e draft
fix bug
author | Masataka Kohagura <e085726@ie.u-ryukyu.ac.jp> |
---|---|
date | Tue, 23 Jul 2013 17:02:07 +0900 |
parents | 99f8130793b4 |
children | e44e5a18392c |
comparison
equal
deleted
inserted
replaced
1675:07ff7ec2a61b | 1676:342c36d5582e |
---|---|
10 #include "TaskManager.h" | 10 #include "TaskManager.h" |
11 #include "SchedTask.h" | 11 #include "SchedTask.h" |
12 #include "Func.h" | 12 #include "Func.h" |
13 #include "WordCount.h" | 13 #include "WordCount.h" |
14 | 14 |
15 #define EXTRA_LENGTH 4 //多く取ってくる文字数(search word length - 1) | 15 #define EXTRA_LENGTH 2 //多く取ってくる文字数(search word length - 1) |
16 | 16 |
17 /* ;TODO | 17 /* ;TODO |
18 * PS3でCPU数が2以上の時に、あまりが計算されてない | 18 * PS3でCPU数が2以上の時に、あまりが計算されてない |
19 */ | 19 */ |
20 | 20 |
206 int spl = spe_num * array_task_num; | 206 int spl = spe_num * array_task_num; |
207 int loop = (task_count + spl - 1) / spl; | 207 int loop = (task_count + spl - 1) / spl; |
208 | 208 |
209 for (int i = 0; i < loop; i += 1) { | 209 for (int i = 0; i < loop; i += 1) { |
210 | 210 |
211 if (spl > w->task_num) { | 211 if (w->task_num < spe_num) spe_num = w->task_num; |
212 if (w->task_num >= spe_num) { | |
213 array_task_num = w->task_num / spe_num; | |
214 } else { | |
215 | |
216 int task_num = w->task_num; | |
217 | |
218 for (int j = 0; j < task_num; j++) { | |
219 HTask *h_exec = 0; | |
220 int i = w->task_spwaned++; | |
221 | |
222 if (w->size < size) size = w->size; | |
223 | |
224 h_exec = manager->create_task(TASK_EXEC, | |
225 (memaddr)(w->file_mmap + i*w->division_size), size, | |
226 (memaddr)(w->o_data + i*w->out_size), w->division_out_size); | |
227 | |
228 if (all) { | |
229 w->t_print->wait_for(h_exec); | |
230 } else { | |
231 t_next->wait_for(h_exec); | |
232 } | |
233 | |
234 h_exec->set_cpu(spe_cpu); | |
235 h_exec->spawn(); | |
236 | |
237 w->size -= size; | |
238 if (w->size == 0) break; | |
239 w->task_num--; | |
240 | |
241 } | |
242 | |
243 return; | |
244 } | |
245 } | |
246 | 212 |
247 // ここから | 213 // ここから |
248 HTask **task_array = (HTask**)manager->allocate(sizeof(HTask*)*spe_num); | 214 HTask **task_array = (HTask**)manager->allocate(sizeof(HTask*)*spe_num); |
249 Task **t_exec = (Task**)manager->allocate(sizeof(Task*)*spe_num); | 215 Task **t_exec = (Task**)manager->allocate(sizeof(Task*)*spe_num); |
250 | 216 |
271 const int ONE_LOOP_LENGTH = array_task_num*spe_num*ONE_TASK_LENGTH; | 237 const int ONE_LOOP_LENGTH = array_task_num*spe_num*ONE_TASK_LENGTH; |
272 const int ARRAY_LENGTH_SIZE = spe_num * ONE_TASK_LENGTH; | 238 const int ARRAY_LENGTH_SIZE = spe_num * ONE_TASK_LENGTH; |
273 int offset = ONE_LOOP_LENGTH * i + ARRAY_LENGTH_SIZE*j + ONE_TASK_LENGTH*k; | 239 int offset = ONE_LOOP_LENGTH * i + ARRAY_LENGTH_SIZE*j + ONE_TASK_LENGTH*k; |
274 t_exec[k]->set_param(0,(memaddr)length); | 240 t_exec[k]->set_param(0,(memaddr)length); |
275 t_exec[k]->set_param(1,(memaddr)offset); | 241 t_exec[k]->set_param(1,(memaddr)offset); |
276 //printf("%s\n",search_word); | |
277 if(size != w->size){ //ラストのタスクかどうかの判定 | 242 if(size != w->size){ //ラストのタスクかどうかの判定 |
278 t_exec[k]->set_inData(0,w->file_mmap + a*w->division_size, size+EXTRA_LENGTH); | 243 t_exec[k]->set_inData(0,w->file_mmap + a*w->division_size, size+EXTRA_LENGTH); |
279 }else{ | 244 }else{ |
280 t_exec[k]->set_inData(0,w->file_mmap + a*w->division_size, size); | 245 t_exec[k]->set_inData(0,w->file_mmap + a*w->division_size, size); |
281 } | 246 } |