changeset 375:ad44fdb11433

Fix compile error but not work
author Tatsuki IHA <innparusu@cr.ie.u-ryukyu.ac.jp>
date Tue, 18 Jul 2017 16:13:11 +0900
parents fb50cf8aa615
children b46f38645587
files src/parallel_execution/CMakeLists.txt src/parallel_execution/CPUWorker.cbc src/parallel_execution/Iterator.cbc src/parallel_execution/OneDimIterator.cbc src/parallel_execution/context.h src/parallel_execution/examples/bitonicSort.cbc src/parallel_execution/examples/swap.cbc
diffstat 7 files changed, 74 insertions(+), 49 deletions(-) [+]
line wrap: on
line diff
--- a/src/parallel_execution/CMakeLists.txt	Tue Jul 18 15:14:08 2017 +0900
+++ b/src/parallel_execution/CMakeLists.txt	Tue Jul 18 16:13:11 2017 +0900
@@ -66,14 +66,14 @@
   TARGET
       calc
   SOURCES
-      examples/calc.cbc examples/add.cbc examples/mult.cbc examples/InitIntegerDataGears.cbc CPUWorker.cbc time.cbc TaskManagerImpl.cbc SingleLinkedQueue.cbc SynchronizedQueue.cbc
+      examples/calc.cbc examples/add.cbc examples/mult.cbc examples/InitIntegerDataGears.cbc CPUWorker.cbc TaskManagerImpl.cbc SingleLinkedQueue.cbc SynchronizedQueue.cbc
 )
 
 GearsCommand(
   TARGET
       bitonic_sort
   SOURCES
-      examples/bitonicSort.cbc examples/swap.cbc examples/InitIntegerDataGears.cbc CPUWorker.cbc time.cbc TaskManagerImpl.cbc SingleLinkedQueue.cbc SynchronizedQueue.cbc OneDimIterator.cbc
+      examples/bitonicSort.cbc examples/swap.cbc examples/InitIntegerDataGears.cbc CPUWorker.cbc TaskManagerImpl.cbc SingleLinkedQueue.cbc SynchronizedQueue.cbc OneDimIterator.cbc TimeImpl.cbc
 )
 
 if (${USE_CUDA})
--- a/src/parallel_execution/CPUWorker.cbc	Tue Jul 18 15:14:08 2017 +0900
+++ b/src/parallel_execution/CPUWorker.cbc	Tue Jul 18 16:13:11 2017 +0900
@@ -59,13 +59,13 @@
     goto meta(context, context->iterator->barrier);
 }
 
-__code iterateCommit1() {
+__code iterateCommit1(struct Context* task) {
     goto meta(context, C_taskReceiveWorker);
 }
 
-__code iterateCommit_stub(struct Context* context) {
+__code iterateCommit1_stub(struct Context* context) {
     struct Context* workerContext = context->worker->worker->CPUWorker.context;
-    goto iterateCommit(workerContext)
+    goto iterateCommit1(workerContext, context);
 }
 
 __code odgCommit(struct LoopCounter* loopCounter, struct Context* task) {
--- a/src/parallel_execution/Iterator.cbc	Tue Jul 18 15:14:08 2017 +0900
+++ b/src/parallel_execution/Iterator.cbc	Tue Jul 18 16:13:11 2017 +0900
@@ -1,7 +1,8 @@
 typedef struct Iterator<Impl>{
         union Data* iterator;
-        __code exec(Impl* iterator, __code next(...));
-        __code barrier(Impl* iterator, __code next(...));
+        struct Context* task;
+        __code exec(Impl* iterator, struct TaskManager* taskManager, struct Context* task, __code next(...));
+        __code barrier(Impl* iterator, struct Context* task, __code next(...), __code whenWait(...));
         __code whenWait(...);
         __code next(...);
 } Iterator;
--- a/src/parallel_execution/OneDimIterator.cbc	Tue Jul 18 15:14:08 2017 +0900
+++ b/src/parallel_execution/OneDimIterator.cbc	Tue Jul 18 16:13:11 2017 +0900
@@ -1,37 +1,54 @@
 #include "../context.h"
 #include <stdio.h>
 
-Iterator createOneDimIterator(struct Context* context, int x) {
+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_barrierOneDimItearator;
+    iterator->barrier = C_barrierOneDimIterator;
     oneDimIterator->x = x;
     oneDimIterator->count = x;
-    iterator->loopCounter = new LoopCounter();
-    iterator->loopCounter->i = 0;
-    oneDimIterator->exec = C_execOneDimIterator;
+    oneDimIterator->loopCounter = new LoopCounter();
+    oneDimIterator->loopCounter->i = 0;
+    return iterator;
 }
 
-__code execOneDimIterator(struct OneDimIterator* oneDimIterator, struct TaskManager* taskManager, struct context* task, __code next(...)) {
-    if (oneDimIterator->loopCounter->i == oneDimIterator->x) {
-        oneDimIterator->loopCounter->i = 0;
+__code execOneDimIterator(struct OneDimIterator* iterator, struct TaskManager* taskManager, struct Context* task, __code next(...)) {
+    if (iterator->loopCounter->i == iterator->x) {
+        iterator->loopCounter->i = 0;
         goto next(...);
     }
-    struct context* iterate_task = NEW(struct Context);
+    struct Context* iterate_task = NEW(struct Context);
     *iterate_task = *task;
     task->iterate = 1;
-    oneDimIterator->loopCounter->i++;
+    iterator->loopCounter->i++;
     taskManager->taskManager = (union Data*)task->taskManager;
-    taskManager->task = iterate_task;
+    taskManager->context = iterate_task;
     taskManager->next = C_execOneDimIterator;
-    goto meta(context, C_execOneDimIterator);
+    goto meta(context, task->taskManager->spawn);
 }
 
-__code barrierOneDimIterator(struct OneDimIterator* oneDimIterator, struct context* task, __code next(...), __code whenWait(...)) {
-    if (__sync_fetch_and_sub(&oneDimIterator->count, 1) == 1) {
+__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 Jul 18 15:14:08 2017 +0900
+++ b/src/parallel_execution/context.h	Tue Jul 18 16:13:11 2017 +0900
@@ -307,7 +307,8 @@
         enum Code swap;
     } SortArray;
     struct Iterator {
-        struct Iterator *iterator;
+        union Data* iterator;
+        struct Context* task;
         enum Code exec;
         enum Code barrier;
         enum Code whenWait;
@@ -316,6 +317,7 @@
     struct OneDimIterator {
         int x;
         int count;
+        struct LoopCounter *loopCounter;
     } OneDimIterator;
 }; // union Data end       this is necessary for context generator
 
--- a/src/parallel_execution/examples/bitonicSort.cbc	Tue Jul 18 15:14:08 2017 +0900
+++ b/src/parallel_execution/examples/bitonicSort.cbc	Tue Jul 18 16:13:11 2017 +0900
@@ -121,7 +121,7 @@
     }
 
     loopCounter->i = 0;
-    taskManager->next = C_code2;
+    taskManager->next = C_exit_code;
     goto meta(context, taskManager->taskManager->TaskManager.shutdown);
 }
 
--- a/src/parallel_execution/examples/swap.cbc	Tue Jul 18 15:14:08 2017 +0900
+++ b/src/parallel_execution/examples/swap.cbc	Tue Jul 18 16:13:11 2017 +0900
@@ -1,33 +1,38 @@
 #include "../../context.h"
 #include <stdio.h>
-__code swap(struct SortArray sortArray, struct Integer* block, struct Integer* first, struct Integer* i, __code next(struct SortArray* output, ...)) {
-    int position = i->value/block->value;
-    int index = i->value+block->value*position;
-
-    block->value = (first->value == 1)? ((block->value<<1)*(position+1))-(index%block->value)-1 : index+block->value;
-
-    if (sortArray->array[block] < sortArray->array[index]) {
-        int Integer *tmp = sortArray->array[index];
-        sortArray->array[index] = sortArray->array[block];
-        sortArray->array[block] = tmp;
-    }
-
-    *O_output = output;
-    goto meta(context, next);
-}
-
-__code swap_stub(struct Context* context) {
-    SortArray** O_output = (struct SortArray **)&context->data[context->odg];
-    goto add(context,
-            &context->data[context->idg]->SortArray,
-            &context->data[context->idg+1]->Integer,
-            &context->data[context->idg+2]->Integer,
-            &context->data[context->idg+3]->Integer,
-            context->next,
-            O_output);
-}
+//__code swap(struct SortArray sortArray, struct Integer* block, struct Integer* first, struct Integer* i, __code next(struct SortArray* output, ...)) {
+//    int position = i->value/block->value;
+//    int index = i->value+block->value*position;
+//
+//    block->value = (first->value == 1)? ((block->value<<1)*(position+1))-(index%block->value)-1 : index+block->value;
+//
+//    if (sortArray->array[block] < sortArray->array[index]) {
+//        int Integer *tmp = sortArray->array[index];
+//        sortArray->array[index] = sortArray->array[block];
+//        sortArray->array[block] = tmp;
+//    }
+//
+//    *O_output = output;
+//    goto meta(context, next);
+//}
+//
+//__code swap_stub(struct Context* context) {
+//    SortArray** O_output = (struct SortArray **)&context->data[context->odg];
+//    goto swap(context,
+//              &context->data[context->idg]->SortArray,
+//              &context->data[context->idg+1]->Integer,
+//              &context->data[context->idg+2]->Integer,
+//              &context->data[context->idg+3]->Integer,
+//              context->next,
+//              O_output);
+//}
 
 __code printIterator(__code next(...)) {
     printf("test\n");
     goto meta(context, next);
 }
+
+__code printIterator_stub(struct Context* context) {
+    goto printIterator(context,
+                       context->next);
+}