Mercurial > hg > Members > Moririn
annotate src/parallel_execution/CUDAWorker.cbc @ 312:7dd5a7d52a67
USE_CUDAWorker flag only for CUDAtwice
author | Shinji KONO <kono@ie.u-ryukyu.ac.jp> |
---|---|
date | Wed, 15 Feb 2017 11:04:30 +0900 |
parents | ec0a5b4fba05 |
children | 4addbc7469ee |
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 |
7 // includes, project | |
8 #include <driver_types.h> | |
9 #include <cuda_runtime.h> | |
303 | 10 #include <cuda.h> |
11 #include "helper_cuda.h" | |
12 | |
302 | 13 #include "../context.h" |
95
3e28ee215c0e
modify twice, use OSAtomiceCompareAndSwap
Shohei KOKUBO <e105744@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
14 |
303 | 15 static void start_CUDAworker(Worker* worker); |
233 | 16 |
304
9755206813cb
helper_string.h for ANSI C
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
303
diff
changeset
|
17 Worker* createCUDAWorker(struct Context* context, int id, Queue* queue) { |
233 | 18 struct Worker* worker = ALLOC(context, Worker); |
305 | 19 struct CUDAWorker* cudaWorker = new CUDAWorker(); |
20 worker->worker = (union Data*)cudaWorker; | |
244 | 21 worker->tasks = queue; |
305 | 22 cudaWorker->id = id; |
312
7dd5a7d52a67
USE_CUDAWorker flag only for CUDAtwice
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
305
diff
changeset
|
23 |
7dd5a7d52a67
USE_CUDAWorker flag only for CUDAtwice
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
305
diff
changeset
|
24 // initialize and load kernel |
7dd5a7d52a67
USE_CUDAWorker flag only for CUDAtwice
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
305
diff
changeset
|
25 cudaWorker->num_stream = 1; // number of stream |
7dd5a7d52a67
USE_CUDAWorker flag only for CUDAtwice
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
305
diff
changeset
|
26 cudaWorker->stream = NEWN(cudaWorker->num_stream, CUstream ); |
7dd5a7d52a67
USE_CUDAWorker flag only for CUDAtwice
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
305
diff
changeset
|
27 checkCudaErrors(cuInit(0)); |
7dd5a7d52a67
USE_CUDAWorker flag only for CUDAtwice
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
305
diff
changeset
|
28 checkCudaErrors(cuDeviceGet(&cudaWorker->device, 0)); |
7dd5a7d52a67
USE_CUDAWorker flag only for CUDAtwice
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
305
diff
changeset
|
29 checkCudaErrors(cuCtxCreate(&cudaWorker->cuCtx, CU_CTX_SCHED_SPIN, cudaWorker->device)); |
7dd5a7d52a67
USE_CUDAWorker flag only for CUDAtwice
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
305
diff
changeset
|
30 |
7dd5a7d52a67
USE_CUDAWorker flag only for CUDAtwice
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
305
diff
changeset
|
31 if (cudaWorker->num_stream) { |
7dd5a7d52a67
USE_CUDAWorker flag only for CUDAtwice
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
305
diff
changeset
|
32 for (int i=0;i<cudaWorker->num_stream;i++) |
7dd5a7d52a67
USE_CUDAWorker flag only for CUDAtwice
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
305
diff
changeset
|
33 checkCudaErrors(cuStreamCreate(&cudaWorker->stream[i],0)); |
7dd5a7d52a67
USE_CUDAWorker flag only for CUDAtwice
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
305
diff
changeset
|
34 } |
7dd5a7d52a67
USE_CUDAWorker flag only for CUDAtwice
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
305
diff
changeset
|
35 |
302 | 36 worker->taskReceive = C_taskReceiveCUDAWorker; |
37 worker->shutdown = C_shutdownCUDAWorker; | |
38 pthread_create(&worker->worker->CUDAWorker.thread, NULL, (void*)&start_CUDAworker, worker); | |
304
9755206813cb
helper_string.h for ANSI C
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
303
diff
changeset
|
39 return worker; |
183 | 40 } |
41 | |
303 | 42 static void start_CUDAworker(Worker* worker) { |
305 | 43 CUDAWorker* cudaWorker = (CUDAWorker*)worker->worker; |
44 cudaWorker->context = NEW(struct Context); | |
45 initContext(cudaWorker->context); | |
46 Gearef(cudaWorker->context, Worker)->worker = (union Data*)worker; | |
303 | 47 |
305 | 48 goto meta(cudaWorker->context, C_taskReceiveCUDAWorker); |
233 | 49 } |
50 | |
305 | 51 __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
|
52 queue->queue = (union Data*)worker->tasks; |
305 | 53 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
|
54 goto meta(context, worker->tasks->take); |
227 | 55 } |
56 | |
302 | 57 __code taskReceiveCUDAWorker_stub(struct Context* context) { |
58 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
|
59 } |
77faa28128b4
Add taskSend for TaskManager
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents:
217
diff
changeset
|
60 |
305 | 61 __code getTaskCUDA(struct Worker* worker, struct Context* task) { |
240 | 62 if (!task) |
236 | 63 return; // end thread |
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 | |
116 | |
117 __code shutdownCUDAWorker(struct Context* context, CUDAWorker* worker) { | |
118 for (int i=0;i<worker->num_stream;i++) | |
119 checkCudaErrors(cuStreamDestroy(worker->stream[i])); | |
120 checkCudaErrors(cuCtxDestroy(worker->cuCtx)); | |
230 | 121 } |
227 | 122 |
303 | 123 __code shutdownCUDAWorker_stub(struct Context* context) { |
305 | 124 CUDAWorker* worker = (CUDAWorker *)GearImpl(context, Worker, worker); |
303 | 125 goto shutdownCUDAWorker(context,worker); |
227 | 126 } |