changeset 119:4df53a60e59a

Add dependency function
author Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
date Tue, 19 Jul 2016 18:39:22 +0900
parents c9ab10847fc3
children 4df5bc41561d
files src/parallel_execution/dependency.c src/parallel_execution/main.c src/parallel_execution/worker.c
diffstat 3 files changed, 53 insertions(+), 29 deletions(-) [+]
line wrap: on
line diff
--- a/src/parallel_execution/dependency.c	Tue Jul 19 02:18:31 2016 +0900
+++ b/src/parallel_execution/dependency.c	Tue Jul 19 18:39:22 2016 +0900
@@ -7,29 +7,18 @@
     goto (context->code[next])(context);
 }
 
-__code waitFor1(struct Context* context, struct Task* master, struct Task* slave, struct Element* element, struct Node* node) {
+__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);
@@ -55,6 +44,32 @@
             &context->data[WaitQueue]->queue);
 }
 
+__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) {
+}
+
+/*
+ * ready input data Gear for waitme task
+ */
+__code check_task_finish2(struct Context* context) {
+    struct Task task = ((struct Task) element -> data);
+    task->idsCount--;
+}
+
+__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;
 }
--- a/src/parallel_execution/main.c	Tue Jul 19 02:18:31 2016 +0900
+++ b/src/parallel_execution/main.c	Tue Jul 19 18:39:22 2016 +0900
@@ -304,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	Tue Jul 19 02:18:31 2016 +0900
+++ b/src/parallel_execution/worker.c	Tue Jul 19 18:39:22 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