# HG changeset patch # User Tatsuki IHA # Date 1468921162 -32400 # Node ID 4df53a60e59a9f2d47aa6f3b78b79209d482cf8b # Parent c9ab10847fc3db7038fd672685488e867bead840 Add dependency function diff -r c9ab10847fc3 -r 4df53a60e59a src/parallel_execution/dependency.c --- 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; } diff -r c9ab10847fc3 -r 4df53a60e59a src/parallel_execution/main.c --- 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++; diff -r c9ab10847fc3 -r 4df53a60e59a src/parallel_execution/worker.c --- 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