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 }