Mercurial > hg > GearsTemplate
annotate src/parallel_execution/main.c @ 224:578f283efb4a
Add Todo
author | one |
---|---|
date | Fri, 13 Jan 2017 18:16:02 +0900 |
parents | 6c0692c9bfed |
children | 123b0d277b84 |
rev | line source |
---|---|
86 | 1 #include <stdio.h> |
95
3e28ee215c0e
modify twice, use OSAtomiceCompareAndSwap
Shohei KOKUBO <e105744@ie.u-ryukyu.ac.jp>
parents:
92
diff
changeset
|
2 #include <string.h> |
132 | 3 #include <stdlib.h> |
86 | 4 |
5 #include "context.h" | |
6 #include "origin_cs.h" | |
7 | |
8 extern __code initContext(struct Context* context); | |
218
d8a59b727f65
Fix spawnTaskManager
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents:
217
diff
changeset
|
9 extern union Data* createRedBlackTree(struct Context* context); |
d8a59b727f65
Fix spawnTaskManager
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents:
217
diff
changeset
|
10 extern union Data* createTaskManager(struct Context* context); |
90 | 11 extern void allocator(struct Context* context); |
86 | 12 |
95
3e28ee215c0e
modify twice, use OSAtomiceCompareAndSwap
Shohei KOKUBO <e105744@ie.u-ryukyu.ac.jp>
parents:
92
diff
changeset
|
13 int cpu_num = 1; |
116 | 14 int length = 102400; |
15 int split = 8; | |
90 | 16 int* array_ptr; |
17 | |
18 void print_queue(struct Element* element) { | |
19 while (element) { | |
185 | 20 printf("%p\n", ((struct Task *)(element->data))); |
90 | 21 element = element->next; |
22 } | |
23 } | |
24 | |
25 void print_tree(struct Node* node) { | |
26 if (node != 0) { | |
196 | 27 printf("%d\n", node->value->Array.index); |
90 | 28 print_tree(node->left); |
29 print_tree(node->right); | |
30 } | |
31 } | |
86 | 32 |
220 | 33 __code initDataGears(struct Context* context, struct LoopCounter* loopCounter, struct TaskManager* taskManager) { |
34 loopCounter->tree = &createRedBlackTree(context)->Tree; | |
35 loopCounter->i = 0; | |
36 taskManager->taskManager = (union Data*)&createTaskManager(context)->TaskManager; | |
37 goto meta(context, C_createData1); | |
38 } | |
39 | |
40 __code initDataGears_stub(struct Context* context) { | |
41 goto initDataGears(context, Gearef(context, LoopCounter), Gearef(context, TaskManager)); | |
42 } | |
43 | |
44 __code code1(struct Context* context, struct Time* time) { | |
95
3e28ee215c0e
modify twice, use OSAtomiceCompareAndSwap
Shohei KOKUBO <e105744@ie.u-ryukyu.ac.jp>
parents:
92
diff
changeset
|
45 printf("cpus:\t\t%d\n", cpu_num); |
3e28ee215c0e
modify twice, use OSAtomiceCompareAndSwap
Shohei KOKUBO <e105744@ie.u-ryukyu.ac.jp>
parents:
92
diff
changeset
|
46 printf("length:\t\t%d\n", length); |
3e28ee215c0e
modify twice, use OSAtomiceCompareAndSwap
Shohei KOKUBO <e105744@ie.u-ryukyu.ac.jp>
parents:
92
diff
changeset
|
47 printf("length/task:\t%d\n", length/split); |
3e28ee215c0e
modify twice, use OSAtomiceCompareAndSwap
Shohei KOKUBO <e105744@ie.u-ryukyu.ac.jp>
parents:
92
diff
changeset
|
48 /* puts("queue"); */ |
3e28ee215c0e
modify twice, use OSAtomiceCompareAndSwap
Shohei KOKUBO <e105744@ie.u-ryukyu.ac.jp>
parents:
92
diff
changeset
|
49 /* print_queue(context->data[ActiveQueue]->queue.first); */ |
3e28ee215c0e
modify twice, use OSAtomiceCompareAndSwap
Shohei KOKUBO <e105744@ie.u-ryukyu.ac.jp>
parents:
92
diff
changeset
|
50 /* puts("tree"); */ |
3e28ee215c0e
modify twice, use OSAtomiceCompareAndSwap
Shohei KOKUBO <e105744@ie.u-ryukyu.ac.jp>
parents:
92
diff
changeset
|
51 /* print_tree(context->data[Tree]->tree.root); */ |
3e28ee215c0e
modify twice, use OSAtomiceCompareAndSwap
Shohei KOKUBO <e105744@ie.u-ryukyu.ac.jp>
parents:
92
diff
changeset
|
52 /* puts("result"); */ |
90 | 53 |
220 | 54 time->next = C_createWorker1; |
186 | 55 goto meta(context, C_start_time); |
86 | 56 } |
57 | |
58 __code code1_stub(struct Context* context) { | |
220 | 59 goto code1(context, Gearef(context, Time)); |
86 | 60 } |
61 | |
92 | 62 __code code2(struct Context* context, struct Array* array, struct LoopCounter* loopCounter) { |
63 int i = loopCounter->i; | |
111 | 64 |
92 | 65 if (i < length) { |
114 | 66 //printf("%d\n", array->array[i]); |
95
3e28ee215c0e
modify twice, use OSAtomiceCompareAndSwap
Shohei KOKUBO <e105744@ie.u-ryukyu.ac.jp>
parents:
92
diff
changeset
|
67 if (array->array[i] == (i*2)) { |
3e28ee215c0e
modify twice, use OSAtomiceCompareAndSwap
Shohei KOKUBO <e105744@ie.u-ryukyu.ac.jp>
parents:
92
diff
changeset
|
68 loopCounter->i++; |
144 | 69 goto meta(context, C_code2); |
95
3e28ee215c0e
modify twice, use OSAtomiceCompareAndSwap
Shohei KOKUBO <e105744@ie.u-ryukyu.ac.jp>
parents:
92
diff
changeset
|
70 } else |
3e28ee215c0e
modify twice, use OSAtomiceCompareAndSwap
Shohei KOKUBO <e105744@ie.u-ryukyu.ac.jp>
parents:
92
diff
changeset
|
71 puts("wrong result"); |
92 | 72 |
73 } | |
95
3e28ee215c0e
modify twice, use OSAtomiceCompareAndSwap
Shohei KOKUBO <e105744@ie.u-ryukyu.ac.jp>
parents:
92
diff
changeset
|
74 |
186 | 75 goto meta(context, C_code2); |
92 | 76 } |
77 | |
78 __code code2_stub(struct Context* context) { | |
217
c34e6aa10967
Fix DataGear access name
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents:
211
diff
changeset
|
79 goto code2(context, &context->data[D_Node]->Node.value->Array, &context->data[D_LoopCounter]->LoopCounter); |
92 | 80 } |
81 | |
90 | 82 __code createData1(struct Context* context, struct Allocate* allocate, struct LoopCounter* loopCounter) { |
83 int i = loopCounter->i; | |
84 | |
95
3e28ee215c0e
modify twice, use OSAtomiceCompareAndSwap
Shohei KOKUBO <e105744@ie.u-ryukyu.ac.jp>
parents:
92
diff
changeset
|
85 if ((length/split*i) < length) { |
186 | 86 goto meta(context, C_createData2); |
90 | 87 } |
88 | |
92 | 89 loopCounter->i = 0; |
144 | 90 goto meta(context, C_code1); |
90 | 91 } |
111 | 92 |
90 | 93 __code createData1_stub(struct Context* context) { |
218
d8a59b727f65
Fix spawnTaskManager
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents:
217
diff
changeset
|
94 goto createData1(context, Gearef(context, Allocate), Gearef(context, LoopCounter)); |
90 | 95 } |
96 | |
160 | 97 __code createData2(struct Context* context, struct LoopCounter* loopCounter, struct Array* array, struct Node* node, Tree* tree) { |
90 | 98 int i = loopCounter->i; |
99 | |
100 array->index = i; | |
95
3e28ee215c0e
modify twice, use OSAtomiceCompareAndSwap
Shohei KOKUBO <e105744@ie.u-ryukyu.ac.jp>
parents:
92
diff
changeset
|
101 array->prefix = length/split; |
90 | 102 array->array = array_ptr; |
103 | |
104 node->key = i; | |
105 node->value = (union Data*)array; | |
220 | 106 |
107 tree->tree = (union Data*)loopCounter->tree; | |
111 | 108 |
186 | 109 tree->next = C_createTask1; |
160 | 110 tree->node = node; |
90 | 111 |
160 | 112 goto meta(context, loopCounter->tree->put); |
90 | 113 } |
114 | |
115 __code createData2_stub(struct Context* context) { | |
218
d8a59b727f65
Fix spawnTaskManager
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents:
217
diff
changeset
|
116 Array* array = &ALLOCATE(context, Array)->Array; |
90 | 117 goto createData2(context, |
218
d8a59b727f65
Fix spawnTaskManager
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents:
217
diff
changeset
|
118 Gearef(context, LoopCounter), |
d8a59b727f65
Fix spawnTaskManager
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents:
217
diff
changeset
|
119 array, |
d8a59b727f65
Fix spawnTaskManager
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents:
217
diff
changeset
|
120 Gearef(context, Node), |
160 | 121 Gearef(context, Tree)); |
112 | 122 } |
123 | |
218
d8a59b727f65
Fix spawnTaskManager
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents:
217
diff
changeset
|
124 __code createTask1(struct Context* context, struct LoopCounter* loopCounter, struct TaskManager* taskManager, struct Task* task) { |
186 | 125 task->code = C_twice; |
112 | 126 task->idsCount = 0; |
109
059b26a250cc
Change put_queue process
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents:
102
diff
changeset
|
127 |
218
d8a59b727f65
Fix spawnTaskManager
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents:
217
diff
changeset
|
128 taskManager->task = task; |
d8a59b727f65
Fix spawnTaskManager
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents:
217
diff
changeset
|
129 taskManager->next = C_createData1; |
90 | 130 loopCounter->i++; |
109
059b26a250cc
Change put_queue process
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents:
102
diff
changeset
|
131 |
218
d8a59b727f65
Fix spawnTaskManager
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents:
217
diff
changeset
|
132 goto meta(context, taskManager->taskManager->TaskManager.spawn); |
90 | 133 } |
134 | |
160 | 135 __code createTask1_stub(struct Context* context) { |
136 Task* task = &ALLOCATE(context, Task)->Task; | |
137 goto createTask1(context, | |
218
d8a59b727f65
Fix spawnTaskManager
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents:
217
diff
changeset
|
138 Gearef(context, LoopCounter), |
d8a59b727f65
Fix spawnTaskManager
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents:
217
diff
changeset
|
139 Gearef(context, TaskManager), |
d8a59b727f65
Fix spawnTaskManager
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents:
217
diff
changeset
|
140 task); |
90 | 141 } |
142 | |
211 | 143 __code createWorker1(struct Context* context, struct LoopCounter* loopCounter, struct Worker* worker) { |
86 | 144 int i = loopCounter->i; |
145 | |
185 | 146 if (i < worker->id) { |
86 | 147 struct Context* worker_context = &worker->contexts[i]; |
170 | 148 worker_context->next = C_getTask1; |
148
473b7d990a1f
fix data gears type enum
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
144
diff
changeset
|
149 worker_context->data[D_Tree] = context->data[D_Tree]; |
187 | 150 // worker_context->data[D_ActiveQueue] = context->data[D_ActiveQueue]; |
86 | 151 pthread_create(&worker_context->thread, NULL, (void*)&start_code, worker_context); |
92 | 152 worker_context->thread_num = i; |
86 | 153 loopCounter->i++; |
154 | |
211 | 155 goto meta(context, C_createWorker1); |
86 | 156 } |
157 | |
158 loopCounter->i = 0; | |
187 | 159 goto meta(context, C_taskManager); |
86 | 160 } |
109
059b26a250cc
Change put_queue process
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents:
102
diff
changeset
|
161 |
211 | 162 __code createWorker1_stub(struct Context* context) { |
217
c34e6aa10967
Fix DataGear access name
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents:
211
diff
changeset
|
163 goto createWorker1(context, &context->data[D_LoopCounter]->LoopCounter, &context->data[D_Worker]->Worker); |
86 | 164 } |
165 | |
166 __code taskManager(struct Context* context, struct LoopCounter* loopCounter, struct Worker* worker) { | |
167 int i = loopCounter->i; | |
168 | |
185 | 169 if (i < worker->id) { |
86 | 170 pthread_join(worker->contexts[i].thread, NULL); |
171 loopCounter->i++; | |
172 | |
187 | 173 goto meta(context, C_taskManager); |
86 | 174 } |
175 | |
176 loopCounter->i = 0; | |
95
3e28ee215c0e
modify twice, use OSAtomiceCompareAndSwap
Shohei KOKUBO <e105744@ie.u-ryukyu.ac.jp>
parents:
92
diff
changeset
|
177 |
149 | 178 Time *t = &context->data[D_Time]->Time; |
144 | 179 t->next = C_code2; |
187 | 180 goto meta(context, C_end_time); |
86 | 181 } |
109
059b26a250cc
Change put_queue process
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents:
102
diff
changeset
|
182 |
86 | 183 __code taskManager_stub(struct Context* context) { |
217
c34e6aa10967
Fix DataGear access name
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents:
211
diff
changeset
|
184 goto taskManager(context, &context->data[D_LoopCounter]->LoopCounter, &context->data[D_Worker]->Worker); |
86 | 185 } |
186 | |
95
3e28ee215c0e
modify twice, use OSAtomiceCompareAndSwap
Shohei KOKUBO <e105744@ie.u-ryukyu.ac.jp>
parents:
92
diff
changeset
|
187 void init(int argc, char** argv) { |
3e28ee215c0e
modify twice, use OSAtomiceCompareAndSwap
Shohei KOKUBO <e105744@ie.u-ryukyu.ac.jp>
parents:
92
diff
changeset
|
188 for (int i = 1; argv[i]; ++i) { |
3e28ee215c0e
modify twice, use OSAtomiceCompareAndSwap
Shohei KOKUBO <e105744@ie.u-ryukyu.ac.jp>
parents:
92
diff
changeset
|
189 if (strcmp(argv[i], "-cpu") == 0) |
3e28ee215c0e
modify twice, use OSAtomiceCompareAndSwap
Shohei KOKUBO <e105744@ie.u-ryukyu.ac.jp>
parents:
92
diff
changeset
|
190 cpu_num = (int)atoi(argv[i+1]); |
3e28ee215c0e
modify twice, use OSAtomiceCompareAndSwap
Shohei KOKUBO <e105744@ie.u-ryukyu.ac.jp>
parents:
92
diff
changeset
|
191 else if (strcmp(argv[i], "-l") == 0) |
3e28ee215c0e
modify twice, use OSAtomiceCompareAndSwap
Shohei KOKUBO <e105744@ie.u-ryukyu.ac.jp>
parents:
92
diff
changeset
|
192 length = (int)atoi(argv[i+1]); |
3e28ee215c0e
modify twice, use OSAtomiceCompareAndSwap
Shohei KOKUBO <e105744@ie.u-ryukyu.ac.jp>
parents:
92
diff
changeset
|
193 else if (strcmp(argv[i], "-s") == 0) |
3e28ee215c0e
modify twice, use OSAtomiceCompareAndSwap
Shohei KOKUBO <e105744@ie.u-ryukyu.ac.jp>
parents:
92
diff
changeset
|
194 split = (int)atoi(argv[i+1]); |
3e28ee215c0e
modify twice, use OSAtomiceCompareAndSwap
Shohei KOKUBO <e105744@ie.u-ryukyu.ac.jp>
parents:
92
diff
changeset
|
195 } |
3e28ee215c0e
modify twice, use OSAtomiceCompareAndSwap
Shohei KOKUBO <e105744@ie.u-ryukyu.ac.jp>
parents:
92
diff
changeset
|
196 } |
109
059b26a250cc
Change put_queue process
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents:
102
diff
changeset
|
197 |
95
3e28ee215c0e
modify twice, use OSAtomiceCompareAndSwap
Shohei KOKUBO <e105744@ie.u-ryukyu.ac.jp>
parents:
92
diff
changeset
|
198 |
86 | 199 int main(int argc, char** argv) { |
95
3e28ee215c0e
modify twice, use OSAtomiceCompareAndSwap
Shohei KOKUBO <e105744@ie.u-ryukyu.ac.jp>
parents:
92
diff
changeset
|
200 init(argc, argv); |
90 | 201 |
101 | 202 array_ptr = NEWN(length, int); |
90 | 203 |
204 for(int i=0; i<length; i++) | |
205 array_ptr[i]=i; | |
86 | 206 |
101 | 207 struct Context* main_context = NEW(struct Context); |
86 | 208 initContext(main_context); |
220 | 209 main_context->next = C_initDataGears; |
86 | 210 |
101 | 211 struct Context* worker_contexts = NEWN(cpu_num, struct Context); |
109
059b26a250cc
Change put_queue process
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents:
102
diff
changeset
|
212 |
185 | 213 struct Worker* worker = &main_context->data[D_Worker]->Worker; |
214 worker->id = cpu_num; | |
86 | 215 worker->contexts = worker_contexts; |
109
059b26a250cc
Change put_queue process
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents:
102
diff
changeset
|
216 |
86 | 217 for (int i = 0;i<cpu_num;i++) |
218 initContext(&worker_contexts[i]); | |
109
059b26a250cc
Change put_queue process
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents:
102
diff
changeset
|
219 |
86 | 220 goto start_code(main_context); |
221 } | |
186 | 222 |