annotate src/CPUWorker.cbc @ 590:9146d6017f18 default tip

hg mv parallel_execution/* ..
author anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
date Thu, 16 Jan 2020 15:12:06 +0900
parents src/parallel_execution/CPUWorker.cbc@a517b11c37f7
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
278
23767f714f4a fix generate_stub
mir3636
parents: 277
diff changeset
1 #include "../context.h"
468
ac244346c85d Change used interface syntax from #include to #interface
Tatsuki IHA <innparusu@cr.ie.u-ryukyu.ac.jp>
parents: 462
diff changeset
2 #interface "TaskManager.h"
473
Tatsuki IHA <innparusu@cr.ie.u-ryukyu.ac.jp>
parents: 468
diff changeset
3 #interface "Worker.h"
Tatsuki IHA <innparusu@cr.ie.u-ryukyu.ac.jp>
parents: 468
diff changeset
4 #interface "Iterator.h"
Tatsuki IHA <innparusu@cr.ie.u-ryukyu.ac.jp>
parents: 468
diff changeset
5 #interface "Queue.h"
Tatsuki IHA <innparusu@cr.ie.u-ryukyu.ac.jp>
parents: 468
diff changeset
6
410
85b0ddbf458e Fix CudaWorker
Tatsuki IHA <innparusu@cr.ie.u-ryukyu.ac.jp>
parents: 405
diff changeset
7 static void startWorker(Worker* worker);
272
mir3636
parents:
diff changeset
8
280
2c2e4e597eb0 generate no compile errors
mir3636
parents: 278
diff changeset
9 Worker* createCPUWorker(struct Context* context, int id, Queue* queue) {
272
mir3636
parents:
diff changeset
10 struct Worker* worker = new Worker();
mir3636
parents:
diff changeset
11 struct CPUWorker* cpuWorker = new CPUWorker();
mir3636
parents:
diff changeset
12 worker->worker = (union Data*)cpuWorker;
mir3636
parents:
diff changeset
13 worker->tasks = queue;
mir3636
parents:
diff changeset
14 cpuWorker->id = id;
473
Tatsuki IHA <innparusu@cr.ie.u-ryukyu.ac.jp>
parents: 468
diff changeset
15 cpuWorker->loopCounter = 0;
Tatsuki IHA <innparusu@cr.ie.u-ryukyu.ac.jp>
parents: 468
diff changeset
16 worker->taskReceive = C_taskReceiveCPUWorker;
Tatsuki IHA <innparusu@cr.ie.u-ryukyu.ac.jp>
parents: 468
diff changeset
17 worker->shutdown = C_shutdownCPUWorker;
411
0eba9a04633f Work CUDAtwice
Tatsuki IHA <innparusu@cr.ie.u-ryukyu.ac.jp>
parents: 410
diff changeset
18 pthread_create(&worker->thread, NULL, (void*)&startWorker, worker);
272
mir3636
parents:
diff changeset
19 return worker;
mir3636
parents:
diff changeset
20 }
mir3636
parents:
diff changeset
21
473
Tatsuki IHA <innparusu@cr.ie.u-ryukyu.ac.jp>
parents: 468
diff changeset
22 static void startWorker(struct Worker* worker) {
481
a517b11c37f7 Refactoring CUDAWorker.cbc
Tatsuki IHA <innparusu@cr.ie.u-ryukyu.ac.jp>
parents: 474
diff changeset
23 struct CPUWorker* cpuWorker = &worker->worker->CPUWorker;
272
mir3636
parents:
diff changeset
24 cpuWorker->context = NEW(struct Context);
mir3636
parents:
diff changeset
25 initContext(cpuWorker->context);
mir3636
parents:
diff changeset
26 Gearef(cpuWorker->context, Worker)->worker = (union Data*)worker;
473
Tatsuki IHA <innparusu@cr.ie.u-ryukyu.ac.jp>
parents: 468
diff changeset
27 Gearef(cpuWorker->context, Worker)->tasks = worker->tasks;
282
a3448b0f0a56 Add input data gear
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents: 280
diff changeset
28 goto meta(cpuWorker->context, worker->taskReceive);
272
mir3636
parents:
diff changeset
29 }
mir3636
parents:
diff changeset
30
473
Tatsuki IHA <innparusu@cr.ie.u-ryukyu.ac.jp>
parents: 468
diff changeset
31 __code taskReceiveCPUWorker(struct CPUWorker* worker, struct Queue* tasks) {
Tatsuki IHA <innparusu@cr.ie.u-ryukyu.ac.jp>
parents: 468
diff changeset
32 goto tasks->take(getTaskCPUWorker);
272
mir3636
parents:
diff changeset
33 }
mir3636
parents:
diff changeset
34
473
Tatsuki IHA <innparusu@cr.ie.u-ryukyu.ac.jp>
parents: 468
diff changeset
35 __code getTaskCPUWorker(struct CPUWorker* cpuWorker, struct Context* task, struct Worker* worker) {
481
a517b11c37f7 Refactoring CUDAWorker.cbc
Tatsuki IHA <innparusu@cr.ie.u-ryukyu.ac.jp>
parents: 474
diff changeset
36 if (!task) {
a517b11c37f7 Refactoring CUDAWorker.cbc
Tatsuki IHA <innparusu@cr.ie.u-ryukyu.ac.jp>
parents: 474
diff changeset
37 goto worker->shutdown(); // end thread
473
Tatsuki IHA <innparusu@cr.ie.u-ryukyu.ac.jp>
parents: 468
diff changeset
38 }
272
mir3636
parents:
diff changeset
39 task->worker = worker;
289
3d70e21a3902 Delete createData
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents: 288
diff changeset
40 enum Code taskCg = task->next;
474
b92898d3a630 Refactoring CPUWorker.cbc
Tatsuki IHA <innparusu@cr.ie.u-ryukyu.ac.jp>
parents: 473
diff changeset
41 task->next = C_odgCommitCPUWorker; // commit outputDG after task exec
473
Tatsuki IHA <innparusu@cr.ie.u-ryukyu.ac.jp>
parents: 468
diff changeset
42 goto meta(task, taskCg); // switch task context
272
mir3636
parents:
diff changeset
43 }
mir3636
parents:
diff changeset
44
473
Tatsuki IHA <innparusu@cr.ie.u-ryukyu.ac.jp>
parents: 468
diff changeset
45 __code getTaskCPUWorker_stub(struct Context* context) {
Tatsuki IHA <innparusu@cr.ie.u-ryukyu.ac.jp>
parents: 468
diff changeset
46 CPUWorker* cpuWorker = (CPUWorker*)GearImpl(context, Worker, worker);
272
mir3636
parents:
diff changeset
47 Worker* worker = &Gearef(context,Worker)->worker->Worker;
mir3636
parents:
diff changeset
48 struct Context* task = &Gearef(context, Queue)->data->Context;
473
Tatsuki IHA <innparusu@cr.ie.u-ryukyu.ac.jp>
parents: 468
diff changeset
49 goto getTaskCPUWorker(context, cpuWorker, task, worker);
Tatsuki IHA <innparusu@cr.ie.u-ryukyu.ac.jp>
parents: 468
diff changeset
50 }
Tatsuki IHA <innparusu@cr.ie.u-ryukyu.ac.jp>
parents: 468
diff changeset
51
Tatsuki IHA <innparusu@cr.ie.u-ryukyu.ac.jp>
parents: 468
diff changeset
52 __code odgCommitCPUWorker(struct CPUWorker* worker, struct Context* task) {
474
b92898d3a630 Refactoring CPUWorker.cbc
Tatsuki IHA <innparusu@cr.ie.u-ryukyu.ac.jp>
parents: 473
diff changeset
53 if (task->iterate) {
b92898d3a630 Refactoring CPUWorker.cbc
Tatsuki IHA <innparusu@cr.ie.u-ryukyu.ac.jp>
parents: 473
diff changeset
54 struct Iterator* iterator = task->iterator;
b92898d3a630 Refactoring CPUWorker.cbc
Tatsuki IHA <innparusu@cr.ie.u-ryukyu.ac.jp>
parents: 473
diff changeset
55 goto iterator->barrier(task, odgCommitCPUWorker1, odgCommitCPUWorker6);
b92898d3a630 Refactoring CPUWorker.cbc
Tatsuki IHA <innparusu@cr.ie.u-ryukyu.ac.jp>
parents: 473
diff changeset
56 } else {
473
Tatsuki IHA <innparusu@cr.ie.u-ryukyu.ac.jp>
parents: 468
diff changeset
57 goto odgCommitCPUWorker1();
288
f1b0cc555b6e Add odgCommit
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents: 282
diff changeset
58 }
f1b0cc555b6e Add odgCommit
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents: 282
diff changeset
59 }
f1b0cc555b6e Add odgCommit
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents: 282
diff changeset
60
473
Tatsuki IHA <innparusu@cr.ie.u-ryukyu.ac.jp>
parents: 468
diff changeset
61 __code odgCommitCPUWorker_stub(struct Context* context) {
450
d3d7a7d6a117 Delete USE_CUDA_MAIN_THREAD
Tatsuki IHA <innparusu@cr.ie.u-ryukyu.ac.jp>
parents: 440
diff changeset
62 // switch worker context
288
f1b0cc555b6e Add odgCommit
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents: 282
diff changeset
63 struct Context* workerContext = context->worker->worker->CPUWorker.context;
474
b92898d3a630 Refactoring CPUWorker.cbc
Tatsuki IHA <innparusu@cr.ie.u-ryukyu.ac.jp>
parents: 473
diff changeset
64 Gearef(workerContext, Worker)->worker = (union Data*)context->worker;
b92898d3a630 Refactoring CPUWorker.cbc
Tatsuki IHA <innparusu@cr.ie.u-ryukyu.ac.jp>
parents: 473
diff changeset
65 Gearef(workerContext, Worker)->task = context;
b92898d3a630 Refactoring CPUWorker.cbc
Tatsuki IHA <innparusu@cr.ie.u-ryukyu.ac.jp>
parents: 473
diff changeset
66 CPUWorker* cpuWorker = (CPUWorker*)GearImpl(workerContext, Worker, worker);
473
Tatsuki IHA <innparusu@cr.ie.u-ryukyu.ac.jp>
parents: 468
diff changeset
67 goto odgCommitCPUWorker(workerContext,
474
b92898d3a630 Refactoring CPUWorker.cbc
Tatsuki IHA <innparusu@cr.ie.u-ryukyu.ac.jp>
parents: 473
diff changeset
68 cpuWorker,
b92898d3a630 Refactoring CPUWorker.cbc
Tatsuki IHA <innparusu@cr.ie.u-ryukyu.ac.jp>
parents: 473
diff changeset
69 context);
327
534601ed8c50 Running dependency example for single thread and single task
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents: 325
diff changeset
70 }
534601ed8c50 Running dependency example for single thread and single task
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents: 325
diff changeset
71
474
b92898d3a630 Refactoring CPUWorker.cbc
Tatsuki IHA <innparusu@cr.ie.u-ryukyu.ac.jp>
parents: 473
diff changeset
72 __code odgCommitCPUWorker1(struct CPUWorker* worker, struct Context* task) {
473
Tatsuki IHA <innparusu@cr.ie.u-ryukyu.ac.jp>
parents: 468
diff changeset
73 int i = worker->loopCounter;
474
b92898d3a630 Refactoring CPUWorker.cbc
Tatsuki IHA <innparusu@cr.ie.u-ryukyu.ac.jp>
parents: 473
diff changeset
74 if (task->odg+i < task->maxOdg) {
b92898d3a630 Refactoring CPUWorker.cbc
Tatsuki IHA <innparusu@cr.ie.u-ryukyu.ac.jp>
parents: 473
diff changeset
75 goto odgCommitCPUWorker2();
b92898d3a630 Refactoring CPUWorker.cbc
Tatsuki IHA <innparusu@cr.ie.u-ryukyu.ac.jp>
parents: 473
diff changeset
76 }
b92898d3a630 Refactoring CPUWorker.cbc
Tatsuki IHA <innparusu@cr.ie.u-ryukyu.ac.jp>
parents: 473
diff changeset
77 worker->loopCounter = 0;
b92898d3a630 Refactoring CPUWorker.cbc
Tatsuki IHA <innparusu@cr.ie.u-ryukyu.ac.jp>
parents: 473
diff changeset
78 struct TaskManager* taskManager = task->taskManager;
b92898d3a630 Refactoring CPUWorker.cbc
Tatsuki IHA <innparusu@cr.ie.u-ryukyu.ac.jp>
parents: 473
diff changeset
79 goto taskManager->decrementTaskCount(odgCommitCPUWorker6);
327
534601ed8c50 Running dependency example for single thread and single task
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents: 325
diff changeset
80 }
534601ed8c50 Running dependency example for single thread and single task
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents: 325
diff changeset
81
474
b92898d3a630 Refactoring CPUWorker.cbc
Tatsuki IHA <innparusu@cr.ie.u-ryukyu.ac.jp>
parents: 473
diff changeset
82 __code odgCommitCPUWorker2(struct CPUWorker* worker, struct Context* task) {
473
Tatsuki IHA <innparusu@cr.ie.u-ryukyu.ac.jp>
parents: 468
diff changeset
83 int i = worker->loopCounter;
474
b92898d3a630 Refactoring CPUWorker.cbc
Tatsuki IHA <innparusu@cr.ie.u-ryukyu.ac.jp>
parents: 473
diff changeset
84 struct Queue* queue = GET_WAIT_LIST(task->data[task->odg+i]);
b92898d3a630 Refactoring CPUWorker.cbc
Tatsuki IHA <innparusu@cr.ie.u-ryukyu.ac.jp>
parents: 473
diff changeset
85 goto queue->isEmpty(odgCommitCPUWorker3, odgCommitCPUWorker5);
327
534601ed8c50 Running dependency example for single thread and single task
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents: 325
diff changeset
86 }
534601ed8c50 Running dependency example for single thread and single task
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents: 325
diff changeset
87
473
Tatsuki IHA <innparusu@cr.ie.u-ryukyu.ac.jp>
parents: 468
diff changeset
88 __code odgCommitCPUWorker3(struct CPUWorker* worker, struct Context* task) {
474
b92898d3a630 Refactoring CPUWorker.cbc
Tatsuki IHA <innparusu@cr.ie.u-ryukyu.ac.jp>
parents: 473
diff changeset
89 int i = worker->loopCounter;
b92898d3a630 Refactoring CPUWorker.cbc
Tatsuki IHA <innparusu@cr.ie.u-ryukyu.ac.jp>
parents: 473
diff changeset
90 struct Queue* queue = GET_WAIT_LIST(task->data[task->odg+i]);
b92898d3a630 Refactoring CPUWorker.cbc
Tatsuki IHA <innparusu@cr.ie.u-ryukyu.ac.jp>
parents: 473
diff changeset
91 goto queue->take(odgCommitCPUWorker4);
b92898d3a630 Refactoring CPUWorker.cbc
Tatsuki IHA <innparusu@cr.ie.u-ryukyu.ac.jp>
parents: 473
diff changeset
92 }
b92898d3a630 Refactoring CPUWorker.cbc
Tatsuki IHA <innparusu@cr.ie.u-ryukyu.ac.jp>
parents: 473
diff changeset
93
b92898d3a630 Refactoring CPUWorker.cbc
Tatsuki IHA <innparusu@cr.ie.u-ryukyu.ac.jp>
parents: 473
diff changeset
94 __code odgCommitCPUWorker4(struct CPUWorker* worker, struct Context* task, struct Context* waitTask) {
b92898d3a630 Refactoring CPUWorker.cbc
Tatsuki IHA <innparusu@cr.ie.u-ryukyu.ac.jp>
parents: 473
diff changeset
95 if (__sync_fetch_and_sub(&waitTask->idgCount, 1) == 1) { // atomic decrement idg counter(__sync_fetch_and_sub function return initial value of waitTask->idgCount point)
b92898d3a630 Refactoring CPUWorker.cbc
Tatsuki IHA <innparusu@cr.ie.u-ryukyu.ac.jp>
parents: 473
diff changeset
96 struct TaskManager* taskManager = waitTask->taskManager;
b92898d3a630 Refactoring CPUWorker.cbc
Tatsuki IHA <innparusu@cr.ie.u-ryukyu.ac.jp>
parents: 473
diff changeset
97 goto taskManager->spawn(waitTask, odgCommitCPUWorker2);
473
Tatsuki IHA <innparusu@cr.ie.u-ryukyu.ac.jp>
parents: 468
diff changeset
98 }
474
b92898d3a630 Refactoring CPUWorker.cbc
Tatsuki IHA <innparusu@cr.ie.u-ryukyu.ac.jp>
parents: 473
diff changeset
99 goto odgCommitCPUWorker2();
b92898d3a630 Refactoring CPUWorker.cbc
Tatsuki IHA <innparusu@cr.ie.u-ryukyu.ac.jp>
parents: 473
diff changeset
100 }
b92898d3a630 Refactoring CPUWorker.cbc
Tatsuki IHA <innparusu@cr.ie.u-ryukyu.ac.jp>
parents: 473
diff changeset
101
b92898d3a630 Refactoring CPUWorker.cbc
Tatsuki IHA <innparusu@cr.ie.u-ryukyu.ac.jp>
parents: 473
diff changeset
102 __code odgCommitCPUWorker4_stub(struct Context* context) {
b92898d3a630 Refactoring CPUWorker.cbc
Tatsuki IHA <innparusu@cr.ie.u-ryukyu.ac.jp>
parents: 473
diff changeset
103 CPUWorker* cpuWorker = (CPUWorker*)GearImpl(context, Worker, worker);
b92898d3a630 Refactoring CPUWorker.cbc
Tatsuki IHA <innparusu@cr.ie.u-ryukyu.ac.jp>
parents: 473
diff changeset
104 struct Context* task = Gearef(context, Worker)->task;
b92898d3a630 Refactoring CPUWorker.cbc
Tatsuki IHA <innparusu@cr.ie.u-ryukyu.ac.jp>
parents: 473
diff changeset
105 struct Context* waitTask = &Gearef(context, Queue)->data->Context;
b92898d3a630 Refactoring CPUWorker.cbc
Tatsuki IHA <innparusu@cr.ie.u-ryukyu.ac.jp>
parents: 473
diff changeset
106 goto odgCommitCPUWorker4(context,
b92898d3a630 Refactoring CPUWorker.cbc
Tatsuki IHA <innparusu@cr.ie.u-ryukyu.ac.jp>
parents: 473
diff changeset
107 cpuWorker,
b92898d3a630 Refactoring CPUWorker.cbc
Tatsuki IHA <innparusu@cr.ie.u-ryukyu.ac.jp>
parents: 473
diff changeset
108 task,
b92898d3a630 Refactoring CPUWorker.cbc
Tatsuki IHA <innparusu@cr.ie.u-ryukyu.ac.jp>
parents: 473
diff changeset
109 waitTask);
b92898d3a630 Refactoring CPUWorker.cbc
Tatsuki IHA <innparusu@cr.ie.u-ryukyu.ac.jp>
parents: 473
diff changeset
110 }
b92898d3a630 Refactoring CPUWorker.cbc
Tatsuki IHA <innparusu@cr.ie.u-ryukyu.ac.jp>
parents: 473
diff changeset
111
b92898d3a630 Refactoring CPUWorker.cbc
Tatsuki IHA <innparusu@cr.ie.u-ryukyu.ac.jp>
parents: 473
diff changeset
112 __code odgCommitCPUWorker5(struct CPUWorker* worker, struct Context* task) {
b92898d3a630 Refactoring CPUWorker.cbc
Tatsuki IHA <innparusu@cr.ie.u-ryukyu.ac.jp>
parents: 473
diff changeset
113 worker->loopCounter++;
473
Tatsuki IHA <innparusu@cr.ie.u-ryukyu.ac.jp>
parents: 468
diff changeset
114 goto odgCommitCPUWorker1();
327
534601ed8c50 Running dependency example for single thread and single task
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents: 325
diff changeset
115 }
534601ed8c50 Running dependency example for single thread and single task
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents: 325
diff changeset
116
474
b92898d3a630 Refactoring CPUWorker.cbc
Tatsuki IHA <innparusu@cr.ie.u-ryukyu.ac.jp>
parents: 473
diff changeset
117 __code odgCommitCPUWorker6(struct CPUWorker* worker, struct Context* task) {
b92898d3a630 Refactoring CPUWorker.cbc
Tatsuki IHA <innparusu@cr.ie.u-ryukyu.ac.jp>
parents: 473
diff changeset
118 struct Worker* taskWorker = task->worker;
b92898d3a630 Refactoring CPUWorker.cbc
Tatsuki IHA <innparusu@cr.ie.u-ryukyu.ac.jp>
parents: 473
diff changeset
119 goto taskWorker->taskReceive(taskWorker->tasks);
327
534601ed8c50 Running dependency example for single thread and single task
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents: 325
diff changeset
120 }
534601ed8c50 Running dependency example for single thread and single task
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents: 325
diff changeset
121
473
Tatsuki IHA <innparusu@cr.ie.u-ryukyu.ac.jp>
parents: 468
diff changeset
122 __code shutdownCPUWorker(struct CPUWorker* worker) {
Tatsuki IHA <innparusu@cr.ie.u-ryukyu.ac.jp>
parents: 468
diff changeset
123 goto exit_code();
288
f1b0cc555b6e Add odgCommit
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents: 282
diff changeset
124 }