# HG changeset patch # User Tatsuki IHA # Date 1462186929 -32400 # Node ID 059b26a250cc530344f770d940aa5fa21fc4c33d # Parent 67f68f9c04b67288fe99bb3b89defe2de80e41a5 Change put_queue process diff -r 67f68f9c04b6 -r 059b26a250cc src/parallel_execution/context.c --- a/src/parallel_execution/context.c Mon Apr 11 01:45:22 2016 +0900 +++ b/src/parallel_execution/context.c Mon May 02 20:02:09 2016 +0900 @@ -153,7 +153,12 @@ activeQueue->last = 0; activeQueue->count = 0; - context->dataNum = ActiveQueue; + struct Queue* waitQueue = ALLOC_DATA_TYPE(context, WaitQueue, Queue); + waitQueue->first = 0; + waitQueue->last = 0; + waitQueue->count = 0; + + context->dataNum = Queue; context->node_stack = stack_init(sizeof(struct Node*), 100); context->code_stack = stack_init(sizeof(enum Code), 100); diff -r 67f68f9c04b6 -r 059b26a250cc src/parallel_execution/context.h --- a/src/parallel_execution/context.h Mon Apr 11 01:45:22 2016 +0900 +++ b/src/parallel_execution/context.h Mon May 02 20:02:09 2016 +0900 @@ -87,6 +87,8 @@ Time, Element, ActiveQueue, + WaitQueue, + Queue, }; struct Context { @@ -128,8 +130,8 @@ struct Task { enum Code code; int key; - struct Queue* wait_me; - struct Queue* wait_i; + struct Queue* waitMe; + struct Queue* waitI; } task; struct Queue { struct Element* first; diff -r 67f68f9c04b6 -r 059b26a250cc src/parallel_execution/main.c --- a/src/parallel_execution/main.c Mon Apr 11 01:45:22 2016 +0900 +++ b/src/parallel_execution/main.c Mon May 02 20:02:09 2016 +0900 @@ -119,25 +119,31 @@ goto createTask1(context, &context->data[Allocate]->allocate); } -__code createTask2(struct Context* context, struct LoopCounter* loopCounter, struct Task* task, struct Element* element) { +__code meta_createTask2(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) { int i = loopCounter->i; - + task->code = Twice; task->key = i; - + element->task = task; context->next = CreateData1; loopCounter->i++; - - goto meta(context, PutQueue1); + + goto meta_createTask2(context, activeQueue, PutQueue1); } __code createTask2_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[Element]->element, + &context->data[ActiveQueue]->queue); } __code putQueue1(struct Context* context, struct Allocate* allocate) { @@ -162,9 +168,9 @@ __code putQueue2_stub(struct Context* context) { goto putQueue2(context, - &context->data[context->dataNum]->element, - &context->data[Element]->element, - &context->data[ActiveQueue]->queue); + &context->data[context->dataNum]->element, + &context->data[Element]->element, + &context->data[Queue]->queue); } __code putQueue3(struct Context* context, struct Queue* queue, struct Element* new_element) { @@ -173,7 +179,7 @@ if (__sync_bool_compare_and_swap(&queue->last, last, new_element)) { last->next = new_element; queue->count++; - + goto meta(context, context->next); } else { goto meta(context, PutQueue3); @@ -181,14 +187,14 @@ } __code putQueue3_stub(struct Context* context) { - goto putQueue3(context, &context->data[ActiveQueue]->queue, &context->data[context->dataNum]->element); + goto putQueue3(context, &context->data[Queue]->queue, &context->data[context->dataNum]->element); } __code putQueue4(struct Context* context, struct Queue* queue, struct Element* new_element) { if (__sync_bool_compare_and_swap(&queue->first, 0, new_element)) { queue->last = new_element; queue->count++; - + goto meta(context, context->next); } else { goto meta(context, PutQueue3); @@ -196,7 +202,7 @@ } __code putQueue4_stub(struct Context* context) { - goto putQueue4(context, &context->data[ActiveQueue]->queue, &context->data[context->dataNum]->element); + goto putQueue4(context, &context->data[Queue]->queue, &context->data[context->dataNum]->element); } __code createWorker(struct Context* context, struct LoopCounter* loopCounter, struct Worker* worker) { @@ -217,7 +223,7 @@ loopCounter->i = 0; goto meta(context, TaskManager); } - + __code createWorker_stub(struct Context* context) { goto createWorker(context, &context->data[LoopCounter]->loopCounter, &context->data[Worker]->worker); } @@ -238,7 +244,7 @@ t->next = Code2; goto meta(context, EndTime); } - + __code taskManager_stub(struct Context* context) { goto taskManager(context, &context->data[LoopCounter]->loopCounter, &context->data[Worker]->worker); } @@ -253,7 +259,7 @@ split = (int)atoi(argv[i+1]); } } - + int main(int argc, char** argv) { init(argc, argv); @@ -268,13 +274,13 @@ main_context->next = CreateData1; struct Context* worker_contexts = NEWN(cpu_num, struct Context); - + struct Worker* worker = &main_context->data[Worker]->worker; worker->num = cpu_num; worker->contexts = worker_contexts; - + for (int i = 0;idata[Node]->node.value->array.prefix, context->data[Node]->node.value->array.array); } - diff -r 67f68f9c04b6 -r 059b26a250cc src/parallel_execution/worker.c --- a/src/parallel_execution/worker.c Mon Apr 11 01:45:22 2016 +0900 +++ b/src/parallel_execution/worker.c Mon May 02 20:02:09 2016 +0900 @@ -8,18 +8,17 @@ return; struct Element* first = queue->first; -// if (__sync_bool_compare_and_swap(&queue->first, first, first->next)) { - if (OSAtomicCompareAndSwapPtr(first, first->next, (void*)&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 = first->task->code; node->key = first->task->key; - struct Traverse *t = &context->data[Traverse]->traverse; - t->next = GetQueue; + struct Traverse *t = &context->data[Traverse]->traverse; + t->next = GetQueue; goto meta(context, Get); } else { goto meta(context, GetQueue);