Mercurial > hg > Game > Cerium
diff example/ResizeWritebuf/main.cc @ 1099:3b3b535baa51 draft
add resize wbuff example.
author | koba <koba@cr.ie.u-ryukyu.ac.jp> |
---|---|
date | Fri, 31 Dec 2010 15:58:32 +0900 (2010-12-31) |
parents | |
children | dcb025b46cae |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/example/ResizeWritebuf/main.cc Fri Dec 31 15:58:32 2010 +0900 @@ -0,0 +1,178 @@ +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include "TaskManager.h" +#include "Func.h" + +extern void task_init(void); + +static int count = 1; +static int spe_num = 1; +static int data_size = 10; +static int data_length = 1; + +extern TaskManager *manager; +int use_task_creater = 0; + +const char *usr_help_str = "Usage: ./resize [-cpu spe_num] [-count N]\n\ + -cpu Number of SPE (default 1) \n\ + -count Number of task is print \"Hello, World!!\""; + +int +init(int argc, char **argv) +{ + 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], "-length") == 0) { + data_length = atoi(argv[++i]); + } + } + + 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 +checkData(SchedTask *s, void *data, void *arg1) +{ + int *idata = (int*)data; + for (int i = 0;i < data_length;i++) { + int p_data = idata[i]; + printf("data[%d] = %d\n", i, p_data); + } + free(data); +} + + +void +resize_init(TaskManager *manager) +{ + HTaskPtr resize_task = manager->create_task(Resize); + int *obj = (int*)manager->allocate(sizeof(int)*data_size); + + resize_task->set_param(0, (memaddr)data_length); + resize_task->set_inData(0, obj, sizeof(int)*data_size); + resize_task->set_outData(0, obj, 0); + + resize_task->set_post(checkData, (void*)obj, NULL); + resize_task->set_cpu(SPE_ANY); + resize_task->spawn(); +} + +int +TMmain(TaskManager *manager, int argc, char *argv[]) +{ + if (init(argc, argv) < 0) { + return -1; + } + + // Task Register + // ppe/task_init.cc + task_init(); + + resize_init(manager); + + return 0; +}