# HG changeset patch # User Shinji KONO # Date 1259781816 -32400 # Node ID d753b4f6b1296c610e5fbe7a15f908f1ca475eb0 # Parent 4615489c5faa3d91e7af5c0f291faaefe9885136 SimpeTask WordCount Worked. diff -r 4615489c5faa -r d753b4f6b129 TaskManager/Makefile.def --- a/TaskManager/Makefile.def Thu Dec 03 02:11:31 2009 +0900 +++ b/TaskManager/Makefile.def Thu Dec 03 04:23:36 2009 +0900 @@ -29,8 +29,8 @@ ABIBIT = 32 -# SIMPLE_TASK=-DSIMPLE_TASK -SIMPLE_TASK= +SIMPLE_TASK=-DSIMPLE_TASK +# SIMPLE_TASK= OPT = -O9 -g # OPT = -g diff -r 4615489c5faa -r d753b4f6b129 TaskManager/kernel/ppe/Task.cc --- a/TaskManager/kernel/ppe/Task.cc Thu Dec 03 02:11:31 2009 +0900 +++ b/TaskManager/kernel/ppe/Task.cc Thu Dec 03 04:23:36 2009 +0900 @@ -11,7 +11,11 @@ int Task::add_inData_t(memaddr addr, int size) { +#ifdef SIMPLE_TASK + return 0; +#else return add_data(inData, addr, size); +#endif } /** @@ -25,7 +29,11 @@ int Task::add_outData_t(memaddr addr, int size) { +#ifdef SIMPLE_TASK + return 0; +#else return add_data(outData, addr, size); +#endif } /** @@ -41,18 +49,22 @@ int Task::add_param0(memaddr _param) { +#ifndef SIMPLE_TASK if (param_size >= MAX_PARAMS) return -1; this->param[param_size++] = _param; +#endif return 0; } int Task::set_param0(int index, memaddr _param) { +#ifndef SIMPLE_TASK if (index >= MAX_PARAMS) return -1; this->param[index] = _param; +#endif return 0; } @@ -63,6 +75,7 @@ int Task::add_data(ListData& list, memaddr addr, int size) { +#ifndef SIMPLE_TASK if (list.length >= MAX_LIST_DMA_SIZE) return -1; list.bound[list.length] = list.size; @@ -77,6 +90,7 @@ elm->addr = addr; #endif elm->size = size; +#endif return 0; } diff -r 4615489c5faa -r d753b4f6b129 example/word_count_test/Makefile.def --- a/example/word_count_test/Makefile.def Thu Dec 03 02:11:31 2009 +0900 +++ b/example/word_count_test/Makefile.def Thu Dec 03 04:23:36 2009 +0900 @@ -7,9 +7,12 @@ # ex linux/ps3 CERIUM = ../../../Cerium -OPT = -O9 +SIMPLE_TASK= -DSIMPLE_TASK + +OPT = -O9 +# OPT = -g CC = g++ -CFLAGS = -Wall $(OPT) +CFLAGS = -Wall $(OPT) $(SIMPLE_TASK) INCLUDE = -I${CERIUM}/include/TaskManager -I. -I.. LIBS = -L${CERIUM}/TaskManager diff -r 4615489c5faa -r d753b4f6b129 example/word_count_test/main.cc --- a/example/word_count_test/main.cc Thu Dec 03 02:11:31 2009 +0900 +++ b/example/word_count_test/main.cc Thu Dec 03 04:23:36 2009 +0900 @@ -9,6 +9,7 @@ #include "TaskManager.h" #include "SchedTask.h" #include "Func.h" +#include "WordCount.h" extern void task_init(); @@ -19,20 +20,6 @@ off_t size; } st_mmap_t; -typedef struct { - int size; // remaining file size - int division_size; // for each word count task - int division_out_size; - int task_num; // remaining task count - int task_blocks; // spawn task one at a time - int status_num; - int task_spwaned; - unsigned long long *o_data; - unsigned long long *head_tail_flag; - int pad; - caddr_t file_mmap; - HTaskPtr t_print; -} WordCount; /*与えられたsizeをfix_byte_sizeの倍数にする(丸め込むっていうのかな?)*/ @@ -86,12 +73,19 @@ { for (int j = 0; j < task_count && w->size>0; j++) { int i = w->task_spwaned++; +#ifdef SIMPLE_TASK + // printf("div %0x\n", (w->file_mmap + i*w->division_size)); + HTaskPtr t_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); +#else HTaskPtr t_exec = manager->create_task(TASK_EXEC); if (size>w->size) size = w->size; t_exec->add_inData(w->file_mmap + i*w->division_size, size); t_exec->add_outData(w->o_data + i*w->status_num, w->division_out_size); t_exec->add_outData(w->head_tail_flag + i*w->pad, w->division_out_size); t_exec->add_param(size); +#endif t_exec->set_cpu(SPE_ANY); t_next->wait_for(t_exec); t_exec->spawn(); @@ -105,7 +99,11 @@ static int run16(SchedTask *manager, void *in, void *out) { +#ifdef SIMPLE_TASK + WordCount *w = *(WordCount **)in; +#else WordCount *w = (WordCount *)manager->get_param(0); +#endif if (w->task_num < w->task_blocks) { if (w->size >= w->division_size) @@ -114,9 +112,13 @@ run_tasks(manager,w,1, w->t_print, w->size); // printf("run16 last %d\n",w->task_num); } else { - +#ifdef SIMPLE_TASK + HTaskPtr t_next = manager->create_task(RUN_TASK_BLOCKS, + (memaddr)&w->self,sizeof(memaddr),0,0); +#else HTaskPtr t_next = manager->create_task(RUN_TASK_BLOCKS); t_next->set_param(0,(void*)w); +#endif w->t_print->wait_for(t_next); run_tasks(manager,w, w->task_blocks, t_next, w->division_size); @@ -128,7 +130,7 @@ } -static int blocks = 192; +static int blocks = 48; static int division = 16; // in Kbyte static void @@ -141,6 +143,7 @@ WordCount *w = (WordCount*)manager->allocate(sizeof(WordCount)); // bzero(w,sizeof(WordCount)); + w->self = w; w->task_blocks = blocks; w->task_spwaned = 0; @@ -163,23 +166,36 @@ w-> task_num = w->size / w->division_size; int out_task_num = w->task_num + (w->division_size*w->task_num < w->size); + w->out_task_num = out_task_num; printf("task_num %d\n",w->task_num); /* out用のdivision_size. statusが2つなので、あわせて16byteになるように、long long(8byte)を使用 */ + +#ifdef SIMPLE_TASK + w-> division_out_size = sizeof(unsigned long long)*4; + int out_size = w->division_out_size*out_task_num; + w->o_data = (unsigned long long *)manager->allocate(out_size); + w-> out_size = 4; +#else w-> division_out_size = 16; + int out_size = w->division_out_size*out_task_num; /* out用のデータのサイズ。*/ - int out_size = w->division_out_size*out_task_num; - w->o_data = (unsigned long long*)manager->allocate(out_size); + caddr_t p = manager->allocate(out_size*2); + w->o_data = (unsigned long long*)p //bzero(w->o_data,out_size); w-> pad = 2; - w->head_tail_flag = (unsigned long long*)manager->allocate(out_size); + w->head_tail_flag = (unsigned long long*)(p+out_size); // bzero(w->head_tail_flag,out_size); - +#endif printf("out size %d\n",out_size); /*各SPEの結果を合計して出力するタスク*/ +#ifdef SIMPLE_TASK + t_print = manager->create_task(TASK_PRINT, + (memaddr)&w->self,sizeof(memaddr),0,0); +#else t_print = manager->create_task(TASK_PRINT); t_print->add_inData(w->o_data, out_size); t_print->add_inData(w->head_tail_flag, out_size); @@ -187,13 +203,18 @@ t_print->add_param(w->status_num); t_print->add_param(out_task_num); t_print->add_param(w->pad); +#endif w->t_print = t_print; /* Task を task_blocks ずつ起動する Task */ - +#ifdef SIMPLE_TASK + HTaskPtr t_exec = manager->create_task(RUN_TASK_BLOCKS, + (memaddr)&w->self,sizeof(memaddr),0,0); +#else HTaskPtr t_exec = manager->create_task(RUN_TASK_BLOCKS); t_exec->set_param(0,(void*)w); +#endif t_exec->spawn(); t_print->wait_for(t_exec); diff -r 4615489c5faa -r d753b4f6b129 example/word_count_test/ppe/Exec.cc --- a/example/word_count_test/ppe/Exec.cc Thu Dec 03 02:11:31 2009 +0900 +++ b/example/word_count_test/ppe/Exec.cc Thu Dec 03 04:23:36 2009 +0900 @@ -9,11 +9,18 @@ static int run(SchedTask *s, void *rbuf, void *wbuf) { +#ifdef SIMPLE_TASK + char *i_data = (char *)rbuf; + unsigned long long *o_data = (unsigned long long*)wbuf; + unsigned long long *head_tail_flag = o_data +2; + int length = s->read_size(); +#else char *i_data = (char*)s->get_input(rbuf, 0); unsigned long long *o_data = (unsigned long long*)s->get_output(wbuf, 0); /*担当範囲の先頭、末尾が「改行、スペース」か、「それ以外の文字」かのフラグ*/ unsigned long long *head_tail_flag = (unsigned long long*)s->get_output(wbuf,1); int length = (long)s->get_param(0); +#endif int word_flag = 0; int word_num = 0; int line_num = 0; @@ -21,7 +28,7 @@ /*文字なら1,スペースか改行なら0*/ head_tail_flag[0] = (i_data[0] != 0x20) && (i_data[0] != 0x0A); - word_num -= 1- head_tail_flag[0]; + word_num -= 1-head_tail_flag[0]; for (; i < length; i++) { diff -r 4615489c5faa -r d753b4f6b129 example/word_count_test/ppe/Print.cc --- a/example/word_count_test/ppe/Print.cc Thu Dec 03 02:11:31 2009 +0900 +++ b/example/word_count_test/ppe/Print.cc Thu Dec 03 04:23:36 2009 +0900 @@ -2,20 +2,36 @@ #include #include "Print.h" #include "Func.h" +#include "WordCount.h" /* これは必須 */ -SchedDefineTask(Print); +SchedDefineTask1(Print,run_print); static int -run(SchedTask *s, void *rbuf, void *wbuf) +run_print(SchedTask *s, void *rbuf, void *wbuf) { +#ifdef SIMPLE_TASK + WordCount *w = *(WordCount**)rbuf; + unsigned long long *idata = w->o_data; + // long task_num = w->task_num; + long status_num = w->status_num; + int out_task_num = w->out_task_num; + + /* + * head_flag + * o_data[0] + * o_data[1] + * + */ +#else + int pad = w->pad; unsigned long long *idata = (unsigned long long*)s->get_input(rbuf, 0); - unsigned long long *head_tail_flag= (unsigned long long*)s->get_input(rbuf,1); long task_num = (long)s->get_param(0); long status_num = (long)s->get_param(1); - int out_task_num = (int)s->get_param(2); + // int out_task_num = (int)s->get_param(2); int pad = (int)s->get_param(3); - unsigned long long word_data[task_num]; +#endif + unsigned long long word_data[2]; int flag_cal_sum = 0; //printf("pad %d\n",pad); @@ -53,32 +69,42 @@ * */ - - for (int i = 1; i < out_task_num * pad - pad; i += pad) { - //printf("%llu ",head_tail_flag[i]); - //printf("%llu\n",head_tail_flag[i+1]); - - if((head_tail_flag[i] == 1) && (head_tail_flag[i+1] == 0)) { - flag_cal_sum++; - } - - } - s->printf("start sum\n"); for (int i = 0; i < status_num; i++) { word_data[i] = 0; } - for (int i = 0; i < task_num*status_num; i += status_num) { +#ifdef SIMPLE_TASK + for (int i = 0; i < out_task_num ; i++) { + word_data[0] += idata[i*w->out_size+0]; + word_data[1] += idata[i*w->out_size+1]; + unsigned long long *head_tail_flag = + &idata[i*w->out_size+2]; + if((i!=out_task_num-1)&& + (head_tail_flag[1] == 1) && (head_tail_flag[4] == 0)) { + flag_cal_sum++; + } + } +#else + for (int i = 1; i < out_task_num * pad - pad; i += pad) { + //printf("%llu ",head_tail_flag[i]); + //printf("%llu\n",head_tail_flag[i+1]); + if((head_tail_flag[i] == 1) && (head_tail_flag[i+1] == 0)) { + flag_cal_sum++; + } + } + + for (int i = 0; i < out_task_num*status_num; i += status_num) { for (int j = 0; j < status_num; j++) { word_data[j] += idata[i+j]; } } +#endif word_data[0] += flag_cal_sum; - for (int i = status_num-1; i >= 0; i--) { + for (int i = status_num-1; i >=0; i--) { s->printf("%llu ",word_data[i]); } diff -r 4615489c5faa -r d753b4f6b129 example/word_count_test/spe/Exec.cc --- a/example/word_count_test/spe/Exec.cc Thu Dec 03 02:11:31 2009 +0900 +++ b/example/word_count_test/spe/Exec.cc Thu Dec 03 04:23:36 2009 +0900 @@ -9,11 +9,18 @@ static int run(SchedTask *s, void *rbuf, void *wbuf) { +#ifdef SIMPLE_TASK + char *i_data = (char *)rbuf; + unsigned long long *o_data = (unsigned long long*)wbuf; + unsigned long long *head_tail_flag = o_data +2; + int length = s->read_size(); +#else char *i_data = (char*)s->get_input(rbuf, 0); unsigned long long *o_data = (unsigned long long*)s->get_output(wbuf, 0); /*担当範囲の先頭、末尾が「改行、スペース」か、「それ以外の文字」かのフラグ*/ unsigned long long *head_tail_flag = (unsigned long long*)s->get_output(wbuf,1); int length = (long)s->get_param(0); +#endif int word_flag = 0; int word_num = 0; int line_num = 0; @@ -51,7 +58,7 @@ //printf("last word %c",i_data[i-1]); head_tail_flag[1] = (i_data[i-1] != 0x20) && (i_data[i-1] != 0x0A); - // s->printf("PPE word %d line %d\n",word_num,line_num); + // s->printf("SPE word %d line %d\n",word_num,line_num); o_data[0] = (unsigned long long)word_num; o_data[1] = (unsigned long long)line_num; diff -r 4615489c5faa -r d753b4f6b129 example/word_count_test/spe/Makefile --- a/example/word_count_test/spe/Makefile Thu Dec 03 02:11:31 2009 +0900 +++ b/example/word_count_test/spe/Makefile Thu Dec 03 04:23:36 2009 +0900 @@ -7,7 +7,7 @@ OBJS = $(SRCS:.cc=.o) CC = spu-g++ -CFLAGS = -Wall -fno-exceptions -fno-rtti $(OPT) #-DDEBUG +CFLAGS = -Wall -fno-exceptions -fno-rtti $(OPT) $(SIMPLE_TASK) #-DDEBUG INCLUDE = -I../${CERIUM}/include/TaskManager -I. -I.. LIBS = -L../${CERIUM}/TaskManager -lspemanager diff -r 4615489c5faa -r d753b4f6b129 example/word_count_test/spe/Print.cc --- a/example/word_count_test/spe/Print.cc Thu Dec 03 02:11:31 2009 +0900 +++ b/example/word_count_test/spe/Print.cc Thu Dec 03 04:23:36 2009 +0900 @@ -2,6 +2,7 @@ #include #include "Print.h" #include "Func.h" +#include "WordCount.h" /* これは必須 */ SchedDefineTask(Print); @@ -9,13 +10,28 @@ static int run(SchedTask *s, void *rbuf, void *wbuf) { +#ifdef SIMPLE_TASK + WordCount *w = *(WordCount**)rbuf; + unsigned long long *idata = w->o_data; + long task_num = w->task_num; + long status_num = w->status_num; + int out_task_num = w->out_task_num; + + /* + * head_flag + * o_data[0] + * o_data[1] + * + */ +#else + int pad = w->pad; unsigned long long *idata = (unsigned long long*)s->get_input(rbuf, 0); - unsigned long long *head_tail_flag= (unsigned long long*)s->get_input(rbuf,1); long task_num = (long)s->get_param(0); long status_num = (long)s->get_param(1); int out_task_num = (int)s->get_param(2); int pad = (int)s->get_param(3); - unsigned long long word_data[task_num]; +#endif + unsigned long long word_data[task_num]; // まぁ、gcc では通るんだけど.. int flag_cal_sum = 0; //printf("pad %d\n",pad); @@ -53,32 +69,41 @@ * */ - - for (int i = 1; i < out_task_num * pad - pad; i += pad) { - //printf("%llu ",head_tail_flag[i]); - //printf("%llu\n",head_tail_flag[i+1]); - - if((head_tail_flag[i] == 1) && (head_tail_flag[i+1] == 0)) { - flag_cal_sum++; - } - - } - s->printf("start sum\n"); for (int i = 0; i < status_num; i++) { word_data[i] = 0; } +#ifdef SIMPLE_TASK + for (int i = 0; i < out_task_num ; i++) { + word_data[0] += idata[i*w->out_size+0]; + word_data[1] += idata[i*w->out_size+1]; + unsigned long long *head_tail_flag = + &idata[i*w->out_size+2]; + if((head_tail_flag[1] == 1) && (head_tail_flag[4] == 0)) { + flag_cal_sum++; + } + } +#else + for (int i = 1; i < out_task_num * pad - pad; i += pad) { + //printf("%llu ",head_tail_flag[i]); + //printf("%llu\n",head_tail_flag[i+1]); + if((head_tail_flag[i] == 1) && (head_tail_flag[i+1] == 0)) { + flag_cal_sum++; + } + } + for (int i = 0; i < task_num*status_num; i += status_num) { for (int j = 0; j < status_num; j++) { word_data[j] += idata[i+j]; } } +#endif word_data[0] += flag_cal_sum; - for (int i = 0; i < status_num; i++) { + for (int i = status_num-1; i >=0; i--) { s->printf("%llu ",word_data[i]); }