changeset 112:e3cba827d489

Add spawnTask CS
author Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
date Tue, 03 May 2016 17:29:21 +0900
parents 556e203de999
children d05b9937aa95 f57e9ffa7960
files src/parallel_execution/CMakeLists.txt src/parallel_execution/context.c src/parallel_execution/context.h src/parallel_execution/dependency.c src/parallel_execution/main.c
diffstat 5 files changed, 122 insertions(+), 49 deletions(-) [+]
line wrap: on
line diff
--- a/src/parallel_execution/CMakeLists.txt	Mon May 02 20:39:02 2016 +0900
+++ b/src/parallel_execution/CMakeLists.txt	Tue May 03 17:29:21 2016 +0900
@@ -14,6 +14,7 @@
                allocate.c
                compare.c
                worker.c
+               dependency.c
                time.c
                twice.c
 )
--- a/src/parallel_execution/context.c	Mon May 02 20:39:02 2016 +0900
+++ b/src/parallel_execution/context.c	Tue May 03 17:29:21 2016 +0900
@@ -49,11 +49,14 @@
 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 putQueue1_stub(struct Context*);
 extern __code putQueue2_stub(struct Context*);
 extern __code putQueue3_stub(struct Context*);
 extern __code putQueue4_stub(struct Context*);
 extern __code getQueue_stub(struct Context*);
+extern __code spawnTask_stub(struct Context*);
 extern __code twice_stub(struct Context*);
 extern __code start_time_stub(struct Context*);
 extern __code end_time_stub(struct Context*);
@@ -76,11 +79,11 @@
     /* context->code[Find]       = find; */
     /* context->code[Not_find]   = not_find; */
     /* context->code[Code6]      = code6; */
-    context->code[PutTree]        = put_stub;
-    context->code[Replace]    = replaceNode_stub;
-    context->code[Insert]     = insertNode_stub;
-    context->code[RotateL]    = rotateLeft_stub;
-    context->code[RotateR]    = rotateRight_stub;
+    context->code[PutTree]       = put_stub;
+    context->code[Replace]       = replaceNode_stub;
+    context->code[Insert]        = insertNode_stub;
+    context->code[RotateL]       = rotateLeft_stub;
+    context->code[RotateR]       = rotateRight_stub;
     context->code[InsertCase1]   = insert1_stub;
     context->code[InsertCase2]   = insert2_stub;
     context->code[InsertCase3]   = insert3_stub;
@@ -89,7 +92,7 @@
     context->code[InsertCase4_2] = insert4_2_stub;
     context->code[InsertCase5]   = insert5_stub;
     context->code[StackClear]    = stackClear_stub;
-    context->code[Get]        = get_stub;
+    context->code[Get]           = get_stub;
     context->code[Search]        = search_stub;
     /* context->code[Delete]        = delete_stub; */
     /* context->code[Delete1]       = delete1_stub; */
@@ -111,15 +114,18 @@
     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[PutQueue1]     = putQueue1_stub;
     context->code[PutQueue2]     = putQueue2_stub;
     context->code[PutQueue3]     = putQueue3_stub;
     context->code[PutQueue4]     = putQueue4_stub;
     context->code[GetQueue]      = getQueue_stub;
+    context->code[SpawnTask]     = spawnTask_stub;
     context->code[Twice]         = twice_stub;
     context->code[StartTime]     = start_time_stub;
-    context->code[EndTime]     = end_time_stub;
-    context->code[Exit]       = exit_code;
+    context->code[EndTime]       = end_time_stub;
+    context->code[Exit]          = exit_code;
 
     struct Worker* worker = ALLOC_DATA(context, Worker);
     worker->num = 0;
--- a/src/parallel_execution/context.h	Mon May 02 20:39:02 2016 +0900
+++ b/src/parallel_execution/context.h	Tue May 03 17:29:21 2016 +0900
@@ -60,11 +60,14 @@
     CreateData2,
     CreateTask1,
     CreateTask2,
+    CreateTask3,
+    CreateTask4,
     PutQueue1,
     PutQueue2,
     PutQueue3,
     PutQueue4,
     GetQueue,
+    SpawnTask,
     Twice,
     StartTime,
     EndTime,
@@ -131,7 +134,8 @@
         enum Code code;
         int key;
         struct Queue* waitMe;
-        struct Queue* waitI;
+        struct OdsQueue* waitI;
+        int idsCount;
     } task;
     struct Queue {
         struct Element* first;
@@ -172,4 +176,16 @@
         enum Code next;
         long size;
     } allocate;
+    struct OutPutDataSegments {
+        union Data **data;
+    } ods;
+    struct OdsQueue {
+        struct OdsElement* first;
+        struct OdsElement* last;
+        int count;
+    } odsQueue;
+    struct OdsElement {
+        struct OutPutDataSegments* ods;
+        struct OdsElement* next;
+    } odsElement;
 };
--- a/src/parallel_execution/dependency.c	Mon May 02 20:39:02 2016 +0900
+++ b/src/parallel_execution/dependency.c	Tue May 03 17:29:21 2016 +0900
@@ -1,61 +1,73 @@
+#include <stdio.h>
 #include "context.h"
 #include "origin_cs.h"
 
 __code meta_waitFor(struct Context* context, struct Queue* queue, enum Code next) {
-    context->data[Queue] = (Data *)queue;
+    context->data[Queue] = (union Data *)queue;
     goto (context->code[next])(context);
 }
 
 __code waitFor1(struct Context* context, struct Task* master, struct Task* slave, struct Element* element) {
     element->task = slave;
-    task->next = WaitFor2;
     // enqueue waitMe
-    goto meta_waitFor(context, task->waitMe, PutQueue1);
+    goto meta_waitFor(context, master->waitMe, PutQueue1);
 }
 
 __code waitFor1_stub(struct Context* context) {
     // next 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(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 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 Queue* activeQueue, struct Queue* waitQueue) {
-    if (task->wait_i->count == task->wait_task_count) {
+__code spawnTask(struct Context* context, struct Task* task, struct Element* element, struct Queue* activeQueue, struct Queue* waitQueue) {
+    //printf("spawn Task\n");
+    if (task->waitI->count == task->idsCount) {
+        //printf("put ActiveQueue\n");
         element->task = task;
         // enqueue activeQueue
-        goto meta(context, PutQueue1);
+        goto meta_spawnTask(context, activeQueue, PutQueue1);
     }
     else {
+        //printf("put WaitQueue\n");
         element->task = task;
         // enqueue waitQueue
-        goto meta(context, PutQueue1);
+        goto meta_spawnTask(context, waitQueue, PutQueue1);
     }
 }
 
 __code spawnTask_stub(struct Context* context) {
-    // next think
+    goto spawnTask(context,
+            &context->data[context->dataNum-2]->task,
+            &context->data[Element]->element,
+            &context->data[ActiveQueue]->queue,
+            &context->data[WaitQueue]->queue);
 }
 
-__code taskA(struct Context*) {
+__code taskA(struct Context* context) {
     printf("TaskA\n");
     goto meta(context, context->next);
 }
 
-__code taskB(struct Context*) {
+__code taskB(struct Context* context) {
     printf("TaskB\n");
     goto meta(context, context->next);
 }
 
-__code taskC(struct Context*) {
+__code taskC(struct Context* context) {
     printf("TaskC\n");
     goto meta(context, context->next);
 }
--- a/src/parallel_execution/main.c	Mon May 02 20:39:02 2016 +0900
+++ b/src/parallel_execution/main.c	Tue May 03 17:29:21 2016 +0900
@@ -111,7 +111,6 @@
 __code createTask1(struct Context* context, struct Allocate* allocate) {
     allocate->size = sizeof(struct Task);
     allocator(context);
-
     goto meta(context, CreateTask2);
 }
 
@@ -119,72 +118,111 @@
     goto createTask1(context, &context->data[Allocate]->allocate);
 }
 
-__code meta_createTask2(struct Context* context, struct Queue* activeQueue, enum Code next) {
+__code createTask2(struct Context* context, struct Allocate* allocate) {
+    allocate->size = sizeof(struct Queue);
+    allocator(context);
+    goto meta(context, CreateTask3);
+}
+
+__code createTask2_stub(struct Context* context) {
+    goto createTask2(context, &context->data[Allocate]->allocate);
+}
+
+__code createTask3(struct Context* context, struct Allocate* allocate) {
+    allocate->size = sizeof(struct OdsQueue);
+    allocator(context);
+    goto meta(context, CreateTask4);
+}
+
+__code createTask3_stub(struct Context* context) {
+    goto createTask3(context, &context->data[Allocate]->allocate);
+}
+
+__code meta_createTask4(struct Context* context, struct Queue* activeQueue, enum Code next) {
     context->data[Queue] = (union Data *)activeQueue;
     goto (context->code[next])(context);
 }
 
-__code createTask2(struct Context* context, struct LoopCounter* loopCounter, struct Task* task, struct Element* element, struct Queue* activeQueue) {
+__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;
 
+    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;
 
     element->task = task;
 
     context->next = CreateData1;
     loopCounter->i++;
 
-    goto meta_createTask2(context, activeQueue, PutQueue1);
+    goto meta(context, SpawnTask);
 }
 
-__code createTask2_stub(struct Context* context) {
-    goto createTask2(context,
+__code createTask4_stub(struct Context* context) {
+    goto createTask4(context,
             &context->data[LoopCounter]->loopCounter,
-            &context->data[context->dataNum]->task,
+            &context->data[context->dataNum-2]->task,
+            &context->data[context->dataNum-1]->queue,
+            &context->data[context->dataNum]->odsQueue,
             &context->data[Element]->element,
             &context->data[ActiveQueue]->queue);
 }
 
 
-//__code createTask2(struct Context* context, struct LoopCounter* loopCounter, struct Task* task, struct Element* element) {
+//__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->task = task;
 //
 //    context->next = CreateData1;
 //    loopCounter->i++;
 //
-//    goto meta(context, PutQueue1);
+//    goto meta_createTask2(context, activeQueue, PutQueue1);
 //}
 //
-//__code createTask2_stub(struct Context* context) {
+//__code createTask4_stub(struct Context* context) {
 //    goto createTask2(context,
-//                     &context->data[LoopCounter]->loopCounter,
-//                     &context->data[context->dataNum]->task,
-//                     &context->data[Element]->element);
+//            &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 createTask3(struct Context* context, struct LoopCounter* loopCounter, struct Task* task, struct Task* slave, struct Element* element) {
+//__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->task = task;
 //
 //    context->next = CreateData1;
 //    loopCounter->i++;
-//    
+//
 //    goto meta(context, WaitFor1);
 //}
 //
-//__code createTask3_stub(struct Context* context) {
+//__code createTask5_stub(struct Context* context) {
 //    goto createTask2(context,
-//                     &context->data[context->dataNum]->task,
-//                     &context->data[Element]->element);
+//            &context->data[context->dataNum]->task,
+//            &context->data[Element]->element);
 //}
 
 __code putQueue1(struct Context* context, struct Allocate* allocate) {