comparison example/regex_mas/main.cc @ 1956:b52fe4cceff3 draft

rename divide read to block read
author Masataka Kohagura <e085726@ie.u-ryukyu.ac.jp>
date Fri, 07 Feb 2014 15:52:23 +0900
parents 2573919e0d72
children 59fc5bd0967f
comparison
equal deleted inserted replaced
1955:2573919e0d72 1956:b52fe4cceff3
27 int use_task_creater = 0; 27 int use_task_creater = 0;
28 int use_compat = 0; 28 int use_compat = 0;
29 int div_read = 0; 29 int div_read = 0;
30 int array_task_num = 8; 30 int array_task_num = 8;
31 int spe_num = 1; 31 int spe_num = 1;
32 int divide_read_flag = 0; 32 int block_read_flag = 0;
33 int DIVISION_SIZE = 4*4096; 33 int DIVISION_SIZE = 4*4096;
34 int READ_DIVISION_SIZE = 4*4096 * 1024; 34 int READ_DIVISION_SIZE = 4*4096 * 1024;
35 35
36 unsigned char *sword = 0; 36 unsigned char *sword = 0;
37 int task_count = 0; 37 int task_count = 0;
55 } st_mmap_t; 55 } st_mmap_t;
56 56
57 static void 57 static void
58 my_mmap(char *filename, WordCount *w) 58 my_mmap(char *filename, WordCount *w)
59 { 59 {
60
61 /*マッピングだよ!*/ 60 /*マッピングだよ!*/
62 int map = MAP_PRIVATE; 61 int map = MAP_PRIVATE;
63 st_mmap_t st_mmap; 62 st_mmap_t st_mmap;
64 struct stat sb; 63 struct stat sb;
65 long fd = w->fd; 64 long fd = w->fd;
157 /** 156 /**
158 * このTaskは、PPE上で実行されるので、並列に実行されることはない 157 * このTaskは、PPE上で実行されるので、並列に実行されることはない
159 * 二つ実行されていて、Task が足りなくなることがないようにしている。 158 * 二つ実行されていて、Task が足りなくなることがないようにしている。
160 */ 159 */
161 160
162 SchedDefineTask1(RUN_TASK_BLOCKS,task_run16); 161 SchedDefineTask1(BREAD_RUN_TASK_BLOCKS,bread_run16);
163 162
164 static int 163 static int
165 task_run16(SchedTask *manager, void *in, void *out) 164 bread_run16(SchedTask *manager, void *in, void *out)
166 { 165 {
167 WordCount *w = *(WordCount **)in; 166 WordCount *w = *(WordCount **)in;
168 167
169 HTaskPtr t_read = manager->create_task(READ_TASK); 168 HTaskPtr t_read = manager->create_task(READ_TASK);
170 w->t_print->wait_for(t_read); 169 w->t_print->wait_for(t_read);
182 while (w->size>0) 181 while (w->size>0)
183 run_tasks(manager,w,1,t_read,w->t_print, w->size); 182 run_tasks(manager,w,1,t_read,w->t_print, w->size);
184 183
185 t_read->set_param(2,w->task_spawned*w->division_size); 184 t_read->set_param(2,w->task_spawned*w->division_size);
186 t_read->spawn(); 185 t_read->spawn();
187 // printf("run16 last %d\n",w->task_num);
188 } else { 186 } else {
189 HTaskPtr t_next = manager->create_task(RUN_TASK_BLOCKS, 187 HTaskPtr t_next = manager->create_task(BREAD_RUN_TASK_BLOCKS,
190 (memaddr)&w->self,sizeof(memaddr),0,0); 188 (memaddr)&w->self,sizeof(memaddr),0,0);
191 w->t_print->wait_for(t_next); 189 w->t_print->wait_for(t_next);
192 190
193 t_read->set_param(1,w->task_spawned*w->division_size); 191 t_read->set_param(1,w->task_spawned*w->division_size);
194 t_read->set_outData(0, w->file_mmap + w->task_spawned * w->division_size, w->task_blocks * w->division_size); 192 t_read->set_outData(0, w->file_mmap + w->task_spawned * w->division_size, w->task_blocks * w->division_size);
197 195
198 t_read->set_param(2,w->task_spawned*w->division_size + w->extra_len); 196 t_read->set_param(2,w->task_spawned*w->division_size + w->extra_len);
199 197
200 t_read->spawn(); 198 t_read->spawn();
201 t_next->spawn(); 199 t_next->spawn();
202 // printf("run16 next %d\n",w->task_num); 200 }
201 return 0;
202 }
203
204 SchedDefineTask1(MMAP_RUN_TASK_BLOCKS,mmap_run16);
205
206 static int
207 mmap_run16(SchedTask *manager, void *in, void *out)
208 {
209 WordCount *w = *(WordCount **)in;
210
211 if (w->task_num < w->task_blocks) {
212 // last case
213 while (w->size >= w->division_size)
214 run_tasks(manager,w,w->task_num,0, w->t_print, w->division_size + w->extra_len);
215 // remaining data
216 while (w->size>0)
217 run_tasks(manager,w,1,0,w->t_print, w->size);
218 } else {
219 HTaskPtr t_next = manager->create_task(MMAP_RUN_TASK_BLOCKS,
220 (memaddr)&w->self,sizeof(memaddr),0,0);
221 w->t_print->wait_for(t_next);
222
223 run_tasks(manager,w, w->task_blocks,0, t_next, w->division_size + w->extra_len);
224
225 t_next->spawn();
203 } 226 }
204 return 0; 227 return 0;
205 } 228 }
206 229
207 230
245 w->self = w; 268 w->self = w;
246 w->fd = fd; 269 w->fd = fd;
247 w->read_filesize = sb->st_size; 270 w->read_filesize = sb->st_size;
248 271
249 272
250 if (divide_read_flag != 0) { 273 if (block_read_flag == 1) {
251 printf("[divide read mode]\n"); 274 printf("[block read mode]\n");
252 w->file_mmap = (char*)manager->allocate(w->read_filesize); 275 w->file_mmap = (char*)manager->allocate(w->read_filesize);
253 }else { 276 }else {
254 printf("[mmap mode]\n"); 277 printf("[mmap mode]\n");
255 my_mmap(filename, w); 278 my_mmap(filename, w);
256 } 279 }
268 291
269 //w->task_blocks = blocks; 292 //w->task_blocks = blocks;
270 w->self = w; 293 w->self = w;
271 w->task_spawned = 0; 294 w->task_spawned = 0;
272 295
273 /*sizeはdivision_sizeの倍数にしている。*/
274 w->size = w->file_size = w->read_filesize; 296 w->size = w->file_size = w->read_filesize;
275 //w->file_mmap = st_mmap.file_mmap;
276 printf("w %lx\n",(long)w); 297 printf("w %lx\n",(long)w);
277 298
278 /* 1task分のデータサイズ(byte) */ 299 /* 1task分のデータサイズ(byte) */
279 if (w->size >= 1024*division) { 300 if (w->size >= 1024*division) {
280 w->division_size = 1024 * division;/*16kbyte*/ 301 w->division_size = 1024 * division;/*16kbyte*/
317 w->t_print = t_print; 338 w->t_print = t_print;
318 339
319 for(int i=0;i<1;i++) { 340 for(int i=0;i<1;i++) {
320 /* Task を task_blocks ずつ起動する Task */ 341 /* Task を task_blocks ずつ起動する Task */
321 /* serialize されていると仮定する... */ 342 /* serialize されていると仮定する... */
322 t_exec = manager->create_task(RUN_TASK_BLOCKS, 343 if (block_read_flag == 1) {
323 (memaddr)&w->self,sizeof(memaddr),0,0); 344 t_exec = manager->create_task(BREAD_RUN_TASK_BLOCKS,
345 (memaddr)&w->self,sizeof(memaddr),0,0);
346 }else {
347 t_exec = manager->create_task(MMAP_RUN_TASK_BLOCKS,
348 (memaddr)&w->self,sizeof(memaddr),0,0);
349 }
350
324 t_print->wait_for(t_exec); 351 t_print->wait_for(t_exec);
325 // t_exec->iterate(4); 352 // t_exec->iterate(4);
326 t_exec->spawn(); 353 t_exec->spawn();
327 } 354 }
328 w->t_exec = t_exec; 355 w->t_exec = t_exec;
363 } else if (strcmp(argv[i], "-cpu") == 0) { 390 } else if (strcmp(argv[i], "-cpu") == 0) {
364 spe_num = atoi(argv[i+1]); 391 spe_num = atoi(argv[i+1]);
365 if (spe_num==0) spe_num = 1; 392 if (spe_num==0) spe_num = 1;
366 } else if (strcmp(argv[i], "-sw") == 0) { 393 } else if (strcmp(argv[i], "-sw") == 0) {
367 sword = (unsigned char*)argv[i+1]; 394 sword = (unsigned char*)argv[i+1];
368 } else if (strcmp(argv[i], "-dr") == 0) { 395 } else if (strcmp(argv[i], "-br") == 0) {
369 divide_read_flag = 1; 396 block_read_flag = 1;
370 } 397 }
371 } 398 }
372 if ((filename==0) || (sword==0)) { 399 if ((filename==0) || (sword==0)) {
373 puts(usr_help_str); 400 puts(usr_help_str);
374 exit(1); 401 exit(1);