Mercurial > hg > Members > innparusu > Gears
annotate src/parallel_execution/worker.c @ 125:77e60b6cdace
Work dependency example
author | Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp> |
---|---|
date | Tue, 27 Sep 2016 17:22:00 +0900 |
parents | 4ff6f093b695 |
children |
rev | line source |
---|---|
95
3e28ee215c0e
modify twice, use OSAtomiceCompareAndSwap
Shohei KOKUBO <e105744@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1 #include <libkern/OSAtomic.h> |
3e28ee215c0e
modify twice, use OSAtomiceCompareAndSwap
Shohei KOKUBO <e105744@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
2 |
3e28ee215c0e
modify twice, use OSAtomiceCompareAndSwap
Shohei KOKUBO <e105744@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
3 #include "context.h" |
3e28ee215c0e
modify twice, use OSAtomiceCompareAndSwap
Shohei KOKUBO <e105744@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
4 #include "origin_cs.h" |
3e28ee215c0e
modify twice, use OSAtomiceCompareAndSwap
Shohei KOKUBO <e105744@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
5 |
125
77e60b6cdace
Work dependency example
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents:
123
diff
changeset
|
6 __code meta_getTask(struct Context* context, struct Queue* queue, enum Code next) { |
77e60b6cdace
Work dependency example
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents:
123
diff
changeset
|
7 context->data[Queue] = (union Data *)queue; |
77e60b6cdace
Work dependency example
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents:
123
diff
changeset
|
8 goto (context->code[next])(context); |
122
a086857e1812
implement dependency example. do not work
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents:
121
diff
changeset
|
9 } |
a086857e1812
implement dependency example. do not work
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents:
121
diff
changeset
|
10 |
125
77e60b6cdace
Work dependency example
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents:
123
diff
changeset
|
11 __code getTask(struct Context* context, struct Queue* activeQueue) { |
77e60b6cdace
Work dependency example
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents:
123
diff
changeset
|
12 context->next = GetInputData1; |
77e60b6cdace
Work dependency example
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents:
123
diff
changeset
|
13 activeQueue->emptyNext = GetTask; |
77e60b6cdace
Work dependency example
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents:
123
diff
changeset
|
14 goto meta_getTask(context, activeQueue, GetQueue1); |
77e60b6cdace
Work dependency example
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents:
123
diff
changeset
|
15 } |
77e60b6cdace
Work dependency example
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents:
123
diff
changeset
|
16 |
77e60b6cdace
Work dependency example
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents:
123
diff
changeset
|
17 __code getTask_stub(struct Context* context) { |
77e60b6cdace
Work dependency example
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents:
123
diff
changeset
|
18 goto getTask(context, &context->data[ActiveQueue]->queue); |
122
a086857e1812
implement dependency example. do not work
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents:
121
diff
changeset
|
19 } |
a086857e1812
implement dependency example. do not work
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents:
121
diff
changeset
|
20 |
121 | 21 __code getQueue1(struct Context* context, struct Queue* queue, struct Element* element) { |
95
3e28ee215c0e
modify twice, use OSAtomiceCompareAndSwap
Shohei KOKUBO <e105744@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
22 if (queue->first == 0) |
125
77e60b6cdace
Work dependency example
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents:
123
diff
changeset
|
23 goto meta(context, queue->emptyNext); |
95
3e28ee215c0e
modify twice, use OSAtomiceCompareAndSwap
Shohei KOKUBO <e105744@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
24 |
123
4ff6f093b695
Fix segmentation fault
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents:
122
diff
changeset
|
25 element->data = queue->first->data; |
125
77e60b6cdace
Work dependency example
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents:
123
diff
changeset
|
26 if (__sync_bool_compare_and_swap(&queue->first, queue->first, queue->next)) { |
95
3e28ee215c0e
modify twice, use OSAtomiceCompareAndSwap
Shohei KOKUBO <e105744@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
27 queue->count--; |
122
a086857e1812
implement dependency example. do not work
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents:
121
diff
changeset
|
28 goto meta(context, context->next); |
95
3e28ee215c0e
modify twice, use OSAtomiceCompareAndSwap
Shohei KOKUBO <e105744@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
29 } else { |
122
a086857e1812
implement dependency example. do not work
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents:
121
diff
changeset
|
30 goto meta(context, GetQueue1); |
95
3e28ee215c0e
modify twice, use OSAtomiceCompareAndSwap
Shohei KOKUBO <e105744@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
31 } |
3e28ee215c0e
modify twice, use OSAtomiceCompareAndSwap
Shohei KOKUBO <e105744@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
32 } |
3e28ee215c0e
modify twice, use OSAtomiceCompareAndSwap
Shohei KOKUBO <e105744@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
33 |
121 | 34 __code getQueue1_stub(struct Context* context) { |
122
a086857e1812
implement dependency example. do not work
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents:
121
diff
changeset
|
35 goto getQueue1(context, &context->data[Queue]->queue, &context->data[Element]->element); |
a086857e1812
implement dependency example. do not work
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents:
121
diff
changeset
|
36 } |
a086857e1812
implement dependency example. do not work
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents:
121
diff
changeset
|
37 |
a086857e1812
implement dependency example. do not work
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents:
121
diff
changeset
|
38 __code getInputData1(struct Context* context, struct Task* task, struct Node* node, struct LoopCounter* loopCounter) { |
a086857e1812
implement dependency example. do not work
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents:
121
diff
changeset
|
39 int i = loopCounter->i; |
123
4ff6f093b695
Fix segmentation fault
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents:
122
diff
changeset
|
40 if(i < sizeof(task->iKeys) / sizeof(int)) { |
122
a086857e1812
implement dependency example. do not work
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents:
121
diff
changeset
|
41 context->next = GetInputData2; |
a086857e1812
implement dependency example. do not work
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents:
121
diff
changeset
|
42 node->key = task->iKeys[i]; |
a086857e1812
implement dependency example. do not work
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents:
121
diff
changeset
|
43 struct Traverse *t = &context->data[Traverse]->traverse; |
a086857e1812
implement dependency example. do not work
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents:
121
diff
changeset
|
44 t->next = GetQueue1; |
a086857e1812
implement dependency example. do not work
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents:
121
diff
changeset
|
45 goto meta(context, Get); |
a086857e1812
implement dependency example. do not work
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents:
121
diff
changeset
|
46 } |
a086857e1812
implement dependency example. do not work
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents:
121
diff
changeset
|
47 loopCounter->i = 0; |
a086857e1812
implement dependency example. do not work
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents:
121
diff
changeset
|
48 goto meta(context, GetOutputData1); |
a086857e1812
implement dependency example. do not work
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents:
121
diff
changeset
|
49 } |
a086857e1812
implement dependency example. do not work
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents:
121
diff
changeset
|
50 |
a086857e1812
implement dependency example. do not work
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents:
121
diff
changeset
|
51 __code getInputData1_stub(struct Context* context) { |
a086857e1812
implement dependency example. do not work
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents:
121
diff
changeset
|
52 goto getInputData1(context, |
a086857e1812
implement dependency example. do not work
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents:
121
diff
changeset
|
53 (struct Task*)(context->data[Element]->element.data), |
a086857e1812
implement dependency example. do not work
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents:
121
diff
changeset
|
54 &context->data[Node]->node, |
a086857e1812
implement dependency example. do not work
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents:
121
diff
changeset
|
55 &context->data[LoopCounter]->loopCounter); |
a086857e1812
implement dependency example. do not work
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents:
121
diff
changeset
|
56 } |
a086857e1812
implement dependency example. do not work
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents:
121
diff
changeset
|
57 |
a086857e1812
implement dependency example. do not work
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents:
121
diff
changeset
|
58 __code getInputData2(struct Context* context, struct Task* task, union Data* data, struct LoopCounter* loopCounter) { |
a086857e1812
implement dependency example. do not work
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents:
121
diff
changeset
|
59 int i = loopCounter->i; |
a086857e1812
implement dependency example. do not work
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents:
121
diff
changeset
|
60 task->iargs[i] = data; |
a086857e1812
implement dependency example. do not work
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents:
121
diff
changeset
|
61 loopCounter->i++; |
a086857e1812
implement dependency example. do not work
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents:
121
diff
changeset
|
62 goto meta(context, GetInputData1); |
119
4df53a60e59a
Add dependency function
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents:
113
diff
changeset
|
63 } |
4df53a60e59a
Add dependency function
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents:
113
diff
changeset
|
64 |
122
a086857e1812
implement dependency example. do not work
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents:
121
diff
changeset
|
65 __code getInputData2_stub(struct Context* context) { |
a086857e1812
implement dependency example. do not work
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents:
121
diff
changeset
|
66 goto getInputData2(context, |
a086857e1812
implement dependency example. do not work
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents:
121
diff
changeset
|
67 (struct Task*)(context->data[Element]->element.data), |
a086857e1812
implement dependency example. do not work
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents:
121
diff
changeset
|
68 context->data[Node]->node.value, |
a086857e1812
implement dependency example. do not work
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents:
121
diff
changeset
|
69 &context->data[LoopCounter]->loopCounter); |
119
4df53a60e59a
Add dependency function
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents:
113
diff
changeset
|
70 } |
4df53a60e59a
Add dependency function
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents:
113
diff
changeset
|
71 |
122
a086857e1812
implement dependency example. do not work
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents:
121
diff
changeset
|
72 __code getOutputData1(struct Context* context, struct Task* task, struct Node* node, struct LoopCounter* loopCounter) { |
a086857e1812
implement dependency example. do not work
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents:
121
diff
changeset
|
73 int i = loopCounter->i; |
a086857e1812
implement dependency example. do not work
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents:
121
diff
changeset
|
74 if(i < sizeof(task->oKeys)/ sizeof(int)) { |
a086857e1812
implement dependency example. do not work
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents:
121
diff
changeset
|
75 context->next = GetOutputData2; |
a086857e1812
implement dependency example. do not work
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents:
121
diff
changeset
|
76 node->key = task->oKeys[i]; |
a086857e1812
implement dependency example. do not work
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents:
121
diff
changeset
|
77 struct Traverse *t = &context->data[Traverse]->traverse; |
a086857e1812
implement dependency example. do not work
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents:
121
diff
changeset
|
78 t->next = GetQueue1; |
a086857e1812
implement dependency example. do not work
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents:
121
diff
changeset
|
79 goto meta(context, Get); |
a086857e1812
implement dependency example. do not work
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents:
121
diff
changeset
|
80 } |
a086857e1812
implement dependency example. do not work
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents:
121
diff
changeset
|
81 context->next = CheckTaskFinish1; |
a086857e1812
implement dependency example. do not work
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents:
121
diff
changeset
|
82 loopCounter->i = 0; |
a086857e1812
implement dependency example. do not work
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents:
121
diff
changeset
|
83 goto meta(context, task->code); |
a086857e1812
implement dependency example. do not work
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents:
121
diff
changeset
|
84 } |
a086857e1812
implement dependency example. do not work
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents:
121
diff
changeset
|
85 |
a086857e1812
implement dependency example. do not work
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents:
121
diff
changeset
|
86 __code getOutputData1_stub(struct Context* context) { |
a086857e1812
implement dependency example. do not work
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents:
121
diff
changeset
|
87 goto getOutputData1(context, |
a086857e1812
implement dependency example. do not work
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents:
121
diff
changeset
|
88 (struct Task*)(context->data[Element]->element.data), |
a086857e1812
implement dependency example. do not work
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents:
121
diff
changeset
|
89 &context->data[Node]->node, |
a086857e1812
implement dependency example. do not work
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents:
121
diff
changeset
|
90 &context->data[LoopCounter]->loopCounter); |
a086857e1812
implement dependency example. do not work
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents:
121
diff
changeset
|
91 } |
a086857e1812
implement dependency example. do not work
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents:
121
diff
changeset
|
92 |
a086857e1812
implement dependency example. do not work
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents:
121
diff
changeset
|
93 __code getOutputData2(struct Context* context, struct Task* task, union Data* data, struct LoopCounter* loopCounter) { |
a086857e1812
implement dependency example. do not work
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents:
121
diff
changeset
|
94 int i = loopCounter->i; |
a086857e1812
implement dependency example. do not work
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents:
121
diff
changeset
|
95 task->oargs[i] = data; |
a086857e1812
implement dependency example. do not work
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents:
121
diff
changeset
|
96 loopCounter->i++; |
a086857e1812
implement dependency example. do not work
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents:
121
diff
changeset
|
97 goto meta(context, GetOutputData1); |
a086857e1812
implement dependency example. do not work
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents:
121
diff
changeset
|
98 } |
a086857e1812
implement dependency example. do not work
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents:
121
diff
changeset
|
99 |
a086857e1812
implement dependency example. do not work
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents:
121
diff
changeset
|
100 __code getOutputData2_stub(struct Context* context) { |
a086857e1812
implement dependency example. do not work
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents:
121
diff
changeset
|
101 goto getOutputData2(context, |
a086857e1812
implement dependency example. do not work
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents:
121
diff
changeset
|
102 (struct Task*)(context->data[Element]->element.data), |
a086857e1812
implement dependency example. do not work
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents:
121
diff
changeset
|
103 context->data[Node]->node.value, |
a086857e1812
implement dependency example. do not work
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents:
121
diff
changeset
|
104 &context->data[LoopCounter]->loopCounter); |
95
3e28ee215c0e
modify twice, use OSAtomiceCompareAndSwap
Shohei KOKUBO <e105744@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
105 } |
101 | 106 |
107 #ifdef USE_CUDA | |
98 | 108 __code twiceGpu(struct Context* context) { |
109 cuMemcpyHtoDAsync(context,context,context,context->stream); | |
110 cuLaunchkanel(); | |
111 cuMemcpyDtoHAsync(); | |
112 } | |
101 | 113 #endif |