Mercurial > hg > Game > Cerium
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); |