changeset 402:e958a409943c

Change iterator implement from oneDim to multiDim
author Tatsuki IHA <innparusu@cr.ie.u-ryukyu.ac.jp>
date Fri, 01 Sep 2017 06:18:53 +0900
parents 408b4aab7610
children 83c9aeb1fe3e
files src/parallel_execution/CMakeLists.txt src/parallel_execution/MultiDimIterator.cbc src/parallel_execution/OneDimIterator.cbc src/parallel_execution/context.h src/parallel_execution/generate_stub.pl src/parallel_execution/test/multiDimIterator_test.cbc src/parallel_execution/test/oneDimIterator_test.cbc src/parallel_execution/test/printIterator.cbc
diffstat 8 files changed, 234 insertions(+), 209 deletions(-) [+]
line wrap: on
line diff
--- a/src/parallel_execution/CMakeLists.txt	Tue Aug 29 21:50:57 2017 +0900
+++ b/src/parallel_execution/CMakeLists.txt	Fri Sep 01 06:18:53 2017 +0900
@@ -73,7 +73,7 @@
   TARGET
       bitonicSort
   SOURCES
-      examples/bitonicSort/bitonicSort.cbc examples/bitonicSort/swap.cbc CPUWorker.cbc TaskManagerImpl.cbc SingleLinkedQueue.cbc SynchronizedQueue.cbc OneDimIterator.cbc TimeImpl.cbc
+      examples/bitonicSort/bitonicSort.cbc examples/bitonicSort/swap.cbc CPUWorker.cbc TaskManagerImpl.cbc SingleLinkedQueue.cbc SynchronizedQueue.cbc MultiDimIterator.cbc TimeImpl.cbc
 )
 
 if (${USE_CUDA})
@@ -102,9 +102,9 @@
 
 GearsCommand(
   TARGET
-  oneDimIterator_test
+  multiDimIterator_test
   SOURCES
-      test/oneDimIterator_test.cbc test/printIterator.cbc CPUWorker.cbc TaskManagerImpl.cbc SingleLinkedQueue.cbc SynchronizedQueue.cbc OneDimIterator.cbc TimeImpl.cbc
+      test/multiDimIterator_test.cbc test/printIterator.cbc CPUWorker.cbc TaskManagerImpl.cbc SingleLinkedQueue.cbc SynchronizedQueue.cbc MultiDimIterator.cbc TimeImpl.cbc
 )
 
 GearsCommand(
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/parallel_execution/MultiDimIterator.cbc	Fri Sep 01 06:18:53 2017 +0900
@@ -0,0 +1,102 @@
+#include "../context.h"
+#include <stdio.h>
+
+Iterator* createMultiDimIterator(struct Context* context, int x, int y, int z) {
+    struct Iterator* iterator = new Iterator();
+    struct MultiDimIterator* multiDimIterator = new MultiDimIterator();
+    iterator->iterator = (union Data*)multiDimIterator;
+    iterator->exec = C_execMultiDimIterator;
+    iterator->barrier = C_barrierMultiDimIterator;
+    multiDimIterator->x = x;
+    multiDimIterator->y = y;
+    multiDimIterator->z = z;
+    multiDimIterator->count = x * y * z;
+    multiDimIterator->counterX = 0;
+    multiDimIterator->counterY = 0;
+    multiDimIterator->counterZ = 0;
+    return iterator;
+}
+
+/**
+ * create iterateTask with index, that copy from task argument
+ * @return created iterateTask
+ * @param task      task of the copy source
+ * @x     index
+ */
+struct Context* createMultiDimIterateTask(struct Context* task, int x, int y, int z) {
+    struct Context* task1 = NEW(struct Context);
+    initContext(task1);
+    task1->taskManager = task->taskManager;
+    task1->next     = task->next;
+    task1->iterate  = 1;
+    task1->iterator = task->iterator;
+    task1->idgCount = task->idgCount;
+    task1->idg      = task->idg;
+    task1->maxIdg   = task->maxIdg;
+    for(int i = task1->idg; i < task1->maxIdg; i++) {
+        task1->data[i] = task->data[i];
+    }
+
+    // create index data gear and register input data to iterate task
+    struct MultiDim* multiDim = &ALLOCATE_DATA_GEAR(task1, MultiDim)->MultiDim;
+    multiDim->x = x;
+    multiDim->y = y;
+    multiDim->z = z;
+    task1->data[task1->maxIdg++] = (union Data*)multiDim;
+
+    task1->odg      = task->odg + 1;
+    task1->maxOdg   = task->maxOdg + 1;
+    for (int i = task1->odg; i < task1->maxOdg; i++) {
+        task1->data[i] = task->data[i-1];
+    }
+
+    return task1;
+}
+
+__code execMultiDimIterator(struct MultiDimIterator* iterator, struct TaskManager* taskManager, struct Context* task, __code next(...)) {
+    int x = iterator->counterX;
+    int y = iterator->counterY;
+    int z = iterator->counterZ;
+    struct Context* iterateTask = createMultiDimIterateTask(task, x, y, z);
+    taskManager->taskManager = (union Data*)task->taskManager;
+    taskManager->context = iterateTask;
+    taskManager->next = C_execMultiDimIterator1;
+    goto meta(context, task->taskManager->spawn);
+}
+
+__code execMultiDimIterator_stub(struct Context* context) {
+    MultiDimIterator* iterator = (MultiDimIterator*)GearImpl(context, Iterator, iterator);
+    TaskManager* taskManager = Gearef(context, TaskManager);
+    Context* task = Gearef(context, Iterator)->task;
+    enum Code next = Gearef(context, Iterator)->next;
+    goto execMultiDimIterator(context, iterator, taskManager, task, next);
+} 
+
+__code execMultiDimIterator1(struct MultiDimIterator* iterator, struct Context* task, __code next(...)) {
+    if (++iterator->counterX >= iterator->x) {
+        iterator->counterX = 0;
+        if (++iterator->counterY >= iterator->y) {
+            iterator->counterY = 0;
+            if (++iterator->counterZ >= iterator->z) {
+                iterator->counterZ = 0;
+                goto next(...);
+            }
+        }
+    }
+    goto meta(context, C_execMultiDimIterator);
+}
+
+__code barrierMultiDimIterator(struct MultiDimIterator* iterator, struct Context* task, __code next(...), __code whenWait(...)) {
+    if (__sync_fetch_and_sub(&iterator->count, 1) == 1) {
+        goto next(...);
+    }
+    goto whenWait(...);
+}
+
+__code barrierMultiDimIterator_stub(struct Context* context) {
+    MultiDimIterator* iterator = (MultiDimIterator*)GearImpl(context, Iterator, iterator);
+    Context* task = Gearef(context, Iterator)->task;
+    enum Code next = Gearef(context, Iterator)->next;
+    enum Code whenWait = Gearef(context, Iterator)->whenWait;
+    goto barrierMultiDimIterator(context, iterator, task, next, whenWait);
+}
--- a/src/parallel_execution/OneDimIterator.cbc	Tue Aug 29 21:50:57 2017 +0900
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,86 +0,0 @@
-#include "../context.h"
-#include <stdio.h>
-
-Iterator* createOneDimIterator(struct Context* context, int x) {
-    struct Iterator* iterator = new Iterator();
-    struct OneDimIterator* oneDimIterator = new OneDimIterator();
-    iterator->iterator = (union Data*)oneDimIterator;
-    iterator->exec = C_execOneDimIterator;
-    iterator->barrier = C_barrierOneDimIterator;
-    oneDimIterator->x = x;
-    oneDimIterator->count = x;
-    oneDimIterator->loopCounter = new LoopCounter();
-    oneDimIterator->loopCounter->i = 0;
-    return iterator;
-}
-
-/**
- * create iterateTask with index, that copy from task argument
- * @return created iterateTask
- * @param task      task of the copy source
- * @x     index
- */
-struct Context* createOneDimIterateTask(struct Context* task, int x) {
-    struct Context* task1 = NEW(struct Context);
-    initContext(task1);
-    task1->taskManager = task->taskManager;
-    task1->next     = task->next;
-    task1->iterate  = 1;
-    task1->iterator = task->iterator;
-    task1->idgCount = task->idgCount;
-    task1->idg      = task->idg;
-    task1->maxIdg   = task->maxIdg;
-    for(int i = task1->idg; i < task1->maxIdg; i++) {
-        task1->data[i] = task->data[i];
-    }
-
-    // create index data gear and register input data to iterate task
-    struct Integer* dataX = &ALLOCATE_DATA_GEAR(task1, Integer)->Integer;
-    dataX->value = x;
-    task1->data[task1->maxIdg++] = (union Data*)dataX;
-
-    task1->odg      = task->odg + 1;
-    task1->maxOdg   = task->maxOdg + 1;
-    for (int i = task1->odg; i < task1->maxOdg; i++) {
-        task1->data[i] = task->data[i-1];
-    }
-
-    return task1;
-}
-
-__code execOneDimIterator(struct OneDimIterator* iterator, struct TaskManager* taskManager, struct Context* task, __code next(...)) {
-    int i = iterator->loopCounter->i;
-    if (i == iterator->x) {
-        iterator->loopCounter->i = 0;
-        goto next(...);
-    }
-    struct Context* iterateTask = createOneDimIterateTask(task, i);
-    iterator->loopCounter->i++;
-    taskManager->taskManager = (union Data*)task->taskManager;
-    taskManager->context = iterateTask;
-    taskManager->next = C_execOneDimIterator;
-    goto meta(context, task->taskManager->spawn);
-}
-
-__code execOneDimIterator_stub(struct Context* context) {
-    OneDimIterator* iterator = (OneDimIterator*)GearImpl(context, Iterator, iterator);
-    TaskManager* taskManager = Gearef(context, TaskManager);
-    Context* task = Gearef(context, Iterator)->task;
-    enum Code next = Gearef(context, Iterator)->next;
-    goto execOneDimIterator(context, iterator, taskManager, task, next);
-} 
-
-__code barrierOneDimIterator(struct OneDimIterator* iterator, struct Context* task, __code next(...), __code whenWait(...)) {
-    if (__sync_fetch_and_sub(&iterator->count, 1) == 1) {
-        goto next(...);
-    }
-    goto whenWait(...);
-}
-
-__code barrierOneDimIterator_stub(struct Context* context) {
-    OneDimIterator* iterator = (OneDimIterator*)GearImpl(context, Iterator, iterator);
-    Context* task = Gearef(context, Iterator)->task;
-    enum Code next = Gearef(context, Iterator)->next;
-    enum Code whenWait = Gearef(context, Iterator)->whenWait;
-    goto barrierOneDimIterator(context, iterator, task, next, whenWait);
-}
--- a/src/parallel_execution/context.h	Tue Aug 29 21:50:57 2017 +0900
+++ b/src/parallel_execution/context.h	Fri Sep 01 06:18:53 2017 +0900
@@ -317,11 +317,20 @@
         enum Code whenWait;
         enum Code next;
     } Iterator;
-    struct OneDimIterator {
+    struct MultiDimIterator {
         int x;
+        int y;
+        int z;
         int count;
-        struct LoopCounter *loopCounter;
-    } OneDimIterator;
+        int counterX;
+        int counterY;
+        int counterZ;
+    } MultiDimIterator;
+    struct MultiDim {
+        int x;
+        int y;
+        int z;
+    } MultiDim;
 }; // union Data end       this is necessary for context generator
 
 typedef union Data Data;
--- a/src/parallel_execution/generate_stub.pl	Tue Aug 29 21:50:57 2017 +0900
+++ b/src/parallel_execution/generate_stub.pl	Fri Sep 01 06:18:53 2017 +0900
@@ -420,10 +420,10 @@
                 my $outputCount = $codeGear{$codeGearName}->{'output'};
                 my @dataGears = split(/,\s*/, $3);
                 my $nextCodeGear = pop(@dataGears);
-                my $iterateCount;
+                my $iterateCounts;
                 # parse examples 'par goto(.., iterate(10), exit);'
-                if ($3 =~ /iterate\((\d*)\)/) {
-                    $iterateCount = $1;
+                if ($3 =~ /iterate\((.*)?\)/) {
+                    $iterateCounts = $1;
                     $inputCount--;
                     # pop iterate statement
                     pop(@dataGears);
@@ -445,9 +445,9 @@
 ${prev}task->maxOdg = task->odg + $outputCount;
 EOFEOF
                 print $fd $initTask;
-                if (defined $iterateCount) {
+                if (defined $iterateCounts) {
                     print $fd "${prev}task->iterate = 0;\n";
-                    print $fd "${prev}task->iterator = createOneDimIterator(context, $iterateCount);\n";
+                    print $fd "${prev}task->iterator = createMultiDimIterator(context, $iterateCounts);\n";
                 }
                 for my $i (0..$inputCount-1) {
                     print $fd "${prev}task->data[task->idg+$i] = (union Data*)@dataGears[$i];\n";
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/parallel_execution/test/multiDimIterator_test.cbc	Fri Sep 01 06:18:53 2017 +0900
@@ -0,0 +1,109 @@
+#include <stdio.h>
+#include <string.h>
+#include <stdlib.h>
+#include <unistd.h>
+
+#include "../../context.h"
+
+int cpu_num = 1;
+int length = 1;
+int gpu_num = 0;
+int CPU_ANY = -1;
+int CPU_CUDA = -1;
+
+void *start_taskManager(struct Context *context) {
+    goto initDataGears(context, Gearef(context, LoopCounter), Gearef(context, TaskManager));
+    return 0;
+}
+
+#ifdef USE_CUDAWorker
+#ifdef USE_CUDA_MAIN_THREAD
+extern volatile int cuda_initialized;
+#endif
+#endif
+
+__code initDataGears(struct LoopCounter* loopCounter, struct TaskManager* taskManager) {
+    // loopCounter->tree = createRedBlackTree(context);
+    loopCounter->i = 0;
+    taskManager->taskManager = (union Data*)createTaskManagerImpl(context, cpu_num, gpu_num, 0);
+#ifdef USE_CUDAWorker
+#ifdef USE_CUDA_MAIN_THREAD
+    while(! cuda_initialized) {};
+#endif
+#endif
+    goto meta(context, C_code1);
+}
+
+__code initDataGears_stub(struct Context* context) {
+    struct TaskManager* taskManager =  Gearef(context, TaskManager);
+    taskManager->taskManager = 0;
+#if (! defined(USE_CUDAWorker) || ! defined(USE_CUDA_MAIN_THREAD))
+    struct LoopCounter* loopCounter = Gearef(context, LoopCounter);
+    goto initDataGears(context, loopCounter, taskManager);
+#else
+    cuda_initialized = 0;
+    pthread_t thread;
+    pthread_create(&thread, NULL, (void*)&start_taskManager, context);
+    while (taskManager->taskManager == 0);
+    TaskManager *t = (TaskManager*)taskManager->taskManager;
+    TaskManagerImpl *im = (TaskManagerImpl*)t->taskManager;
+    struct Queue *q = (Queue *)im->workers[0];
+    createCUDAWorker(context,0,q, im);
+    pthread_join(thread,0);
+    exit(0);
+#endif
+}
+
+__code code1(struct Time* time) {
+    printf("cpus:\t\t%d\n", cpu_num);
+    printf("gpus:\t\t%d\n", gpu_num);
+    printf("length:\t\t%d\n", length);
+    /* puts("queue"); */
+    /* print_queue(context->data[ActiveQueue]->queue.first); */
+    /* puts("tree"); */
+    /* print_tree(context->data[Tree]->tree.root); */
+    /* puts("result"); */
+
+    time->time = (union Data*)createTimeImpl(context);
+    time->next = C_createTask1;
+    goto meta(context, time->time->Time.start);
+}
+
+__code createTask1(struct LoopCounter* loopCounter, struct TaskManager* taskManager, struct Time* time) {
+    int i = loopCounter->i;
+
+    if (i < length) {
+        loopCounter->i++;
+        goto meta(context, C_createTask2);
+    }
+
+    loopCounter->i = 0;
+    taskManager->next = C_exit_code;
+    goto meta(context, taskManager->taskManager->TaskManager.shutdown);
+}
+
+__code createTask2(struct TaskManager* taskManager) {
+    par goto printIterator(iterate(2, 2, 2), exit);
+    goto createTask1();
+}
+
+void init(int argc, char** argv) {
+    for (int i = 1; argv[i]; ++i) {
+        if (strcmp(argv[i], "-cpu") == 0)
+            cpu_num = (int)atoi(argv[i+1]);
+        else if (strcmp(argv[i], "-l") == 0)
+            length = (int)atoi(argv[i+1]);
+        else if (strcmp(argv[i], "-cuda") == 0) {
+            gpu_num = 1;
+            CPU_CUDA = 0;
+        }
+    }
+}
+
+int main(int argc, char** argv) {
+    init(argc, argv);
+    struct Context* main_context = NEW(struct Context);
+    initContext(main_context);
+    main_context->next = C_initDataGears;
+    goto start_code(main_context);
+}
--- a/src/parallel_execution/test/oneDimIterator_test.cbc	Tue Aug 29 21:50:57 2017 +0900
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,109 +0,0 @@
-#include <stdio.h>
-#include <string.h>
-#include <stdlib.h>
-#include <unistd.h>
-
-#include "../../context.h"
-
-int cpu_num = 1;
-int length = 100;
-int gpu_num = 0;
-int CPU_ANY = -1;
-int CPU_CUDA = -1;
-
-void *start_taskManager(struct Context *context) {
-    goto initDataGears(context, Gearef(context, LoopCounter), Gearef(context, TaskManager));
-    return 0;
-}
-
-#ifdef USE_CUDAWorker
-#ifdef USE_CUDA_MAIN_THREAD
-extern volatile int cuda_initialized;
-#endif
-#endif
-
-__code initDataGears(struct LoopCounter* loopCounter, struct TaskManager* taskManager) {
-    // loopCounter->tree = createRedBlackTree(context);
-    loopCounter->i = 0;
-    taskManager->taskManager = (union Data*)createTaskManagerImpl(context, cpu_num, gpu_num, 0);
-#ifdef USE_CUDAWorker
-#ifdef USE_CUDA_MAIN_THREAD
-    while(! cuda_initialized) {};
-#endif
-#endif
-    goto meta(context, C_code1);
-}
-
-__code initDataGears_stub(struct Context* context) {
-    struct TaskManager* taskManager =  Gearef(context, TaskManager);
-    taskManager->taskManager = 0;
-#if (! defined(USE_CUDAWorker) || ! defined(USE_CUDA_MAIN_THREAD))
-    struct LoopCounter* loopCounter = Gearef(context, LoopCounter);
-    goto initDataGears(context, loopCounter, taskManager);
-#else
-    cuda_initialized = 0;
-    pthread_t thread;
-    pthread_create(&thread, NULL, (void*)&start_taskManager, context);
-    while (taskManager->taskManager == 0);
-    TaskManager *t = (TaskManager*)taskManager->taskManager;
-    TaskManagerImpl *im = (TaskManagerImpl*)t->taskManager;
-    struct Queue *q = (Queue *)im->workers[0];
-    createCUDAWorker(context,0,q, im);
-    pthread_join(thread,0);
-    exit(0);
-#endif
-}
-
-__code code1(struct Time* time) {
-    printf("cpus:\t\t%d\n", cpu_num);
-    printf("gpus:\t\t%d\n", gpu_num);
-    printf("length:\t\t%d\n", length);
-    /* puts("queue"); */
-    /* print_queue(context->data[ActiveQueue]->queue.first); */
-    /* puts("tree"); */
-    /* print_tree(context->data[Tree]->tree.root); */
-    /* puts("result"); */
-
-    time->time = (union Data*)createTimeImpl(context);
-    time->next = C_createTask1;
-    goto meta(context, time->time->Time.start);
-}
-
-__code createTask1(struct LoopCounter* loopCounter, struct TaskManager* taskManager, struct Time* time) {
-    int i = loopCounter->i;
-
-    if (i < length) {
-        loopCounter->i++;
-        goto meta(context, C_createTask2);
-    }
-
-    loopCounter->i = 0;
-    taskManager->next = C_exit_code;
-    goto meta(context, taskManager->taskManager->TaskManager.shutdown);
-}
-
-__code createTask2(struct TaskManager* taskManager) {
-    par goto printIterator(iterate(10), exit);
-    goto createTask1();
-}
-
-void init(int argc, char** argv) {
-    for (int i = 1; argv[i]; ++i) {
-        if (strcmp(argv[i], "-cpu") == 0)
-            cpu_num = (int)atoi(argv[i+1]);
-        else if (strcmp(argv[i], "-l") == 0)
-            length = (int)atoi(argv[i+1]);
-        else if (strcmp(argv[i], "-cuda") == 0) {
-            gpu_num = 1;
-            CPU_CUDA = 0;
-        }
-    }
-}
-
-int main(int argc, char** argv) {
-    init(argc, argv);
-    struct Context* main_context = NEW(struct Context);
-    initContext(main_context);
-    main_context->next = C_initDataGears;
-    goto start_code(main_context);
-}
--- a/src/parallel_execution/test/printIterator.cbc	Tue Aug 29 21:50:57 2017 +0900
+++ b/src/parallel_execution/test/printIterator.cbc	Fri Sep 01 06:18:53 2017 +0900
@@ -1,12 +1,12 @@
 #include "../../context.h"
 #include <stdio.h>
-__code printIterator(struct Integer* x, __code next(...)) {
-    printf("%d\n", x->value);
+__code printIterator(struct MultiDim* multiDim, __code next(...)) {
+    printf("x: %d, y: %d, z: %d\n", multiDim->x, multiDim->y, multiDim->z);
     goto meta(context, next);
 }
 
 __code printIterator_stub(struct Context* context) {
     goto printIterator(context,
-                       &context->data[context->idg]->Integer,
+                       &context->data[context->idg]->MultiDim,
                        context->next);
 }