Mercurial > hg > Members > kono > Cerium
diff example/word_count/main.cc @ 970:33630c6ff445
change pipeline and TaskArray fast
author | Yutaka Kinjyo <yutaka@cr.ie.u-ryukyu.ac.jp> |
---|---|
date | Thu, 26 Aug 2010 20:38:06 +0900 |
parents | 0a6c5ee89a4c |
children | d093d601fc14 |
line wrap: on
line diff
--- a/example/word_count/main.cc Mon Aug 09 00:09:00 2010 +0900 +++ b/example/word_count/main.cc Thu Aug 26 20:38:06 2010 +0900 @@ -17,6 +17,7 @@ int use_task_array = 1; int use_compat = 0; int array_task_num = 8; +int spe_num = 1; const char *usr_help_str = "Usage: ./word_count [-a -c -s] [-cpu spe_num] [-file filename]\n"; @@ -82,58 +83,105 @@ if (task_count<=0) return; } + + if (use_task_array) { + + int spl = spe_num * array_task_num; + int loop = (task_count + spl - 1) / spl; + + for (int i = 0; i < loop; i += 1) { + + if (spl > w->task_num) { + spe_num = 1; + array_task_num = w->task_num; + } + + + HTask **task_array = (HTask**)manager->allocate(sizeof(HTask*)*spe_num); + Task **t_exec = (Task**)manager->allocate(sizeof(Task*)*spe_num); + + for (int k = 0; k < spe_num; k++) { + task_array[k] = manager->create_task_array(TASK_EXEC,array_task_num,0,1,1); + t_exec[k] = 0; + if (all) { + w->t_print->wait_for(task_array[k]); + } else { + t_next->wait_for(task_array[k]); + } + } + + + for (int j = 0; j < array_task_num; j++) { + for (int k = 0; k < spe_num; k++) { + + int a = w->task_spwaned++; + + if (w->size < size) size = w->size; + + t_exec[k] = task_array[k]->next_task_array(TASK_EXEC,t_exec[k]); + t_exec[k]->set_inData(0,w->file_mmap + a*w->division_size, size); + t_exec[k]->set_outData(0,w->o_data + a*w->out_size, w->division_out_size); + + w->size -= size; + w->task_num--; + } + } + + for (int k = 0; k < spe_num; k++) { + task_array[k]->spawn_task_array(t_exec[k]->next()); + task_array[k]->set_cpu(SPE_ANY); + task_array[k]->spawn(); + } + + } + + return; + + } + + for (int i = 0; i < task_count; i += array_task_num) { - - HTask *task_array; - if (use_task_array) { - int task_num = (w->size+size-1)/size; - if (task_num>array_task_num) task_num = array_task_num; - task_array = manager->create_task_array(TASK_EXEC,task_num,0,1,1); - if (!all) { - t_next->wait_for(task_array); - } else { - w->t_print->wait_for(task_array); - } - } - - Task *t_exec = 0; - HTask *h_exec = 0; + + HTask *h_exec = 0; for (int j = 0; j < array_task_num; j++) { int i = w->task_spwaned++; if (w->size < size) size = w->size; if (size==0) break; - if (use_task_array) { - t_exec = task_array->next_task_array(TASK_EXEC,t_exec); - t_exec->set_inData(0,w->file_mmap + i*w->division_size, size); - t_exec->set_outData(0,w->o_data + i*w->out_size, w->division_out_size); - } else if (use_compat) { + + if (use_compat) { h_exec = manager->create_task(TASK_EXEC); h_exec->set_inData(0,w->file_mmap + i*w->division_size, size); h_exec->set_outData(0,w->o_data + i*w->out_size, w->division_out_size); - t_next->wait_for(h_exec); - + if (all) { + w->t_print->wait_for(h_exec); + } else { + t_next->wait_for(h_exec); + } + h_exec->set_cpu(SPE_ANY); h_exec->spawn(); + } else { h_exec = manager->create_task(TASK_EXEC, (memaddr)(w->file_mmap + i*w->division_size), size, (memaddr)(w->o_data + i*w->out_size), w->division_out_size); - t_next->wait_for(h_exec); + + if (all) { + w->t_print->wait_for(h_exec); + } else { + t_next->wait_for(h_exec); + } + h_exec->set_cpu(SPE_ANY); h_exec->spawn(); } w->size -= size; w->task_num--; } - if (use_task_array) { - task_array->spawn_task_array(t_exec->next()); - task_array->set_cpu(SPE_ANY); - task_array->spawn(); - } else { - //if (!all) t_next->wait_for(h_exec); - } - } + + } + } /** @@ -269,6 +317,8 @@ use_compat = 0; } else if (strcmp(argv[i], "-anum") == 0) { array_task_num = atoi(argv[i+1]); + } else if (strcmp(argv[i], "-cpu") == 0) { + spe_num = atoi(argv[i+1]); } } if (filename==0) {