Mercurial > hg > Game > Cerium
changeset 1513:18b63e697c61 draft
many_task/quick_sort is changed recursive to loop
author | Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp> |
---|---|
date | Mon, 08 Oct 2012 02:03:18 +0900 |
parents | 81f1afd1851f |
children | 99ea7b932470 |
files | TaskManager/Gpu/GpuScheduler.cc TaskManager/Gpu/GpuScheduler.h TaskManager/kernel/schedule/Scheduler.h TaskManager/test/GpuRunTest/task_init.cc example/many_task/Func.h example/many_task/Makefile.macosx example/many_task/ppe/Makefile example/many_task/ppe/QuickSort.cc example/many_task/ppe/QuickSort.cc.loop example/many_task/ppe/task_init.cc |
diffstat | 10 files changed, 58 insertions(+), 143 deletions(-) [+] |
line wrap: on
line diff
--- a/TaskManager/Gpu/GpuScheduler.cc Mon Oct 01 16:51:26 2012 +0900 +++ b/TaskManager/Gpu/GpuScheduler.cc Mon Oct 08 02:03:18 2012 +0900 @@ -205,7 +205,6 @@ void gpu_register_task(int cmd, const char* filename, const char* functionname) { - task_list[cmd].gputask->a = 1; task_list[cmd].run = not_ready; // not yet ready task_list[cmd].load = null_loader; task_list[cmd].wait = null_loader; @@ -213,4 +212,12 @@ task_list[cmd].gputask->kernel = (cl_kernel *) filename; } +void +gpu_register_ndrange(int cmd, int dim, size_t* l_work_size) +{ + task_list[cmd].gputask->dim = dim; + task_list[cmd].gputask->l_work_size = l_work_size; + +} + /* end */
--- a/TaskManager/Gpu/GpuScheduler.h Mon Oct 01 16:51:26 2012 +0900 +++ b/TaskManager/Gpu/GpuScheduler.h Mon Oct 08 02:03:18 2012 +0900 @@ -45,9 +45,13 @@ }; -extern void gpu_register_task(int cmd,const char* filename,const char* functionname); +#define GpuSchedRegister(str, filename, functionname) \ + gpu_register_task(str, filename, functionname); + +#define GpuNDRangeRegister(str, dimension, g_worksizePtr) \ + gpu_register_ndrange(str, dimension, g_worksizePtr); #endif -#define GpuSchedRegister(str, filename, functionname) \ - gpu_register_task(str, filename, functionname); +extern void gpu_register_task(int cmd,const char* filename,const char* functionname); +extern void gpu_register_ndrange(int, int, size_t*);
--- a/TaskManager/kernel/schedule/Scheduler.h Mon Oct 01 16:51:26 2012 +0900 +++ b/TaskManager/kernel/schedule/Scheduler.h Mon Oct 08 02:03:18 2012 +0900 @@ -37,6 +37,8 @@ typedef struct gpu_task_object { #ifdef __CERIUM_GPU__ cl_kernel *kernel; + int dim; + size_t *l_work_size; #endif } GpuTaskObject;
--- a/TaskManager/test/GpuRunTest/task_init.cc Mon Oct 01 16:51:26 2012 +0900 +++ b/TaskManager/test/GpuRunTest/task_init.cc Mon Oct 08 02:03:18 2012 +0900 @@ -5,5 +5,8 @@ task_init(void) { int cmd = Twice; + int dim = 2; + size_t *l_work_size = new size_t(dim); + GpuNDRangeRegister(cmd, dim, l_work_size); GpuSchedRegister(cmd, "twice.cl", "twice"); }
--- a/example/many_task/Func.h Mon Oct 01 16:51:26 2012 +0900 +++ b/example/many_task/Func.h Mon Oct 08 02:03:18 2012 +0900 @@ -1,6 +1,7 @@ enum { #include "SysTasks.h" QUICK_SORT, + QUICK_SORT_LOOP, SortSimple, SortCompat, };
--- a/example/many_task/Makefile.macosx Mon Oct 01 16:51:26 2012 +0900 +++ b/example/many_task/Makefile.macosx Mon Oct 08 02:03:18 2012 +0900 @@ -2,7 +2,7 @@ SRCS_TMP = $(wildcard *.cc) -SRCS_EXCLUDE = # 除外するファイルを書く +SRCS_EXCLUDE = sort_test.cc ppe/task_init.cc # 除外するファイルを書く SRCS = $(filter-out $(SRCS_EXCLUDE),$(SRCS_TMP)) OBJS = $(SRCS:.cc=.o) @@ -33,7 +33,7 @@ $(CC) -o $(TARGET) $(OBJS) $(TASK_OBJS) $(LIBS) debug: $(TARGET) - sudo gdb ./$(TARGET) + sudo gdb ./$(TARGET) clean: rm -f $(TARGET) $(OBJS) $(TASK_OBJS)
--- a/example/many_task/ppe/Makefile Mon Oct 01 16:51:26 2012 +0900 +++ b/example/many_task/ppe/Makefile Mon Oct 08 02:03:18 2012 +0900 @@ -25,6 +25,12 @@ debug: $(TARGET) sudo gdb ./$(TARGET) +loop: $(OBJS) $(TASK_OBJS) + $(CC) -o $@ $(OBJS) $(TASK_OBJS) $(LIBS) $(LOOP) + +rec: $(OBJS) $(TASK_OBJS) + $(CC) -o $@ $(OBJS) $(TASK_OBJS) $(LIBS) $(REC) + clean: rm -f $(TARGET) $(OBJS) $(TASK_OBJS) rm -f *~ \#*
--- a/example/many_task/ppe/QuickSort.cc Mon Oct 01 16:51:26 2012 +0900 +++ b/example/many_task/ppe/QuickSort.cc Mon Oct 08 02:03:18 2012 +0900 @@ -9,7 +9,7 @@ static void swap( Data *data, int left, int right ) { - Data tmp = data[left]; + Data tmp = data[left]; data[left] = data[right]; data[right] = tmp; } @@ -37,7 +37,7 @@ // printf("[PPE] Quick: length:%d addr->%x \n",end, (int)rbuff); // printf("[PPE] Quick: data[0]: %ld addr->%lx\n",sizeof(r_data),(long)r_data); - quick_sort(r_data, begin, end-1); + quick_sort(r_data, begin, end); #ifdef USE_MEMCPY memcpy(w_data, r_data, sizeof(Data)*end); @@ -50,32 +50,38 @@ void qsort_test(Data *data, int begin, int end ) { - quick_sort(data, begin, end); - printf("end is %d\n",end); + quick_sort(data, begin, end-1); } static void -quick_sort(Data *data, int begin, int end ) { +quick_sort( Data *data, int begin, int end ) { + int stack[1024]; + int sp = 0; + int p; + while (1) { + while (begin < end) { + int where = (begin + end) / 2; + int pivot = data[where].index; + data[where].index = data[begin].index; + int i; + p = begin; + 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; - 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); - } + stack[sp++] = p + 1; + stack[sp++] = end; + end = p - 1; } - data[begin].index = data[p].index; - data[p].index = pivot; - - quick_sort(data, begin, p-1); - quick_sort(data, p+1, end); // tail call + if (sp == 0) return; + end = stack[--sp]; + begin = stack[--sp]; + begin = p + 1; } } - - /* end */
--- a/example/many_task/ppe/QuickSort.cc.loop Mon Oct 01 16:51:26 2012 +0900 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,97 +0,0 @@ -#include "QuickSort.h" -#include <stdio.h> -#include <string.h> - -SchedDefineTask(QuickSort); - -static void quick_sort( Data *data, int begin, int end ) ; -extern void show_data(DataPtr, int); - -static void -swap( Data *data, int left, int right ) -{ - Data tmp = data[left]; - data[left] = data[right]; - data[right] = tmp; -} - -// #define USE_MEMCPY - -static int -run(SchedTask *s, void* rbuff, void* wbuff) -{ - // copy value - int begin = 0; -#if USE_SIMPLE_TASK - int end = s->read_size()/sizeof(Data); - Data *r_data = (Data*)rbuff; -#ifdef USE_MEMCPY - Data *w_data = (Data*)wbuff; -#endif -#else - int end = s->get_inputSize(0)/sizeof(Data); - DataPtr r_data = (DataPtr)s->get_input(0); -#ifdef USE_MEMCPY - DataPtr w_data = (DataPtr)s->get_output(0); -#endif -#endif - - printf("[PPE] Quick: data[0]: %ld addr->%lx\n",sizeof(r_data),(long)r_data); - - // show_data(r_data, end); - quick_sort(r_data, begin, end-1); - // show_data(r_data, end); -#ifdef USE_MEMCPY - memcpy(w_data, r_data, sizeof(Data)*end); -#else - s->swap(); -#endif - - return 0; -} - -void -qsort_test(Data *data, int begin, int end ) { - quick_sort(data, begin, end); - printf("end is %d\n",end); -} - -static void -quick_sort( Data *data, int begin, int end ) { - int stack[1024]; - int sp = 0; - int p = begin; - while (begin < end) { - while (begin < end) { - int where = (begin + end) / 2; - int pivot = data[where].index; - data[where].index = data[begin].index; - 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; - - stack[sp++] = begin; - stack[sp++] = end; - end = p-1; - - // quick_sort(data, begin, p-1); - // beginとp-1のみが変わっている(これだけを保持) - // beginとp-1(end)用のスタックを作ってやればよい - } - if (sp == 0) return; - end = stack[--sp]; - begin = stack[--sp]; - begin = p+1; - // quick_sort(data, p+1, end); // tail call - // そのままループに - } -} - - -/* end */
--- a/example/many_task/ppe/task_init.cc Mon Oct 01 16:51:26 2012 +0900 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,17 +0,0 @@ -#include "Func.h" -#include "Scheduler.h" - -SchedExternTask(QuickSort); -SchedExternTask(SortSimple); -SchedExternTask(SortCompat); - -void -task_init(void) -{ - // ex - // SchedRegisterNDRange(dim,global_size, local_size) - - SchedRegisterTask(QUICK_SORT, QuickSort); - SchedRegister(SortSimple); - SchedRegister(SortCompat); -}