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)