changeset 120:4df5bc41561d

Merge
author Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
date Tue, 19 Jul 2016 18:42:52 +0900
parents 4df53a60e59a (diff) c53f105a48c1 (current diff)
children bb8be1820302
files
diffstat 6 files changed, 176 insertions(+), 142 deletions(-) [+]
line wrap: on
line diff
--- a/src/parallel_execution/allocate.c	Thu Jul 14 20:29:06 2016 +0900
+++ b/src/parallel_execution/allocate.c	Tue Jul 19 18:42:52 2016 +0900
@@ -4,3 +4,8 @@
     context->data[++context->dataNum] = context->heap;
     context->heap += context->data[Allocate]->allocate.size;
 }
+
+void metaAllocator(struct Context* context) {
+    context->mData[++context->metaDataNum] = context->heap;
+    context->heap += context->data[Allocate]->allocate.size;
+}
--- a/src/parallel_execution/context.c	Thu Jul 14 20:29:06 2016 +0900
+++ b/src/parallel_execution/context.c	Tue Jul 19 18:42:52 2016 +0900
@@ -49,8 +49,8 @@
 extern __code createData2_stub(struct Context*);
 extern __code createTask1_stub(struct Context*);
 extern __code createTask2_stub(struct Context*);
-extern __code createTask3_stub(struct Context*);
-extern __code createTask4_stub(struct Context*);
+/* extern __code createTask3_stub(struct Context*); */
+/* extern __code createTask4_stub(struct Context*); */
 extern __code putQueue1_stub(struct Context*);
 extern __code putQueue2_stub(struct Context*);
 extern __code putQueue3_stub(struct Context*);
@@ -114,8 +114,8 @@
     context->code[CreateData2]   = createData2_stub;
     context->code[CreateTask1]   = createTask1_stub;
     context->code[CreateTask2]   = createTask2_stub;
-    context->code[CreateTask3]   = createTask3_stub;
-    context->code[CreateTask4]   = createTask4_stub;
+    /* context->code[CreateTask3]   = createTask3_stub; */
+    /* context->code[CreateTask4]   = createTask4_stub; */
     context->code[PutQueue1]     = putQueue1_stub;
     context->code[PutQueue2]     = putQueue2_stub;
     context->code[PutQueue3]     = putQueue3_stub;
@@ -166,6 +166,7 @@
 
     context->dataNum = Queue;
     
+    context->metaDataNum = 0;
     context->node_stack = stack_init(sizeof(struct Node*), 100);
     context->code_stack = stack_init(sizeof(enum Code), 100);
 }
--- a/src/parallel_execution/context.h	Thu Jul 14 20:29:06 2016 +0900
+++ b/src/parallel_execution/context.h	Tue Jul 19 18:42:52 2016 +0900
@@ -60,8 +60,6 @@
     CreateData2,
     CreateTask1,
     CreateTask2,
-    CreateTask3,
-    CreateTask4,
     PutQueue1,
     PutQueue2,
     PutQueue3,
@@ -106,7 +104,9 @@
     stack_ptr code_stack;
     stack_ptr node_stack;
     int dataNum;
+    int metaDataNum;
     union Data **data;
+    union MetaData **mData;
 };
 
 union Data {
@@ -132,9 +132,8 @@
 #endif
     struct Task {
         enum Code code;
-        int key;
-        struct Queue* waitMe;
-        struct Queue* waitI;
+        int iKeys[2];
+        int oKeys[2];
         int idsCount;
     } task;
     struct Queue {
@@ -176,13 +175,13 @@
         enum Code next;
         long size;
     } allocate;
-    struct OutPutDataSegments {
-        union Data **data;
-    } ods;
+    struct Integer {
+        int value;
+        int mDataOffset;
+    } integer;
 };
 
 union MetaData {
     struct Queue waitMeTasks;
-    struct Queue waitI;
 };
 
--- a/src/parallel_execution/dependency.c	Thu Jul 14 20:29:06 2016 +0900
+++ b/src/parallel_execution/dependency.c	Tue Jul 19 18:42:52 2016 +0900
@@ -7,36 +7,25 @@
     goto (context->code[next])(context);
 }
 
-__code waitFor1(struct Context* context, struct Task* master, struct Task* slave, struct Element* element) {
+__code waitFor1(struct Context* context, struct Task* master, struct Task* slave, struct Element* element, union Data* data) {
+    struct Integer integer = (struct Integer *)data;
+    struct Queue waitMeTasks = (struct Queue *)(integer + integer-> mDataOffset);
     element->data = (union Data *)slave;
     // enqueue waitMe
-    goto meta_waitFor(context, master->waitMe, PutQueue1);
+    goto meta_waitFor(context, waitMeTasks, PutQueue1);
 }
 
 __code waitFor1_stub(struct Context* context) {
-    // next think
+    // think
 }
 
-//__code waitFor2(struct Context* context, struct Task* master, struct Task* slave, struct Element* element) {
-//    element->task = master;
-//    task->next = context->next;
-//    // enqueue waitI
-//    goto meta_waitFor(context, task->waitI, PutQueue1);
-//}
-//
-//__code waitFor2_stub(struct Context* context) {
-//    // next think
-//}
-
 __code meta_spawnTask(struct Context* context, struct Queue* queue, enum Code next) {
     context->data[Queue] = (union Data *)queue;
     goto (context->code[next])(context);
 }
 
 __code spawnTask(struct Context* context, struct Task* task, struct Element* element, struct Queue* activeQueue, struct Queue* waitQueue) {
-    //printf("spawn Task\n");
-    element->data = (union Data *)task;
-    if (task->waitI->count == task->idsCount) {
+    if (task->idsCount == 0) {
         //printf("put ActiveQueue\n");
         // enqueue activeQueue
         goto meta_spawnTask(context, activeQueue, PutQueue1);
@@ -49,23 +38,42 @@
 
 __code spawnTask_stub(struct Context* context) {
     goto spawnTask(context,
-            &context->data[context->dataNum-2]->task,
+            &context->data[context->dataNum]->task,
             &context->data[Element]->element,
             &context->data[ActiveQueue]->queue,
             &context->data[WaitQueue]->queue);
 }
 
-__code taskA(struct Context* context) {
-    printf("TaskA\n");
-    goto meta(context, context->next);
+__code meta_check_task_finish1(struct Context* context, struct Queue* queue, enum Code next) {
+    context->data[Queue] = (union Data *)queue;
+    goto (context->code[next])(context);
+}
+
+__code check_task_finish1(struct Context* context, struct Data* data) {
+    struct Integer integer = (struct Integer *)data;
+    struct Queue waitMeTasks = (struct Queue *)(integer + integer->mDataOffset);
+    context->next = check_task_finish2;
+    goto meta_check_task_finish1(context, waitMeTasks, CheckTaskFinish2);
+}
+
+__code check_task_finish1_stub(struct Context* context) {
 }
 
-__code taskB(struct Context* context) {
-    printf("TaskB\n");
-    goto meta(context, context->next);
+/*
+ * ready input data Gear for waitme task
+ */
+__code check_task_finish2(struct Context* context) {
+    struct Task task = ((struct Task) element -> data);
+    task->idsCount--;
 }
 
-__code taskC(struct Context* context) {
-    printf("TaskC\n");
-    goto meta(context, context->next);
+__code check_task_finish2_stub(struct Context* context) {
 }
+
+__code add(struct Context* context, struct Integer* input1, struct Integer* input2, struct Integer* output) {
+    output->value = input1->value + input2->value;
+}
+
+__code mult(struct Context* context, struct Integer* input1, struct Integer* input2, struct Integer* output) {
+    output->value = input1->value * input2->value;
+}
--- a/src/parallel_execution/main.c	Thu Jul 14 20:29:06 2016 +0900
+++ b/src/parallel_execution/main.c	Tue Jul 19 18:42:52 2016 +0900
@@ -68,13 +68,13 @@
     goto code2(context, &context->data[Node]->node.value->array, &context->data[LoopCounter]->loopCounter);
 }
 
+/*
 __code createData1(struct Context* context, struct Allocate* allocate, struct LoopCounter* loopCounter) {
     int i = loopCounter->i;
 
     if ((length/split*i) < length) {
         allocate->size = sizeof(struct Array);
         allocator(context);
-
         goto meta(context, CreateData2);
     }
 
@@ -106,6 +106,44 @@
             &context->data[LoopCounter]->loopCounter,
             &context->data[context->dataNum]->array,
             &context->data[Node]->node);
+} */
+
+__code createData1(struct Context* context, struct Allocate* allocate, struct LoopCounter* loopCounter) {
+    int i = loopCounter->i;
+
+    if (i < 4) {
+        allocate->size = sizeof(struct Queue);
+        metaAllocator(context);
+        allocate->size = sizeof(struct Integer);
+        allocator(context);
+        goto meta(context, CreateData2);
+    }
+
+    goto meta(context, CreateTask1);
+}
+
+__code createData1_stub(struct Context* context) {
+    goto createData1(context, &context->data[Allocate]->allocate, &context->data[LoopCounter]->loopCounter);
+}
+
+__code createData2(struct Context* context, struct LoopCounter* loopCounter, struct Integer* integer, struct Node* node) {
+    int i = loopCounter->i;
+    integer->value = i;
+    integer->mDataOffset = -sizeof(struct Queue);
+    node->key = i;
+    node->value = (union Data*)integer;
+
+    context->next = CreateData1;
+    loopCounter->i++;
+
+    goto meta(context, PutTree);
+}
+
+__code createData2_stub(struct Context* context) {
+    goto createData2(context,
+            &context->data[LoopCounter]->loopCounter,
+            &context->data[context->dataNum]->integer,
+            &context->data[Node]->node);
 }
 
 __code createTask1(struct Context* context, struct Allocate* allocate) {
@@ -118,112 +156,86 @@
     goto createTask1(context, &context->data[Allocate]->allocate);
 }
 
-__code createTask2(struct Context* context, struct Allocate* allocate) {
-    allocate->size = sizeof(struct Queue);
-    allocator(context);
-    goto meta(context, CreateTask3);
-}
+/*
+   __code createTask2(struct Context* context, struct LoopCounter* loopCounter, struct Task* task, struct Element* element) {
+   int i = loopCounter->i;
 
-__code createTask2_stub(struct Context* context) {
-    goto createTask2(context, &context->data[Allocate]->allocate);
-}
+   task->code = Twice;
+   task->key = i;
+
+   element->data = (union Data *)task;
+
+   context->next = CreateData1;
+   loopCounter->i++;
 
-__code createTask3(struct Context* context, struct Allocate* allocate) {
-    allocate->size = sizeof(struct Queue);
-    allocator(context);
-    goto meta(context, CreateTask4);
-}
+   goto meta(context, SpawnTask);
+   }
 
-__code createTask3_stub(struct Context* context) {
-    goto createTask3(context, &context->data[Allocate]->allocate);
-}
+   __code createTask2_stub(struct Context* context) {
+   goto createTask2(context,
+   &context->data[LoopCounter]->loopCounter,
+   &context->data[context->dataNum]->task,
+   &context->data[Element]->element);
+   }
+*/
 
-__code meta_createTask4(struct Context* context, struct Queue* activeQueue, enum Code next) {
-    context->data[Queue] = (union Data *)activeQueue;
-    goto (context->code[next])(context);
-}
 
-__code createTask4(struct Context* context, struct LoopCounter* loopCounter, struct Task* task, struct Queue* waitMe, struct Queue* waitI, struct Element* element, struct Queue* activeQueue) {
+__code createTask2(struct Context* context, struct LoopCounter* loopCounter, struct Task* task, struct Element* element, struct Queue* activeQueue) {
     int i = loopCounter->i;
 
-    waitMe->first = 0;
-    waitMe->last = 0;
-    waitMe->count = 0;
-
-    waitI->first = 0;
-    waitI->last = 0;
-    waitI->count = 0;
-
-    task->code = Twice;
-    task->key = i;
-    task->waitMe = waitMe;
-    task->waitI = waitI;
-    task->idsCount = 0;
+    task->code = Mult;
+    task->iKeys[0] = i-1;
+    task->iKeys[1] = i-2;
+    task->idsCount = 1;
+    loopCounter->i -= 2;
 
     element->data = (union Data *)task;
 
-    context->next = CreateData1;
-    loopCounter->i++;
+    context->next = CreateTask3;
 
     goto meta(context, SpawnTask);
 }
 
-__code createTask4_stub(struct Context* context) {
-    goto createTask4(context,
+__code createTask2_stub(struct Context* context) {
+    goto createTask2(context,
             &context->data[LoopCounter]->loopCounter,
-            &context->data[context->dataNum-2]->task,
-            &context->data[context->dataNum-1]->queue,
-            &context->data[context->dataNum]->queue,
-            &context->data[Element]->element,
-            &context->data[ActiveQueue]->queue);
+            &context->data[context->dataNum]->task,
+            &context->data[Element]->element);
+}
+
+__code createTask3(struct Context* context, struct Allocate* allocate) {
+    allocate->size = sizeof(struct Task);
+    allocator(context);
+    goto meta(context, CreateTask2);
+}
+
+__code createTask3_stub(struct Context* context) {
+    goto createTask1(context, &context->data[Allocate]->allocate);
 }
 
 
-//__code createTask4(struct Context* context, struct LoopCounter* loopCounter, struct Task* task, struct Queue* waitMe, struct OdsQueue* waitI, struct Element* element, struct Queue* activeQueue) {
-//    int i = loopCounter->i;
-//
-//    task->code = TaskC;
-//    task->key = i;
-//    task->waitMe = waitMe;
-//    task->waitI = waitI;
-//    task->idsCount = 1;
-//
-//    element->data = (union Data *)task;
-//
-//    context->next = CreateData1;
-//    loopCounter->i++;
-//
-//    goto meta_createTask2(context, activeQueue, PutQueue1);
-//}
-//
-//__code createTask4_stub(struct Context* context) {
-//    goto createTask2(context,
-//            &context->data[LoopCounter]->loopCounter,
-//            &context->data[context->dataNum]->task,
-//            &context->data[context->dataNum-1]->queue,
-//            &context->data[context->dataNum-2]->odsQueue,
-//            &context->data[Element]->element,
-//            &context->data[ActiveQueue]->queue);
-//}
-//
-//__code createTask5(struct Context* context, struct LoopCounter* loopCounter, struct Task* task, struct Task* slave, struct Element* element) {
-//    int i = loopCounter->i;
-//
-//    task->code = TaskB;
-//    task->key = i;
-//    element->data = (union Data *)task;
-//
-//    context->next = CreateData1;
-//    loopCounter->i++;
-//
-//    goto meta(context, WaitFor1);
-//}
-//
-//__code createTask5_stub(struct Context* context) {
-//    goto createTask2(context,
-//            &context->data[context->dataNum]->task,
-//            &context->data[Element]->element);
-//}
+__code createTask4(struct Context* context, struct LoopCounter* loopCounter, struct Task* task, struct Element* element, struct Node* node) {
+    int i = loopCounter->i;
+
+    task->code = Add;
+    task->oKeys[0] = i;
+    task->iKeys[0] = i-1;
+    task->iKeys[1] = i-2;
+    loopCounter->i -= 2;
+    element->data = (union Data *)task;
+    context->next = WaitFor1;
+
+    node->key = okeys[0];
+    goto meta(context, Get);
+}
+
+__code createTask4_stub(struct Context* context) {
+    goto createTask3(context,
+            &context->data[LoopCounter]->loopCounter,
+            &context->data[context->dataNum]->task,
+            &context->data[Node]->node,
+            &context->data[Element]->element);
+}
 
 __code putQueue1(struct Context* context, struct Allocate* allocate) {
     allocate->size = sizeof(struct Element);
@@ -292,6 +304,8 @@
         worker_context->next = GetQueue;
         worker_context->data[Tree] = context->data[Tree];
         worker_context->data[ActiveQueue] = context->data[ActiveQueue];
+        worker_context->data[WaitQueue] = context->data[WaitQueue];
+        worker_context->data[Queue] = context->data[ActiveQueue];
         pthread_create(&worker_context->thread, NULL, (void*)&start_code, worker_context);
         worker_context->thread_num = i;
         loopCounter->i++;
--- a/src/parallel_execution/worker.c	Thu Jul 14 20:29:06 2016 +0900
+++ b/src/parallel_execution/worker.c	Tue Jul 19 18:42:52 2016 +0900
@@ -3,30 +3,37 @@
 #include "context.h"
 #include "origin_cs.h"
 
-__code getQueue(struct Context* context, struct Queue* queue, struct Node* node) {
+__code getQueue(struct Context* context, struct Queue* queue, struct Element* element) {
     if (queue->first == 0)
         return;
 
-    struct Element* first = queue->first;
+    element = queue->first;
     if (__sync_bool_compare_and_swap(&queue->first, first, first->next)) {
         queue->count--;
-
-        context->next = GetQueue;
-        stack_push(context->code_stack, &context->next);
-
-        context->next = ((struct Task *)(first->data))->code;
-        node->key = ((struct Task *)(first->data))->key;
-
-        struct Traverse *t = &context->data[Traverse]->traverse;
-        t->next = GetQueue;
-        goto meta(context, Get);
+        goto meta(context, context->next)
     } else {
         goto meta(context, GetQueue);
     }
 }
 
 __code getQueue_stub(struct Context* context) {
-    goto getQueue(context, &context->data[ActiveQueue]->queue, &context->data[Node]->node);
+    goto getQueue(context, &context->data[Queue]->queue, &context->data[Element]->element);
+}
+
+__code getQueue2(struct Context* context, struct Element* element, struct Node* node) {
+    context->next = GetQueue;
+    stack_push(context->code_stack, &context->next);
+
+    context->next = ((struct Task *)(element->data))->code;
+    node->key = ((struct Task *)(element->data))->key;
+
+    struct Traverse *t = &context->data[Traverse]->traverse;
+    t->next = GetQueue;
+    goto meta(context, Get);
+}
+
+__code getQueue2_stub(struct Context* context) {
+    goto getQueue(context, &context->data[Element]->element, &context->data[Node]->node);
 }
 
 #ifdef USE_CUDA