# HG changeset patch # User Shinji KONO # Date 1280505466 -32400 # Node ID f4d7cf77ec3dfcd4d2aca13f340ff8cd163da338 # Parent 35efda39c2d9ba2a4b19912e4a98ffb3b2350a70 sort test (add swap()) diff -r 35efda39c2d9 -r f4d7cf77ec3d TaskManager/ChangeLog --- a/TaskManager/ChangeLog Fri Jul 30 21:46:04 2010 +0900 +++ b/TaskManager/ChangeLog Sat Jul 31 00:57:46 2010 +0900 @@ -1,6 +1,7 @@ 2010-7-30 Shinji KONO TASK_LIST_MAIL でない方が高速なみたい + sort (many_task) が、とっても遅くなっている 2010-7-24 Shinji KONO diff -r 35efda39c2d9 -r f4d7cf77ec3d TaskManager/kernel/ppe/TaskManager.h --- a/TaskManager/kernel/ppe/TaskManager.h Fri Jul 30 21:46:04 2010 +0900 +++ b/TaskManager/kernel/ppe/TaskManager.h Sat Jul 31 00:57:46 2010 +0900 @@ -34,6 +34,10 @@ void start_profile() { m_impl->start_profile(); } void show_profile() { m_impl->show_profile(); } + SchedTask *get_schedTask() { + return m_impl->schedTaskManager; + } + /* functions */ void init(); void finish(); diff -r 35efda39c2d9 -r f4d7cf77ec3d TaskManager/kernel/schedule/SchedTask.h --- a/TaskManager/kernel/schedule/SchedTask.h Fri Jul 30 21:46:04 2010 +0900 +++ b/TaskManager/kernel/schedule/SchedTask.h Sat Jul 31 00:57:46 2010 +0900 @@ -93,6 +93,18 @@ return get_output(writebuf, index); } + /** + * swap read / write buffer + * output が read buffer の書き換えならば、memcpy せずに + * swap するだけで良い。size は同じである必要がある。 + */ + void swap() { + void * tmp = readbuf; + readbuf = writebuf; + writebuf = tmp; + } + + // user HTaskPtr create_task(int cmd); HTaskPtr create_task(int cmd, memaddr r, long rs, memaddr w, long ws); diff -r 35efda39c2d9 -r f4d7cf77ec3d TaskManager/kernel/schedule/SchedTaskArray.h --- a/TaskManager/kernel/schedule/SchedTaskArray.h Fri Jul 30 21:46:04 2010 +0900 +++ b/TaskManager/kernel/schedule/SchedTaskArray.h Sat Jul 31 00:57:46 2010 +0900 @@ -17,6 +17,7 @@ virtual ~SchedTaskArray(); + private: /* variables */ diff -r 35efda39c2d9 -r f4d7cf77ec3d example/many_task/Makefile.cell --- a/example/many_task/Makefile.cell Fri Jul 30 21:46:04 2010 +0900 +++ b/example/many_task/Makefile.cell Sat Jul 31 00:57:46 2010 +0900 @@ -1,7 +1,7 @@ include ./Makefile.def SRCS_TMP = $(wildcard *.cc) -SRCS_EXCLUDE = # ե +SRCS_EXCLUDE = # ե SRCS = $(filter-out $(SRCS_EXCLUDE),$(SRCS_TMP)) OBJS = $(SRCS:.cc=.o) diff -r 35efda39c2d9 -r f4d7cf77ec3d example/many_task/Makefile.def --- a/example/many_task/Makefile.def Fri Jul 30 21:46:04 2010 +0900 +++ b/example/many_task/Makefile.def Sat Jul 31 00:57:46 2010 +0900 @@ -6,10 +6,11 @@ CERIUM = ../../../Cerium -OPT = -O9 +OPT = -g -O9 # OPT = -g CC = g++ -CFLAGS = -Wall $(OPT) +CFLAGS = -DUSE_SIMPLE_TASK -Wall $(OPT) +# CFLAGS = -Wall $(OPT) INCLUDE = -I${CERIUM}/include/TaskManager -I. -I.. LIBS = -L${CERIUM}/TaskManager diff -r 35efda39c2d9 -r f4d7cf77ec3d example/many_task/Makefile.linux --- a/example/many_task/Makefile.linux Fri Jul 30 21:46:04 2010 +0900 +++ b/example/many_task/Makefile.linux Sat Jul 31 00:57:46 2010 +0900 @@ -1,7 +1,7 @@ include ./Makefile.def SRCS_TMP = $(wildcard *.cc) -SRCS_EXCLUDE = # ե +SRCS_EXCLUDE = # ե SRCS = $(filter-out $(SRCS_EXCLUDE),$(SRCS_TMP)) OBJS = $(SRCS:.cc=.o) @@ -12,7 +12,7 @@ TASK_OBJS = $(TASK_SRCS:.cc=.o) CC = g++ -CFLAGS = -g -Wall# -O9 #-DDEBUG +# CFLAGS = -g -Wall# -O9 #-DDEBUG INCLUDE = -I${CERIUM}/include/TaskManager -I. -I.. LIBS = -L${CERIUM}/TaskManager -lFifoManager diff -r 35efda39c2d9 -r f4d7cf77ec3d example/many_task/Makefile.macosx --- a/example/many_task/Makefile.macosx Fri Jul 30 21:46:04 2010 +0900 +++ b/example/many_task/Makefile.macosx Sat Jul 31 00:57:46 2010 +0900 @@ -2,7 +2,7 @@ SRCS_TMP = $(wildcard *.cc) -SRCS_EXCLUDE = # ե +SRCS_EXCLUDE = # ե SRCS = $(filter-out $(SRCS_EXCLUDE),$(SRCS_TMP)) OBJS = $(SRCS:.cc=.o) @@ -14,7 +14,7 @@ CC = g++ CC += -m32 -CFLAGS = -g -Wall# -O9 #-DDEBUG +# CFLAGS = -g -Wall# -O9 #-DDEBUG INCLUDE = -I${CERIUM}/include/TaskManager -I. -I.. LIBS = -L${CERIUM}/TaskManager -lFifoManager `sdl-config --libs` diff -r 35efda39c2d9 -r f4d7cf77ec3d example/many_task/main.cc --- a/example/many_task/main.cc Fri Jul 30 21:46:04 2010 +0900 +++ b/example/many_task/main.cc Sat Jul 31 00:57:46 2010 +0900 @@ -70,13 +70,17 @@ task_init(); - HTask *dummy = manager->create_task(Dummy); int cpu = manager->get_cpuNum(); // in case of -cpu 0 if (cpu==0) cpu = 1; - dummy->set_post(sort_init, (void*)cpu, (void*)length); - dummy->spawn(); + if (1) { + HTask *dummy = manager->create_task(Dummy); + dummy->set_post(sort_init, (void*)cpu, (void*)length); + dummy->spawn(); + } else { + sort_init(manager->get_schedTask(),(void*)cpu, (void*)length); + } st_time = getTime(); diff -r 35efda39c2d9 -r f4d7cf77ec3d example/many_task/ppe/QuickSort.cc --- a/example/many_task/ppe/QuickSort.cc Fri Jul 30 21:46:04 2010 +0900 +++ b/example/many_task/ppe/QuickSort.cc Sat Jul 31 00:57:46 2010 +0900 @@ -5,23 +5,39 @@ SchedDefineTask(QuickSort); static void quick_sort( Data *data, int begin, int end ) ; -static void swap( Data *data, int left, int right ); +static void +swap( Data *data, int left, int right ) +{ + int tmp = data[left].index; + data[left].index = data[right].index; + data[right].index = tmp; +} static int run(SchedTask *s, void* rbuff, void* wbuff) { // copy value int begin = 0; - long end = (long)s->get_param(0); - - Data *r_data = (Data*)s->get_input(rbuff, 0); - Data *w_data = (Data*)s->get_output(wbuff, 0); +#if USE_SIMPLE_TASK + long end = s->read_size()/sizeof(Data); + Data *r_data = (Data*)rbuff; +#if MEMCPY + Data *w_data = (Data*)wbuff; +#endif +#else + int end = (long)s->get_param(0); + DataPtr r_data = (DataPtr)s->get_input(0); +#endif //printf("[PPE] Quick: length:%d addr->%x \n",end, (int*)rbuff); //printf("[PPE] Quick: data[0]: %d addr->%x\n",sizeof(r_data),r_data); //show_data(r_data, end); quick_sort(r_data, begin, end-1); +#if MEMCPY memcpy(w_data, r_data, sizeof(Data)*end); +#else + s->swap(); +#endif return 0; } @@ -45,14 +61,9 @@ data[p].index = pivot; quick_sort(data, begin, p-1); - quick_sort(data, p+1, end); + quick_sort(data, p+1, end); // tail call } } -static void -swap( Data *data, int left, int right ) -{ - int tmp = data[left].index; - data[left].index = data[right].index; - data[right].index = tmp; -} + +/* end */ diff -r 35efda39c2d9 -r f4d7cf77ec3d example/many_task/sort.cc --- a/example/many_task/sort.cc Fri Jul 30 21:46:04 2010 +0900 +++ b/example/many_task/sort.cc Sat Jul 31 00:57:46 2010 +0900 @@ -57,6 +57,68 @@ } } +#ifdef USE_SIMPLE_TASK + +static void +sort_start(SchedTask *manager) +{ + if (--sort_count < 0) { + return; + } + + HTaskPtr fsort[split_num]; + + for (int i = 0; i < split_num-1; i++) { + fsort[i] = manager->create_task(QUICK_SORT, + (memaddr)&data[i*block_num], sizeof(Data)*block_num, + (memaddr)&data[i*block_num], sizeof(Data)*block_num); + fsort[i]->set_cpu(SPE_ANY); + } + + // 最後の block は端数なので last_block_num を使う + { + int i = split_num-1; + + fsort[i] = manager->create_task(QUICK_SORT, + (memaddr)&data[i*block_num], sizeof(Data)*last_block_num, + (memaddr)&data[i*block_num], sizeof(Data)*last_block_num); + fsort[i]->set_cpu(SPE_ANY); + } + + if (split_num > 1) { + HTaskPtr bsort[half_num]; + + for (int i = 0; i < half_num-1; i++) { + bsort[i] = manager->create_task(QUICK_SORT, + (memaddr)&data[i*block_num+half_block_num], sizeof(Data)*block_num, + (memaddr)&data[i*block_num+half_block_num], sizeof(Data)*block_num); + bsort[i]->set_cpu(SPE_ANY); + } + + { + int i = half_num-1; + + bsort[i] = manager->create_task(QUICK_SORT, + (memaddr)&data[i*block_num+half_block_num], sizeof(Data)*last_half_block_num, + (memaddr)&data[i*block_num+half_block_num], sizeof(Data)*last_half_block_num); + bsort[i]->set_cpu(SPE_ANY); + } + + for (int i = 0; i < half_num; i++) { + bsort[i]->wait_for(fsort[i]); + bsort[i]->wait_for(fsort[i+1]); + bsort[i]->set_post(sort_restart, (void*)(half_num),(void*)manager); + bsort[i]->spawn(); + } + } + + for (int i = 0; i < split_num; i++) { + fsort[i]->spawn(); + } +} + +#else + static void sort_start(SchedTask *manager) { @@ -122,6 +184,7 @@ fsort[i]->spawn(); } } +#endif void sort_init(SchedTask *manager, void *a, void *b) diff -r 35efda39c2d9 -r f4d7cf77ec3d example/many_task/spe/QuickSort.cc --- a/example/many_task/spe/QuickSort.cc Fri Jul 30 21:46:04 2010 +0900 +++ b/example/many_task/spe/QuickSort.cc Sat Jul 31 00:57:46 2010 +0900 @@ -1,81 +1,63 @@ #include "QuickSort.h" #include #include -#include "SpeProfile.h" SchedDefineTask(QuickSort); -static void bubble_sort(DataPtr data, int begin, int end); -static void quick_sort(DataPtr data, int begin, int end); - -static void swap(Data *data, int left, int right); - -static int -run(SchedTask *smanager, void* rbuff, void* wbuff) { - int begin = 0; - int end = (long)smanager->get_param(0); - DataPtr r_data = (DataPtr)smanager->get_input(0); - DataPtr w_data = (DataPtr)smanager->get_output(0); - //SpeProfile *prof = new SpeProfile; - - //prof->ProfStart(); - if (0) - bubble_sort(r_data, begin, end-1); - else - quick_sort(r_data, begin, end-1); - memcpy(w_data, r_data, sizeof(Data)*end); - //prof->ProfStop(); - //prof->ProfPrint(); - - //delete prof; - return 0; -} - +static void quick_sort( Data *data, int begin, int end ) ; static void -bubble_sort(DataPtr data, int begin, int end) -{ - for (int i = 0; i < end; i++) { - for (int j = end; j > i; j--) { - if (data[j].index < data[j-1].index) { - swap(data, j, j-1); - } - } - } -} - - -static void -quick_sort(DataPtr data, int begin, int end) -{ - if (begin < end) { - - int where = (begin + end) / 2; - int pivot = data[where].index; - data[where].index = data[begin].index; - int p = begin; - - for (int i = begin+1; i <= end; i++) { - if (data[i].index < pivot) { - p++; - swap(data, p, i); - } - } - - data[begin].index = data[p].index; - data[p].index = pivot; - - quick_sort(data, begin, p-1); - quick_sort(data, p+1, end); - } -} - - -static void -swap(Data *data, int left, int right) +swap( Data *data, int left, int right ) { int tmp = data[left].index; data[left].index = data[right].index; data[right].index = tmp; } +static int +run(SchedTask *s, void* rbuff, void* wbuff) { + // copy value + int begin = 0; +#if USE_SIMPLE_TASK + long end = s->read_size()/sizeof(Data); + Data *r_data = (Data*)rbuff; +#else + int end = (long)s->get_param(0); + DataPtr r_data = (DataPtr)s->get_input(0); +#endif + + //printf("[PPE] Quick: length:%d addr->%x \n",end, (int*)rbuff); + //printf("[PPE] Quick: data[0]: %d addr->%x\n",sizeof(r_data),r_data); + + //show_data(r_data, end); + quick_sort(r_data, begin, end-1); + s->swap(); + // memcpy(w_data, r_data, sizeof(Data)*end); + + return 0; +} + +static void +quick_sort( Data *data, int begin, int end ) { + + if (begin < end) { + int where = (begin + end) / 2; + int pivot = data[where].index; + data[where].index = data[begin].index; + int p = begin; + int i; + for (i=begin+1; i<=end; i++) { + if (data[i].index < pivot) { + p++; + swap(data, p, i); + } + } + data[begin].index = data[p].index; + data[p].index = pivot; + + quick_sort(data, begin, p-1); + quick_sort(data, p+1, end); // tail call + } +} + + /* end */