# HG changeset patch # User yutaka@localhost.localdomain # Date 1291626201 -32400 # Node ID 1e243714cf3c0f4089f6569db48fca7cbedf1ae9 # Parent ff0e6d00c060c0137a5c5a444dc1f8bc00457787 add TaskCreater test funciton.. diff -r ff0e6d00c060 -r 1e243714cf3c example/HelloWorld/main.cc --- a/example/HelloWorld/main.cc Mon Nov 29 18:27:06 2010 +0900 +++ b/example/HelloWorld/main.cc Mon Dec 06 18:03:21 2010 +0900 @@ -7,8 +7,10 @@ extern void task_init(void); static int count = 1; +static int spe_num = 1; extern TaskManager *manager; +int use_task_creater = 0; const char *usr_help_str = "Usage: ./hello [-cpu spe_num] [-count N]\n\ -cpu Number of SPE (default 1) \n\ @@ -20,24 +22,136 @@ for (int i = 1; argv[i]; ++i) { if (strcmp(argv[i], "-count") == 0) { count = atoi(argv[++i]); - } + } else if (strcmp(argv[i], "-cpu") == 0) { + spe_num = atoi(argv[i+1]); + } else if (strcmp(argv[i], "-t") == 0) { + use_task_creater = 1; + } + + } return 0; } + +static void simple_task_creater(int in_total_size, int out_total_size, + int command, int in_data_size, int out_data_size, + void *in_data, void *out_data, TaskManager *manager, + HTask *wait_i, HTask *wait_me) { + + + int in_task_size = 0; + int out_task_size = 0; + + if (in_total_size != 0) { + in_task_size = in_total_size / in_data_size; + if (in_total_size != in_task_size * in_data_size) { + printf("mismatch of in_total_size and in_data_size\n"); + } + } + + if (out_total_size != 0) { + out_task_size = out_total_size / out_data_size; + if (out_total_size != out_task_size * out_data_size) { + printf("mismatch of out_total_size and out_data_size\n"); + } + } + + /*in, out の大きい方に合わせるのがいいかな? Taskの数は1Task分に使うデータの大きいほうを取るような仕様がいいかな*/ + int task_num = (in_task_size > out_task_size) ? in_task_size : out_task_size; + + if (task_num == 0) task_num = 1; + + /*spe分あればいいのかな?*/ + + int array_num = spe_num; + if (task_num < array_num) { + array_num = task_num; + } + + + int array_length = task_num / array_num; + int rest = task_num % array_num; + + HTaskPtr *task_array = (HTask**)manager->allocate(sizeof(HTask*)*array_num); + TaskPtr *t_exec = (Task**)manager->allocate(sizeof(Task*)*array_length*array_num); + + int index = 0; + + for (int k = 0; k < array_num; k++) { + + task_array[k] = manager->create_task_array(command,array_length,0,1,1); + t_exec[k] = 0; + + if (wait_me != 0) { + wait_me->wait_for(task_array[k]); + } + if (wait_i != 0) { + task_array[k]->wait_for(wait_i); + } + + } + + for (int j = 0; j < array_length; j++) { + for (int k = 0; k < array_num; k++) { + + t_exec[k] = task_array[k]->next_task_array(command,t_exec[k]); + t_exec[k]->set_inData(0,(char*)in_data + index*in_data_size, in_data_size); + t_exec[k]->set_outData(0,(char*)out_data + index*out_data_size, out_data_size); + + index++; + + } + } + + for (int k = 0; k < array_num; k++) { + task_array[k]->spawn_task_array(t_exec[k]->next()); + task_array[k]->set_cpu(SPE_ANY); + task_array[k]->spawn(); + } + + for (int k = 0; k < rest; k++) { + HTaskPtr t_exec = manager->create_task(command); + + t_exec->set_inData(0,(char*)in_data + index*in_data_size, in_data_size); + t_exec->set_outData(0,(char*)out_data + index*out_data_size, out_data_size); + + index++; + + if (wait_me != 0) { + wait_me->wait_for(t_exec); + } + if (wait_i != 0) { + t_exec->wait_for(wait_i); + } + + t_exec->set_cpu(SPE_ANY); + t_exec->spawn(); + + } + + +} + void hello_init(TaskManager *manager) { - for (int i = 0; i < count; i++) { /** * Create Task * create_task(Task ID); */ + + if (use_task_creater) { + + simple_task_creater(0,0,Hello,0,0,0,0,manager,0,0); + + } else { + HTask *hello = manager->create_task(Hello); /** @@ -54,7 +168,10 @@ hello->set_param(0,(memaddr)i); hello->spawn(); + } } + + } int diff -r ff0e6d00c060 -r 1e243714cf3c example/word_count/main.cc --- a/example/word_count/main.cc Mon Nov 29 18:27:06 2010 +0900 +++ b/example/word_count/main.cc Mon Dec 06 18:03:21 2010 +0900 @@ -15,6 +15,7 @@ int all = 0; int use_task_array = 1; +int use_task_creater = 0; int use_compat = 0; int array_task_num = 8; int spe_num = 1; @@ -27,6 +28,105 @@ } st_mmap_t; +static void simple_task_creater(int in_total_size, int out_total_size, + int command, int in_data_size, int out_data_size, + void *in_data, void *out_data, SchedTask *manager, + HTask *wait_i, HTask *wait_me) { + + + int in_task_size = 0; + int out_task_size = 0; + + if (in_total_size != 0) { + in_task_size = in_total_size / in_data_size; + if (in_total_size != in_task_size * in_data_size) { + printf("mismatch of in_total_size and in_data_size\n"); + } + } + + if (out_total_size != 0) { + out_task_size = out_total_size / out_data_size; + if (out_total_size != out_task_size * out_data_size) { + printf("mismatch of out_total_size and out_data_size\n"); + } + } + + /*in, out の大きい方に合わせるのがいいかな? Taskの数は1Task分に使うデータの大きいほうを取るような仕様がいいかな*/ + int task_num = (in_task_size > out_task_size) ? in_task_size : out_task_size; + + if (task_num == 0) task_num = 1; + + /*spe分あればいいのかな?*/ + + int array_num = spe_num; + if (task_num < array_num) { + array_num = task_num; + } + + + HTaskPtr *task_array = (HTask**)manager->allocate(sizeof(HTask*)*array_num); + TaskPtr *t_exec = (Task**)manager->allocate(sizeof(Task*)*array_num); + + int array_length = task_num / array_num; + int rest = task_num % array_num; + + int index = 0; + + for (int k = 0; k < array_num; k++) { + + task_array[k] = manager->create_task_array(command,array_length,0,1,1); + t_exec[k] = 0; + + if (wait_me != 0) { + wait_me->wait_for(task_array[k]); + } + if (wait_i != 0) { + task_array[k]->wait_for(wait_i); + } + + } + + for (int j = 0; j < array_length; j++) { + for (int k = 0; k < array_num; k++) { + + t_exec[k] = task_array[k]->next_task_array(command,t_exec[k]); + t_exec[k]->set_inData(0,(char*)in_data + index*in_data_size, in_data_size); + t_exec[k]->set_outData(0,(char*)out_data + index*out_data_size, out_data_size); + + index++; + + } + } + + for (int k = 0; k < array_num; k++) { + task_array[k]->spawn_task_array(t_exec[k]->next()); + task_array[k]->set_cpu(SPE_ANY); + task_array[k]->spawn(); + } + + for (int k = 0; k < rest; k++) { + HTaskPtr t_exec = manager->create_task(command); + + t_exec->set_inData(0,(char*)in_data + index*in_data_size, in_data_size); + t_exec->set_outData(0,(char*)out_data + index*out_data_size, out_data_size); + + index++; + + if (wait_me != 0) { + wait_me->wait_for(t_exec); + } + if (wait_i != 0) { + t_exec->wait_for(wait_i); + } + + t_exec->spawn(); + t_exec->set_cpu(SPE_ANY); + + } + + +} + /*与えられたsizeをfix_byte_sizeの倍数にする(丸め込むっていうのかな?)*/ static int @@ -82,7 +182,18 @@ array_task_num = task_count; if (task_count<=0) return; } - + + //static void simple_task_creater(int in_total_size, int out_total_size, + // int command, int in_data_size, int out_data_size, + // void *in_data, void *out_data, TaskManager *manager, + // HTask *wait_i, HTask *wait_me) + + + + if (use_task_creater) { + simple_task_creater(w->file_size, w->division_out_size * w->task_num, TASK_EXEC, w->division_size, w->division_out_size, + w->file_mmap, w->o_data, manager, w->t_print, 0); + } if (use_task_array) { @@ -346,6 +457,10 @@ } else if (strcmp(argv[i], "-s") == 0) { use_task_array = 0; use_compat = 0; + } else if (strcmp(argv[i], "-t") == 0) { + use_task_creater = 1; + use_task_array = 0; + use_compat = 0; } else if (strcmp(argv[i], "-anum") == 0) { array_task_num = atoi(argv[i+1]); } else if (strcmp(argv[i], "-cpu") == 0) {