changeset 125:77e60b6cdace

Work dependency example
author Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
date Tue, 27 Sep 2016 17:22:00 +0900
parents acf0453b1c7a
children 337fdbffa693
files src/parallel_execution/context.c src/parallel_execution/context.h src/parallel_execution/dependency.c src/parallel_execution/main.c src/parallel_execution/worker.c
diffstat 5 files changed, 20 insertions(+), 12 deletions(-) [+]
line wrap: on
line diff
--- a/src/parallel_execution/context.c	Tue Sep 27 16:19:31 2016 +0900
+++ b/src/parallel_execution/context.c	Tue Sep 27 17:22:00 2016 +0900
@@ -61,7 +61,7 @@
 extern __code putQueue2_stub(struct Context*);
 extern __code putQueue3_stub(struct Context*);
 extern __code putQueue4_stub(struct Context*);
-extern __code initWorker_stub(struct Context*);
+extern __code getTask_stub(struct Context*);
 extern __code getQueue1_stub(struct Context*);
 extern __code getInputData1_stub(struct Context*);
 extern __code getInputData2_stub(struct Context*);
@@ -141,7 +141,7 @@
     context->code[PutQueue2]     = putQueue2_stub;
     context->code[PutQueue3]     = putQueue3_stub;
     context->code[PutQueue4]     = putQueue4_stub;
-    context->code[InitWorker]    = initWorker_stub;
+    context->code[GetTask]       = getTask_stub;
     context->code[GetQueue1]     = getQueue1_stub;
     context->code[GetInputData1] = getInputData1_stub;
     context->code[GetInputData2] = getInputData2_stub;
--- a/src/parallel_execution/context.h	Tue Sep 27 16:19:31 2016 +0900
+++ b/src/parallel_execution/context.h	Tue Sep 27 17:22:00 2016 +0900
@@ -70,7 +70,7 @@
     PutQueue2,
     PutQueue3,
     PutQueue4,
-    InitWorker,
+    GetTask,
     GetQueue1,
     GetInputData1,
     GetInputData2,
@@ -158,6 +158,8 @@
         struct Element* first;
         struct Element* last;
         int count;
+        enum Code next;
+        enum Code emptyNext;
     } queue;
     struct Element {
         union Data* data;
--- a/src/parallel_execution/dependency.c	Tue Sep 27 16:19:31 2016 +0900
+++ b/src/parallel_execution/dependency.c	Tue Sep 27 17:22:00 2016 +0900
@@ -54,6 +54,7 @@
     struct Integer* integer = (struct Integer *)data;
     struct Queue* waitMeTasks = (struct Queue *)(integer + integer->mDataOffset / sizeof(struct Integer));
     context->next = CheckTaskFinish2;
+    waitMeTasks->emptyNext = GetTask;
     goto meta_checkTaskFinish1(context, waitMeTasks, GetQueue1);
 }
 
@@ -67,7 +68,6 @@
  */
 __code checkTaskFinish2(struct Context* context, struct Task* task) {
     // using cas?
-    //
     if (__sync_fetch_and_sub(&task->idsCount, 1)) {
         goto meta(context, GetQueue1);
     } else {
--- a/src/parallel_execution/main.c	Tue Sep 27 16:19:31 2016 +0900
+++ b/src/parallel_execution/main.c	Tue Sep 27 17:22:00 2016 +0900
@@ -328,7 +328,7 @@
 
     if (i < worker->num) {
         struct Context* worker_context = &worker->contexts[i];
-        worker_context->next = InitWorker;
+        worker_context->next = GetTask;
         worker_context->data[Tree] = context->data[Tree];
         worker_context->data[ActiveQueue] = context->data[ActiveQueue];
         worker_context->data[WaitQueue] = context->data[WaitQueue];
--- a/src/parallel_execution/worker.c	Tue Sep 27 16:19:31 2016 +0900
+++ b/src/parallel_execution/worker.c	Tue Sep 27 17:22:00 2016 +0900
@@ -3,21 +3,27 @@
 #include "context.h"
 #include "origin_cs.h"
 
-__code initWorker(struct Context* context) {
-    context->next = GetInputData1;
-    goto meta(context, GetQueue1);
+__code meta_getTask(struct Context* context, struct Queue* queue, enum Code next) {
+    context->data[Queue] = (union Data *)queue;
+    goto (context->code[next])(context);
 }
 
-__code initWorker_stub(struct Context* context) {
-    goto initWorker(context);
+__code getTask(struct Context* context, struct Queue* activeQueue) {
+    context->next = GetInputData1;
+    activeQueue->emptyNext = GetTask;
+    goto meta_getTask(context, activeQueue, GetQueue1);
+}
+
+__code getTask_stub(struct Context* context) {
+    goto getTask(context, &context->data[ActiveQueue]->queue);
 }
 
 __code getQueue1(struct Context* context, struct Queue* queue, struct Element* element) {
     if (queue->first == 0)
-        return;
+        goto meta(context, queue->emptyNext);
 
     element->data = queue->first->data;
-    if (__sync_bool_compare_and_swap(&queue->first, queue->first, queue->first->next)) {
+    if (__sync_bool_compare_and_swap(&queue->first, queue->first, queue->next)) {
         queue->count--;
         goto meta(context, context->next);
     } else {