Mercurial > hg > Members > innparusu > Gears
comparison src/parallel_execution/dependency.c @ 138:337fdbffa693 default tip
Merge
author | Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp> |
---|---|
date | Sat, 01 Oct 2016 00:23:35 +0900 |
parents | 77e60b6cdace |
children |
comparison
equal
deleted
inserted
replaced
137:fe1fbfec7d01 | 138:337fdbffa693 |
---|---|
1 #include <stdio.h> | 1 #include <stdio.h> |
2 #include "context.h" | 2 #include "context.h" |
3 #include "origin_cs.h" | 3 #include "origin_cs.h" |
4 | 4 |
5 __code meta_waitFor(struct Context* context, struct Queue* queue, enum Code next) { | 5 __code meta_waitFor(struct Context* context, struct Queue* queue, enum Code next) { |
6 context->data[Queue] = (union Data *)queue; | 6 context->data[Queue] = (union Data*)queue; |
7 goto (context->code[next])(context); | 7 goto (context->code[next])(context); |
8 } | 8 } |
9 | 9 |
10 __code waitFor1(struct Context* context, struct Task* master, struct Task* slave, struct Element* element) { | 10 __code waitFor(struct Context* context, struct Task* slave, struct Element* element, union Data* data) { |
11 struct Integer* integer = (struct Integer *)data; | |
12 struct Queue* waitMeTasks = (struct Queue *)(integer + integer-> mDataOffset / sizeof(struct Integer)); | |
11 element->data = (union Data *)slave; | 13 element->data = (union Data *)slave; |
12 // enqueue waitMe | 14 goto meta_waitFor(context, waitMeTasks, PutQueue1); |
13 goto meta_waitFor(context, master->waitMe, PutQueue1); | |
14 } | 15 } |
15 | 16 |
16 __code waitFor1_stub(struct Context* context) { | 17 __code waitFor_stub(struct Context* context) { |
17 // next think | 18 goto waitFor(context, |
19 &context->data[context->dataNum-2]->task, | |
20 &context->data[Element]->element, | |
21 context->data[Node]->node.value); | |
18 } | 22 } |
19 | |
20 //__code waitFor2(struct Context* context, struct Task* master, struct Task* slave, struct Element* element) { | |
21 // element->task = master; | |
22 // task->next = context->next; | |
23 // // enqueue waitI | |
24 // goto meta_waitFor(context, task->waitI, PutQueue1); | |
25 //} | |
26 // | |
27 //__code waitFor2_stub(struct Context* context) { | |
28 // // next think | |
29 //} | |
30 | 23 |
31 __code meta_spawnTask(struct Context* context, struct Queue* queue, enum Code next) { | 24 __code meta_spawnTask(struct Context* context, struct Queue* queue, enum Code next) { |
32 context->data[Queue] = (union Data *)queue; | 25 context->data[Queue] = (union Data *)queue; |
33 goto (context->code[next])(context); | 26 goto (context->code[next])(context); |
34 } | 27 } |
35 | 28 |
36 __code spawnTask(struct Context* context, struct Task* task, struct Element* element, struct Queue* activeQueue, struct Queue* waitQueue) { | 29 __code spawnTask(struct Context* context, struct Task* task, struct Queue* activeQueue, struct Queue* waitQueue) { |
37 //printf("spawn Task\n"); | 30 if (task->idsCount == 0) { |
38 element->data = (union Data *)task; | |
39 if (task->waitI->count == task->idsCount) { | |
40 //printf("put ActiveQueue\n"); | 31 //printf("put ActiveQueue\n"); |
41 // enqueue activeQueue | 32 // enqueue activeQueue |
42 goto meta_spawnTask(context, activeQueue, PutQueue1); | 33 goto meta_spawnTask(context, activeQueue, PutQueue1); |
43 } else { | 34 } else { |
44 //printf("put WaitQueue\n"); | 35 //printf("put WaitQueue\n"); |
47 } | 38 } |
48 } | 39 } |
49 | 40 |
50 __code spawnTask_stub(struct Context* context) { | 41 __code spawnTask_stub(struct Context* context) { |
51 goto spawnTask(context, | 42 goto spawnTask(context, |
52 &context->data[context->dataNum-2]->task, | 43 (struct Task *)(context->data[Element]->element.data), |
53 &context->data[Element]->element, | |
54 &context->data[ActiveQueue]->queue, | 44 &context->data[ActiveQueue]->queue, |
55 &context->data[WaitQueue]->queue); | 45 &context->data[WaitQueue]->queue); |
56 } | 46 } |
57 | 47 |
58 __code taskA(struct Context* context) { | 48 __code meta_checkTaskFinish1(struct Context* context, struct Queue* queue, enum Code next) { |
59 printf("TaskA\n"); | 49 context->data[Queue] = (union Data *)queue; |
50 goto (context->code[next])(context); | |
51 } | |
52 | |
53 __code checkTaskFinish1(struct Context* context, union Data* data) { | |
54 struct Integer* integer = (struct Integer *)data; | |
55 struct Queue* waitMeTasks = (struct Queue *)(integer + integer->mDataOffset / sizeof(struct Integer)); | |
56 context->next = CheckTaskFinish2; | |
57 waitMeTasks->emptyNext = GetTask; | |
58 goto meta_checkTaskFinish1(context, waitMeTasks, GetQueue1); | |
59 } | |
60 | |
61 __code checkTaskFinish1_stub(struct Context* context) { | |
62 goto checkTaskFinish1(context, | |
63 ((struct Task*)(context->data[Element]->element.data))->oargs[0]); | |
64 } | |
65 | |
66 /* | |
67 * ready input data Gear for waitme task | |
68 */ | |
69 __code checkTaskFinish2(struct Context* context, struct Task* task) { | |
70 // using cas? | |
71 if (__sync_fetch_and_sub(&task->idsCount, 1)) { | |
72 goto meta(context, GetQueue1); | |
73 } else { | |
74 goto meta(context, CheckTaskFinish2); | |
75 } | |
76 } | |
77 | |
78 __code checkTaskFinish2_stub(struct Context* context) { | |
79 goto checkTaskFinish2(context, | |
80 (struct Task*)(context->data[Element]->element.data)); | |
81 } | |
82 | |
83 __code add(struct Context* context, struct Integer* input1, struct Integer* input2, struct Integer* output) { | |
84 output->value = input1->value + input2->value; | |
85 printf("%d + %d = %d\n", input1->value, input2->value, output->value); | |
60 goto meta(context, context->next); | 86 goto meta(context, context->next); |
61 } | 87 } |
62 | 88 |
63 __code taskB(struct Context* context) { | 89 __code add_stub(struct Context* context) { |
64 printf("TaskB\n"); | 90 goto add(context, |
91 (struct Integer*)((struct Task*)(context->data[Element]->element.data))->iargs[0], | |
92 (struct Integer*)((struct Task*)(context->data[Element]->element.data))->iargs[1], | |
93 (struct Integer*)((struct Task*)(context->data[Element]->element.data))->oargs[0]); | |
94 } | |
95 | |
96 __code mult(struct Context* context, struct Integer* input1, struct Integer* input2, struct Integer* output) { | |
97 output->value = input1->value * input2->value; | |
98 printf("%d * %d = %d\n", input1->value, input2->value, output->value); | |
65 goto meta(context, context->next); | 99 goto meta(context, context->next); |
66 } | 100 } |
67 | 101 |
68 __code taskC(struct Context* context) { | 102 __code mult_stub(struct Context* context) { |
69 printf("TaskC\n"); | 103 goto mult(context, |
70 goto meta(context, context->next); | 104 (struct Integer*)((struct Task*)(context->data[Element]->element.data))->iargs[0], |
105 (struct Integer*)((struct Task*)(context->data[Element]->element.data))->iargs[1], | |
106 (struct Integer*)((struct Task*)(context->data[Element]->element.data))->oargs[0]); | |
71 } | 107 } |