annotate src/parallel_execution/CUDAWorker.cbc @ 320:f730761bb044

non CUDA case clean up
author Shinji KONO <kono@ie.u-ryukyu.ac.jp>
date Wed, 15 Feb 2017 20:53:06 +0900
parents a15511b1a6e0
children 85b0ddbf458e
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
303
1dbaef86593b CUDAtwice.cbc
ikkun
parents: 302
diff changeset
1 #include <stdio.h>
1dbaef86593b CUDAtwice.cbc
ikkun
parents: 302
diff changeset
2 #include <sys/time.h>
1dbaef86593b CUDAtwice.cbc
ikkun
parents: 302
diff changeset
3 #include <string.h>
1dbaef86593b CUDAtwice.cbc
ikkun
parents: 302
diff changeset
4 #include <stdlib.h>
304
9755206813cb helper_string.h for ANSI C
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 303
diff changeset
5 #include <libkern/OSAtomic.h>
305
ec0a5b4fba05 CUDAWorker
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 304
diff changeset
6
302
8e7926f3e271 fix CUDAWorker
ikkun
parents: 275
diff changeset
7 #include "../context.h"
95
3e28ee215c0e modify twice, use OSAtomiceCompareAndSwap
Shohei KOKUBO <e105744@ie.u-ryukyu.ac.jp>
parents:
diff changeset
8
319
a15511b1a6e0 separate cuda.c, and USE_CUDA_MAIN_THREAD flag
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 317
diff changeset
9 extern void cudaInit(struct CUDAWorker *cudaWorker,int phase) ;
a15511b1a6e0 separate cuda.c, and USE_CUDA_MAIN_THREAD flag
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 317
diff changeset
10
303
1dbaef86593b CUDAtwice.cbc
ikkun
parents: 302
diff changeset
11 static void start_CUDAworker(Worker* worker);
233
06133afb3b5b create worker start_code
mir3636
parents: 232
diff changeset
12
320
f730761bb044 non CUDA case clean up
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 319
diff changeset
13 #ifndef USE_CUDA_MAIN_THREAD
f730761bb044 non CUDA case clean up
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 319
diff changeset
14 volatile
f730761bb044 non CUDA case clean up
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 319
diff changeset
15 #endif
f730761bb044 non CUDA case clean up
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 319
diff changeset
16 int cuda_initialized = 0;
313
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 312
diff changeset
17
316
54d203daf06b CUDAtwice.cbc is called.
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 314
diff changeset
18 Worker* createCUDAWorker(struct Context* context, int id, Queue* queue, TaskManagerImpl *im) {
233
06133afb3b5b create worker start_code
mir3636
parents: 232
diff changeset
19 struct Worker* worker = ALLOC(context, Worker);
305
ec0a5b4fba05 CUDAWorker
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 304
diff changeset
20 struct CUDAWorker* cudaWorker = new CUDAWorker();
316
54d203daf06b CUDAtwice.cbc is called.
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 314
diff changeset
21
54d203daf06b CUDAtwice.cbc is called.
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 314
diff changeset
22 cudaInit(cudaWorker,0);
54d203daf06b CUDAtwice.cbc is called.
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 314
diff changeset
23
305
ec0a5b4fba05 CUDAWorker
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 304
diff changeset
24 worker->worker = (union Data*)cudaWorker;
244
d1567718f12c Fix error
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents: 242
diff changeset
25 worker->tasks = queue;
305
ec0a5b4fba05 CUDAWorker
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 304
diff changeset
26 cudaWorker->id = id;
313
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 312
diff changeset
27 worker->shutdown = C_shutdownCUDAWorker;
319
a15511b1a6e0 separate cuda.c, and USE_CUDA_MAIN_THREAD flag
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 317
diff changeset
28 #ifndef USE_CUDA_MAIN_THREAD
a15511b1a6e0 separate cuda.c, and USE_CUDA_MAIN_THREAD flag
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 317
diff changeset
29 pthread_create(&worker->worker->CUDAWorker.thread, NULL, (void*)&start_CUDAworker, worker);
a15511b1a6e0 separate cuda.c, and USE_CUDA_MAIN_THREAD flag
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 317
diff changeset
30 #else
316
54d203daf06b CUDAtwice.cbc is called.
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 314
diff changeset
31 if (im) {
54d203daf06b CUDAtwice.cbc is called.
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 314
diff changeset
32 im->workers[0] = worker;
54d203daf06b CUDAtwice.cbc is called.
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 314
diff changeset
33 }
54d203daf06b CUDAtwice.cbc is called.
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 314
diff changeset
34 cuda_initialized = 1;
54d203daf06b CUDAtwice.cbc is called.
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 314
diff changeset
35 start_CUDAworker(worker);
319
a15511b1a6e0 separate cuda.c, and USE_CUDA_MAIN_THREAD flag
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 317
diff changeset
36 #endif
313
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 312
diff changeset
37 return worker;
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 312
diff changeset
38 }
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 312
diff changeset
39
183
mir3636
parents: 175
diff changeset
40
303
1dbaef86593b CUDAtwice.cbc
ikkun
parents: 302
diff changeset
41 static void start_CUDAworker(Worker* worker) {
305
ec0a5b4fba05 CUDAWorker
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 304
diff changeset
42 CUDAWorker* cudaWorker = (CUDAWorker*)worker->worker;
ec0a5b4fba05 CUDAWorker
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 304
diff changeset
43 cudaWorker->context = NEW(struct Context);
ec0a5b4fba05 CUDAWorker
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 304
diff changeset
44 initContext(cudaWorker->context);
ec0a5b4fba05 CUDAWorker
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 304
diff changeset
45 Gearef(cudaWorker->context, Worker)->worker = (union Data*)worker;
303
1dbaef86593b CUDAtwice.cbc
ikkun
parents: 302
diff changeset
46
305
ec0a5b4fba05 CUDAWorker
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 304
diff changeset
47 goto meta(cudaWorker->context, C_taskReceiveCUDAWorker);
233
06133afb3b5b create worker start_code
mir3636
parents: 232
diff changeset
48 }
06133afb3b5b create worker start_code
mir3636
parents: 232
diff changeset
49
305
ec0a5b4fba05 CUDAWorker
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 304
diff changeset
50 __code taskReceiveCUDAWorker(struct Worker* worker,struct Queue* queue) {
247
ce262b2c1daf Fix createTask for main
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents: 244
diff changeset
51 queue->queue = (union Data*)worker->tasks;
305
ec0a5b4fba05 CUDAWorker
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 304
diff changeset
52 queue->next = C_getTaskCUDA;
248
1ede5390cda2 Fix segmentation fault but not multi thread running
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents: 247
diff changeset
53 goto meta(context, worker->tasks->take);
227
991f3d1ce072 fix worker
ikkun
parents: 222
diff changeset
54 }
991f3d1ce072 fix worker
ikkun
parents: 222
diff changeset
55
302
8e7926f3e271 fix CUDAWorker
ikkun
parents: 275
diff changeset
56 __code taskReceiveCUDAWorker_stub(struct Context* context) {
8e7926f3e271 fix CUDAWorker
ikkun
parents: 275
diff changeset
57 goto taskReceiveCUDAWorker(context, &Gearef(context, Worker)->worker->Worker, Gearef(context, Queue));
222
77faa28128b4 Add taskSend for TaskManager
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents: 217
diff changeset
58 }
77faa28128b4 Add taskSend for TaskManager
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents: 217
diff changeset
59
305
ec0a5b4fba05 CUDAWorker
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 304
diff changeset
60 __code getTaskCUDA(struct Worker* worker, struct Context* task) {
240
864bb372f37f Add spawnTask1
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents: 237
diff changeset
61 if (!task)
236
865179a0a56d fix taskManager
ikkun
parents: 235
diff changeset
62 return; // end thread
314
1839586f5b41 pthread CUDA test
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 313
diff changeset
63 worker->taskReceive = C_taskReceiveCUDAWorker;
230
a1fb3f2d1a36 fix worker
ikkun
parents: 227
diff changeset
64 task->worker = worker;
305
ec0a5b4fba05 CUDAWorker
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 304
diff changeset
65 enum Code taskCg = task->next;
ec0a5b4fba05 CUDAWorker
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 304
diff changeset
66 task->next = C_odgCommitCUDA; // set CG after task exec
ec0a5b4fba05 CUDAWorker
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 304
diff changeset
67 goto meta(task, taskCg);
169
ea7b11f3e717 Using Queue Interface
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents: 149
diff changeset
68 }
109
059b26a250cc Change put_queue process
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents: 103
diff changeset
69
305
ec0a5b4fba05 CUDAWorker
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 304
diff changeset
70 __code getTaskCUDA_stub(struct Context* context) {
247
ce262b2c1daf Fix createTask for main
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents: 244
diff changeset
71 Worker* worker = &Gearef(context,Worker)->worker->Worker;
260
6b5444bbea8a generated stub no comiple errors
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 257
diff changeset
72 struct Context* task = &Gearef(context, Queue)->data->Context;
305
ec0a5b4fba05 CUDAWorker
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 304
diff changeset
73 goto getTaskCUDA(context, worker, task);
ec0a5b4fba05 CUDAWorker
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 304
diff changeset
74 }
ec0a5b4fba05 CUDAWorker
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 304
diff changeset
75
ec0a5b4fba05 CUDAWorker
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 304
diff changeset
76 __code odgCommitCUDA(struct LoopCounter* loopCounter, struct Queue* queue, struct Context* task) {
ec0a5b4fba05 CUDAWorker
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 304
diff changeset
77 int i = loopCounter->i ;
ec0a5b4fba05 CUDAWorker
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 304
diff changeset
78 if(task->odg + i < task->maxOdg) {
ec0a5b4fba05 CUDAWorker
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 304
diff changeset
79 queue->queue = (union Data*)GET_WAIT_LIST(task->data[task->odg+i]);
ec0a5b4fba05 CUDAWorker
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 304
diff changeset
80 queue->next = C_odgCommitCUDA1;
ec0a5b4fba05 CUDAWorker
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 304
diff changeset
81 goto meta(context, queue->queue->Queue.take);
ec0a5b4fba05 CUDAWorker
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 304
diff changeset
82 }
ec0a5b4fba05 CUDAWorker
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 304
diff changeset
83 loopCounter->i = 0;
ec0a5b4fba05 CUDAWorker
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 304
diff changeset
84 goto meta(context, C_taskReceiveCUDAWorker);
95
3e28ee215c0e modify twice, use OSAtomiceCompareAndSwap
Shohei KOKUBO <e105744@ie.u-ryukyu.ac.jp>
parents:
diff changeset
85 }
101
8987cf13d5bb Add Allocate macro
innparusu
parents: 98
diff changeset
86
305
ec0a5b4fba05 CUDAWorker
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 304
diff changeset
87 __code odgCommitCUDA_stub(struct Context* context) {
ec0a5b4fba05 CUDAWorker
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 304
diff changeset
88 struct Context* workerContext = context->worker->worker->CUDAWorker.context;
ec0a5b4fba05 CUDAWorker
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 304
diff changeset
89 goto odgCommitCUDA(workerContext,
ec0a5b4fba05 CUDAWorker
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 304
diff changeset
90 Gearef(workerContext, LoopCounter),
ec0a5b4fba05 CUDAWorker
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 304
diff changeset
91 Gearef(workerContext, Queue),
ec0a5b4fba05 CUDAWorker
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 304
diff changeset
92 context);
98
d400948dbbab add Cuda infomation to context
ikkun
parents: 95
diff changeset
93 }
305
ec0a5b4fba05 CUDAWorker
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 304
diff changeset
94
ec0a5b4fba05 CUDAWorker
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 304
diff changeset
95 __code odgCommitCUDA1(struct TaskManager* taskManager, struct Context* task) {
ec0a5b4fba05 CUDAWorker
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 304
diff changeset
96 if(__sync_fetch_and_sub(&task->idgCount, 1)) {
ec0a5b4fba05 CUDAWorker
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 304
diff changeset
97 if(task->idgCount == 0) {
ec0a5b4fba05 CUDAWorker
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 304
diff changeset
98 taskManager->taskManager = (union Data*)task->taskManager;
ec0a5b4fba05 CUDAWorker
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 304
diff changeset
99 taskManager->context = task;
ec0a5b4fba05 CUDAWorker
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 304
diff changeset
100 taskManager->next = C_odgCommitCUDA;
ec0a5b4fba05 CUDAWorker
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 304
diff changeset
101 goto meta(context, task->taskManager->spawn);
ec0a5b4fba05 CUDAWorker
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 304
diff changeset
102 }
ec0a5b4fba05 CUDAWorker
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 304
diff changeset
103 } else {
ec0a5b4fba05 CUDAWorker
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 304
diff changeset
104 goto meta(context, C_odgCommitCUDA1);
ec0a5b4fba05 CUDAWorker
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 304
diff changeset
105 }
ec0a5b4fba05 CUDAWorker
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 304
diff changeset
106 }
227
991f3d1ce072 fix worker
ikkun
parents: 222
diff changeset
107
305
ec0a5b4fba05 CUDAWorker
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 304
diff changeset
108 __code odgCommitCUDA1_stub(struct Context* context) {
ec0a5b4fba05 CUDAWorker
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 304
diff changeset
109 struct Context* task = &Gearef(context, Queue)->data->Context;
ec0a5b4fba05 CUDAWorker
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 304
diff changeset
110 goto odgCommitCUDA1(context,
ec0a5b4fba05 CUDAWorker
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 304
diff changeset
111 Gearef(context, TaskManager),
ec0a5b4fba05 CUDAWorker
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 304
diff changeset
112 task);
ec0a5b4fba05 CUDAWorker
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 304
diff changeset
113
ec0a5b4fba05 CUDAWorker
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 304
diff changeset
114 }
ec0a5b4fba05 CUDAWorker
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 304
diff changeset
115
319
a15511b1a6e0 separate cuda.c, and USE_CUDA_MAIN_THREAD flag
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 317
diff changeset
116 extern void cudaShutdown( CUDAWorker *cudaWorker) ;
305
ec0a5b4fba05 CUDAWorker
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 304
diff changeset
117
ec0a5b4fba05 CUDAWorker
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 304
diff changeset
118 __code shutdownCUDAWorker(struct Context* context, CUDAWorker* worker) {
319
a15511b1a6e0 separate cuda.c, and USE_CUDA_MAIN_THREAD flag
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 317
diff changeset
119 cudaShutdown( worker) ;
230
a1fb3f2d1a36 fix worker
ikkun
parents: 227
diff changeset
120 }
227
991f3d1ce072 fix worker
ikkun
parents: 222
diff changeset
121
303
1dbaef86593b CUDAtwice.cbc
ikkun
parents: 302
diff changeset
122 __code shutdownCUDAWorker_stub(struct Context* context) {
305
ec0a5b4fba05 CUDAWorker
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 304
diff changeset
123 CUDAWorker* worker = (CUDAWorker *)GearImpl(context, Worker, worker);
303
1dbaef86593b CUDAtwice.cbc
ikkun
parents: 302
diff changeset
124 goto shutdownCUDAWorker(context,worker);
227
991f3d1ce072 fix worker
ikkun
parents: 222
diff changeset
125 }