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