Mercurial > hg > GearsTemplate
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 |
rev | line source |
---|---|
303 | 1 #include <stdio.h> |
2 #include <sys/time.h> | |
3 #include <string.h> | |
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 | 6 |
302 | 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 | 11 static void start_CUDAworker(Worker* worker); |
233 | 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 | 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 | 19 struct Worker* worker = ALLOC(context, Worker); |
305 | 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 | 24 worker->worker = (union Data*)cudaWorker; |
244 | 25 worker->tasks = queue; |
305 | 26 cudaWorker->id = id; |
313 | 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 | 37 return worker; |
38 } | |
39 | |
183 | 40 |
303 | 41 static void start_CUDAworker(Worker* worker) { |
305 | 42 CUDAWorker* cudaWorker = (CUDAWorker*)worker->worker; |
43 cudaWorker->context = NEW(struct Context); | |
44 initContext(cudaWorker->context); | |
45 Gearef(cudaWorker->context, Worker)->worker = (union Data*)worker; | |
303 | 46 |
305 | 47 goto meta(cudaWorker->context, C_taskReceiveCUDAWorker); |
233 | 48 } |
49 | |
305 | 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 | 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 | 54 } |
55 | |
302 | 56 __code taskReceiveCUDAWorker_stub(struct Context* context) { |
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 | 60 __code getTaskCUDA(struct Worker* worker, struct Context* task) { |
240 | 61 if (!task) |
236 | 62 return; // end thread |
314 | 63 worker->taskReceive = C_taskReceiveCUDAWorker; |
230 | 64 task->worker = worker; |
305 | 65 enum Code taskCg = task->next; |
66 task->next = C_odgCommitCUDA; // set CG after task exec | |
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 | 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 | 73 goto getTaskCUDA(context, worker, task); |
74 } | |
75 | |
76 __code odgCommitCUDA(struct LoopCounter* loopCounter, struct Queue* queue, struct Context* task) { | |
77 int i = loopCounter->i ; | |
78 if(task->odg + i < task->maxOdg) { | |
79 queue->queue = (union Data*)GET_WAIT_LIST(task->data[task->odg+i]); | |
80 queue->next = C_odgCommitCUDA1; | |
81 goto meta(context, queue->queue->Queue.take); | |
82 } | |
83 loopCounter->i = 0; | |
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 | 86 |
305 | 87 __code odgCommitCUDA_stub(struct Context* context) { |
88 struct Context* workerContext = context->worker->worker->CUDAWorker.context; | |
89 goto odgCommitCUDA(workerContext, | |
90 Gearef(workerContext, LoopCounter), | |
91 Gearef(workerContext, Queue), | |
92 context); | |
98 | 93 } |
305 | 94 |
95 __code odgCommitCUDA1(struct TaskManager* taskManager, struct Context* task) { | |
96 if(__sync_fetch_and_sub(&task->idgCount, 1)) { | |
97 if(task->idgCount == 0) { | |
98 taskManager->taskManager = (union Data*)task->taskManager; | |
99 taskManager->context = task; | |
100 taskManager->next = C_odgCommitCUDA; | |
101 goto meta(context, task->taskManager->spawn); | |
102 } | |
103 } else { | |
104 goto meta(context, C_odgCommitCUDA1); | |
105 } | |
106 } | |
227 | 107 |
305 | 108 __code odgCommitCUDA1_stub(struct Context* context) { |
109 struct Context* task = &Gearef(context, Queue)->data->Context; | |
110 goto odgCommitCUDA1(context, | |
111 Gearef(context, TaskManager), | |
112 task); | |
113 | |
114 } | |
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 | 117 |
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 | 120 } |
227 | 121 |
303 | 122 __code shutdownCUDAWorker_stub(struct Context* context) { |
305 | 123 CUDAWorker* worker = (CUDAWorker *)GearImpl(context, Worker, worker); |
303 | 124 goto shutdownCUDAWorker(context,worker); |
227 | 125 } |