Mercurial > hg > Game > Cerium
comparison example/regex_mas/main.cc @ 1680:e44e5a18392c draft
fix regex_mas.
author | Masataka Kohagura <e085726@ie.u-ryukyu.ac.jp> |
---|---|
date | Tue, 06 Aug 2013 05:00:04 +0900 |
parents | 342c36d5582e |
children | 7bc7780e8ece |
comparison
equal
deleted
inserted
replaced
1679:ff43dc274ec9 | 1680:e44e5a18392c |
---|---|
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 2 //多く取ってくる文字数(search word length - 1) | 15 #define EXTRA_LENGTH 4 //多く取ってくる文字数(search word length - 1) |
16 | 16 |
17 /* ;TODO | 17 /* ;TODO |
18 * PS3でCPU数が2以上の時に、あまりが計算されてない | 18 * PS3でCPU数が2以上の時に、あまりが計算されてない |
19 */ | 19 */ |
20 | 20 |
228 for (int k = 0; k < spe_num; k++) { | 228 for (int k = 0; k < spe_num; k++) { |
229 | 229 |
230 int a = w->task_spwaned++; | 230 int a = w->task_spwaned++; |
231 | 231 |
232 if (w->size < size) size = w->size; | 232 if (w->size < size) size = w->size; |
233 int length = size/sizeof(char); | 233 |
234 int set_one_task_length = size/sizeof(char); | |
234 const int ONE_TASK_LENGTH = w->division_size; | 235 const int ONE_TASK_LENGTH = w->division_size; |
235 | |
236 t_exec[k] = task_array[k]->next_task_array(TASK_EXEC,t_exec[k]); | |
237 const int ONE_LOOP_LENGTH = array_task_num*spe_num*ONE_TASK_LENGTH; | 236 const int ONE_LOOP_LENGTH = array_task_num*spe_num*ONE_TASK_LENGTH; |
238 const int ARRAY_LENGTH_SIZE = spe_num * ONE_TASK_LENGTH; | 237 const int ARRAY_LENGTH_SIZE = spe_num * ONE_TASK_LENGTH; |
239 int offset = ONE_LOOP_LENGTH * i + ARRAY_LENGTH_SIZE*j + ONE_TASK_LENGTH*k; | 238 int offset = ONE_LOOP_LENGTH * i + ARRAY_LENGTH_SIZE*j + ONE_TASK_LENGTH*k; |
240 t_exec[k]->set_param(0,(memaddr)length); | 239 |
241 t_exec[k]->set_param(1,(memaddr)offset); | 240 t_exec[k] = task_array[k]->next_task_array(TASK_EXEC,t_exec[k]); |
242 if(size != w->size){ //ラストのタスクかどうかの判定 | 241 t_exec[k]->set_param(0,(memaddr)offset); |
242 | |
243 /*set_inDataで多めに文字を取ってきているが、 | |
244 *Exec.ccに文字列検索をさせるときにはset_param(1)で | |
245 *設定した文字列しか検索してくれないようになっている。 | |
246 */ | |
247 if(size != w->size){ //最後のタスクかどうかの判定 | |
248 t_exec[k]->set_param(1,(memaddr)set_one_task_length + EXTRA_LENGTH); | |
243 t_exec[k]->set_inData(0,w->file_mmap + a*w->division_size, size+EXTRA_LENGTH); | 249 t_exec[k]->set_inData(0,w->file_mmap + a*w->division_size, size+EXTRA_LENGTH); |
244 }else{ | 250 }else{ |
251 t_exec[k]->set_param(1,(memaddr)set_one_task_length); | |
245 t_exec[k]->set_inData(0,w->file_mmap + a*w->division_size, size); | 252 t_exec[k]->set_inData(0,w->file_mmap + a*w->division_size, size); |
246 } | 253 } |
247 t_exec[k]->set_outData(0,w->o_data + a*w->out_size, w->division_out_size); | 254 t_exec[k]->set_outData(0,w->o_data + a*w->out_size, w->division_out_size); |
248 | 255 |
249 w->size -= size; | 256 w->size -= size; |
369 w->division_size = 1024 * division;/*16kbyte*/ | 376 w->division_size = 1024 * division;/*16kbyte*/ |
370 } else { | 377 } else { |
371 w->division_size = w->size; | 378 w->division_size = w->size; |
372 } | 379 } |
373 | 380 |
374 /* "word num" and "line num" */ | 381 /* exec output only "match_num" */ |
375 w->status_num = 2; | 382 w->status_num = 1; |
376 /* taskの数 */ | 383 /* taskの数 */ |
377 w->task_num = w->size / w->division_size; | 384 w->task_num = w->size / w->division_size; |
378 w->task_num = w->task_num + (w->division_size*w->task_num < w->size); | 385 w->task_num = w->task_num + (w->division_size*w->task_num < w->size); |
379 int out_task_num = w->task_num; | 386 int out_task_num = w->task_num; |
380 | 387 |