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);
-}