# HG changeset patch # User Tatsuki IHA # Date 1462264161 -32400 # Node ID e3cba827d4893fdf45af20a9c0cdae29b57ef29f # Parent 556e203de999c18daf5343888df40e2c48e67af6 Add spawnTask CS diff -r 556e203de999 -r e3cba827d489 src/parallel_execution/CMakeLists.txt --- 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 ) diff -r 556e203de999 -r e3cba827d489 src/parallel_execution/context.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; diff -r 556e203de999 -r e3cba827d489 src/parallel_execution/context.h --- 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; }; diff -r 556e203de999 -r e3cba827d489 src/parallel_execution/dependency.c --- 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 #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); } diff -r 556e203de999 -r e3cba827d489 src/parallel_execution/main.c --- 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) {