Mercurial > hg > Members > innparusu > Gears
comparison src/parallel_execution/main.c @ 122:a086857e1812
implement dependency example. do not work
author | Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp> |
---|---|
date | Thu, 25 Aug 2016 03:23:29 +0900 |
parents | bb8be1820302 |
children | 4ff6f093b695 |
comparison
equal
deleted
inserted
replaced
121:bb8be1820302 | 122:a086857e1812 |
---|---|
4 #include "context.h" | 4 #include "context.h" |
5 #include "origin_cs.h" | 5 #include "origin_cs.h" |
6 | 6 |
7 extern __code initContext(struct Context* context); | 7 extern __code initContext(struct Context* context); |
8 extern void allocator(struct Context* context); | 8 extern void allocator(struct Context* context); |
9 extern void metaAllocator(struct Context* context); | |
9 | 10 |
10 int cpu_num = 1; | 11 int cpu_num = 1; |
11 int length = 1024; | 12 int length = 1024; |
12 int split; | 13 int split; |
13 int* array_ptr; | 14 int* array_ptr; |
14 | 15 |
15 void print_queue(struct Element* element) { | 16 void print_queue(struct Element* element) { |
16 while (element) { | 17 while (element) { |
17 printf("%d\n", ((struct Task *)(element->data))->key); | 18 //printf("%d\n", ((struct Task *)(element->data))->key); |
18 element = element->next; | 19 element = element->next; |
19 } | 20 } |
20 } | 21 } |
21 | 22 |
22 void print_tree(struct Node* node) { | 23 void print_tree(struct Node* node) { |
178 &context->data[Element]->element); | 179 &context->data[Element]->element); |
179 } | 180 } |
180 */ | 181 */ |
181 | 182 |
182 | 183 |
183 __code createTask2(struct Context* context, struct LoopCounter* loopCounter, struct Task* task, struct Element* element, struct Queue* activeQueue) { | 184 __code createTask2(struct Context* context, struct LoopCounter* loopCounter, struct Task* task, struct Element* element) { |
184 int i = loopCounter->i; | 185 int i = loopCounter->i; |
185 | 186 |
186 task->code = Mult; | 187 task->code = Mult; |
187 task->iKeys[0] = i-1; | 188 task->iKeys[0] = i-1; |
188 task->iKeys[1] = i-2; | 189 task->iKeys[1] = i-2; |
189 task->idsCount = 1; | 190 task->idsCount = 1; |
190 loopCounter->i -= 2; | 191 loopCounter->i -= 2; |
191 | 192 |
192 element->data = (union Data *)task; | 193 element->data = (union Data*)task; |
193 | 194 |
194 context->next = CreateTask3; | 195 context->next = CreateTask3; |
195 | 196 |
196 goto meta(context, SpawnTask); | 197 goto meta(context, SpawnTask); |
197 } | 198 } |
221 task->oKeys[0] = i; | 222 task->oKeys[0] = i; |
222 task->iKeys[0] = i-1; | 223 task->iKeys[0] = i-1; |
223 task->iKeys[1] = i-2; | 224 task->iKeys[1] = i-2; |
224 loopCounter->i -= 2; | 225 loopCounter->i -= 2; |
225 element->data = (union Data *)task; | 226 element->data = (union Data *)task; |
226 context->next = WaitFor1; | 227 context->next = WaitFor; |
227 | 228 |
228 node->key = okeys[0]; | 229 node->key = task->oKeys[0]; |
229 goto meta(context, Get); | 230 goto meta(context, Get); |
230 } | 231 } |
231 | 232 |
232 __code createTask4_stub(struct Context* context) { | 233 __code createTask4_stub(struct Context* context) { |
233 goto createTask3(context, | 234 goto createTask4(context, |
234 &context->data[LoopCounter]->loopCounter, | 235 &context->data[LoopCounter]->loopCounter, |
235 &context->data[context->dataNum]->task, | 236 &context->data[context->dataNum]->task, |
236 &context->data[Node]->node, | 237 &context->data[Element]->element, |
237 &context->data[Element]->element); | 238 &context->data[Node]->node); |
238 } | 239 } |
239 | 240 |
240 __code putQueue1(struct Context* context, struct Allocate* allocate) { | 241 __code putQueue1(struct Context* context, struct Allocate* allocate) { |
241 allocate->size = sizeof(struct Element); | 242 allocate->size = sizeof(struct Element); |
242 allocator(context); | 243 allocator(context); |
299 __code createWorker(struct Context* context, struct LoopCounter* loopCounter, struct Worker* worker) { | 300 __code createWorker(struct Context* context, struct LoopCounter* loopCounter, struct Worker* worker) { |
300 int i = loopCounter->i; | 301 int i = loopCounter->i; |
301 | 302 |
302 if (i < worker->num) { | 303 if (i < worker->num) { |
303 struct Context* worker_context = &worker->contexts[i]; | 304 struct Context* worker_context = &worker->contexts[i]; |
304 worker_context->next = GetQueue2; | 305 worker_context->next = InitWorker; |
305 worker_context->data[Tree] = context->data[Tree]; | 306 worker_context->data[Tree] = context->data[Tree]; |
306 worker_context->data[ActiveQueue] = context->data[ActiveQueue]; | 307 worker_context->data[ActiveQueue] = context->data[ActiveQueue]; |
307 worker_context->data[WaitQueue] = context->data[WaitQueue]; | 308 worker_context->data[WaitQueue] = context->data[WaitQueue]; |
308 worker_context->data[Queue] = context->data[ActiveQueue]; | 309 worker_context->data[Queue] = context->data[ActiveQueue]; |
309 pthread_create(&worker_context->thread, NULL, (void*)&getQueue1, worker_context); | 310 pthread_create(&worker_context->thread, NULL, (void*)&start_code, worker_context); |
310 worker_context->thread_num = i; | 311 worker_context->thread_num = i; |
311 loopCounter->i++; | 312 loopCounter->i++; |
312 | 313 |
313 goto meta(context, CreateWorker); | 314 goto meta(context, CreateWorker); |
314 } | 315 } |
319 | 320 |
320 __code createWorker_stub(struct Context* context) { | 321 __code createWorker_stub(struct Context* context) { |
321 goto createWorker(context, &context->data[LoopCounter]->loopCounter, &context->data[Worker]->worker); | 322 goto createWorker(context, &context->data[LoopCounter]->loopCounter, &context->data[Worker]->worker); |
322 } | 323 } |
323 | 324 |
324 __code taskManager(struct Context* context, struct LoopCounter* loopCounter, struct Worker* worker) { | 325 __code taskManager(struct Context* context, struct LoopCounter* loopCounter, struct Worker* worker, struct Queue* waitQueue, struct Queue* ActiveQueue) { |
325 int i = loopCounter->i; | 326 if (waitQueue->first) { |
326 | 327 goto meta(context, Poll1); |
328 } | |
329 int i = loopCounter->i; | |
327 if (i < worker->num) { | 330 if (i < worker->num) { |
328 pthread_join(worker->contexts[i].thread, NULL); | 331 pthread_join(worker->contexts[i].thread, NULL); |
329 loopCounter->i++; | 332 loopCounter->i++; |
330 | 333 |
331 goto meta(context, TaskManager); | 334 goto meta(context, TaskManager); |
332 } | 335 } |
333 | |
334 loopCounter->i = 0; | 336 loopCounter->i = 0; |
335 | |
336 struct Time *t = &context->data[Time]->time; | 337 struct Time *t = &context->data[Time]->time; |
337 t->next = Code2; | 338 t->next = Code2; |
338 goto meta(context, EndTime); | 339 goto meta(context, EndTime); |
339 } | 340 } |
340 | 341 |
341 __code taskManager_stub(struct Context* context) { | 342 __code taskManager_stub(struct Context* context) { |
342 goto taskManager(context, &context->data[LoopCounter]->loopCounter, &context->data[Worker]->worker); | 343 goto taskManager(context, |
344 &context->data[LoopCounter]->loopCounter, | |
345 &context->data[Worker]->worker, | |
346 &context->data[WaitQueue]->queue, | |
347 &context->data[ActiveQueue]->queue); | |
348 } | |
349 | |
350 __code meta_poll1(struct Context* context, struct Queue* queue, enum Code next) { | |
351 context->data[Queue] = (union Data *)queue; | |
352 goto (context->code[next])(context); | |
353 } | |
354 | |
355 __code poll1(struct Context* context, struct Queue* waitQueue) { | |
356 context->next = Poll2; | |
357 goto meta_poll1(context, waitQueue, GetQueue1); | |
358 } | |
359 | |
360 __code poll1_stub(struct Context* context) { | |
361 goto poll1(context, | |
362 &context->data[WaitQueue]->queue); | |
363 } | |
364 | |
365 __code poll2(struct Context* context) { | |
366 context->next = TaskManager; | |
367 goto meta(context, SpawnTask); | |
368 } | |
369 | |
370 __code poll2_stub(struct Context* context) { | |
371 goto poll2(context); | |
343 } | 372 } |
344 | 373 |
345 void init(int argc, char** argv) { | 374 void init(int argc, char** argv) { |
346 for (int i = 1; argv[i]; ++i) { | 375 for (int i = 1; argv[i]; ++i) { |
347 if (strcmp(argv[i], "-cpu") == 0) | 376 if (strcmp(argv[i], "-cpu") == 0) |