Mercurial > hg > Members > Moririn
annotate src/parallel_execution/CUDAWorker.cbc @ 305:ec0a5b4fba05
CUDAWorker
author | Shinji KONO <kono@ie.u-ryukyu.ac.jp> |
---|---|
date | Tue, 14 Feb 2017 12:15:58 +0900 |
parents | 9755206813cb |
children | 7dd5a7d52a67 |
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; |
302 | 23 worker->taskReceive = C_taskReceiveCUDAWorker; |
24 worker->shutdown = C_shutdownCUDAWorker; | |
25 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
|
26 return worker; |
183 | 27 } |
28 | |
303 | 29 static void start_CUDAworker(Worker* worker) { |
305 | 30 CUDAWorker* cudaWorker = (CUDAWorker*)worker->worker; |
31 cudaWorker->context = NEW(struct Context); | |
32 initContext(cudaWorker->context); | |
33 Gearef(cudaWorker->context, Worker)->worker = (union Data*)worker; | |
34 cudaWorker->num_stream = 1; // number of stream | |
303 | 35 |
36 // initialize and load kernel | |
305 | 37 cudaWorker->stream = NEWN(cudaWorker->num_stream, CUstream ); |
303 | 38 checkCudaErrors(cuInit(0)); |
305 | 39 checkCudaErrors(cuDeviceGet(&cudaWorker->device, 0)); |
40 checkCudaErrors(cuCtxCreate(&cudaWorker->cuCtx, CU_CTX_SCHED_SPIN, cudaWorker->device)); | |
41 if (cudaWorker->num_stream) { | |
42 for (int i=0;i<cudaWorker->num_stream;i++) | |
43 checkCudaErrors(cuStreamCreate(&cudaWorker->stream[i],0)); | |
303 | 44 } |
45 | |
305 | 46 goto meta(cudaWorker->context, C_taskReceiveCUDAWorker); |
233 | 47 } |
48 | |
305 | 49 __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
|
50 queue->queue = (union Data*)worker->tasks; |
305 | 51 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
|
52 goto meta(context, worker->tasks->take); |
227 | 53 } |
54 | |
302 | 55 __code taskReceiveCUDAWorker_stub(struct Context* context) { |
56 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
|
57 } |
77faa28128b4
Add taskSend for TaskManager
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents:
217
diff
changeset
|
58 |
305 | 59 __code getTaskCUDA(struct Worker* worker, struct Context* task) { |
240 | 60 if (!task) |
236 | 61 return; // end thread |
230 | 62 task->worker = worker; |
305 | 63 enum Code taskCg = task->next; |
64 task->next = C_odgCommitCUDA; // set CG after task exec | |
65 goto meta(task, taskCg); | |
169
ea7b11f3e717
Using Queue Interface
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents:
149
diff
changeset
|
66 } |
109
059b26a250cc
Change put_queue process
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents:
103
diff
changeset
|
67 |
305 | 68 __code getTaskCUDA_stub(struct Context* context) { |
247
ce262b2c1daf
Fix createTask for main
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents:
244
diff
changeset
|
69 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
|
70 struct Context* task = &Gearef(context, Queue)->data->Context; |
305 | 71 goto getTaskCUDA(context, worker, task); |
72 } | |
73 | |
74 __code odgCommitCUDA(struct LoopCounter* loopCounter, struct Queue* queue, struct Context* task) { | |
75 int i = loopCounter->i ; | |
76 if(task->odg + i < task->maxOdg) { | |
77 queue->queue = (union Data*)GET_WAIT_LIST(task->data[task->odg+i]); | |
78 queue->next = C_odgCommitCUDA1; | |
79 goto meta(context, queue->queue->Queue.take); | |
80 } | |
81 loopCounter->i = 0; | |
82 goto meta(context, C_taskReceiveCUDAWorker); | |
95
3e28ee215c0e
modify twice, use OSAtomiceCompareAndSwap
Shohei KOKUBO <e105744@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
83 } |
101 | 84 |
305 | 85 __code odgCommitCUDA_stub(struct Context* context) { |
86 struct Context* workerContext = context->worker->worker->CUDAWorker.context; | |
87 goto odgCommitCUDA(workerContext, | |
88 Gearef(workerContext, LoopCounter), | |
89 Gearef(workerContext, Queue), | |
90 context); | |
98 | 91 } |
305 | 92 |
93 __code odgCommitCUDA1(struct TaskManager* taskManager, struct Context* task) { | |
94 if(__sync_fetch_and_sub(&task->idgCount, 1)) { | |
95 if(task->idgCount == 0) { | |
96 taskManager->taskManager = (union Data*)task->taskManager; | |
97 taskManager->context = task; | |
98 taskManager->next = C_odgCommitCUDA; | |
99 goto meta(context, task->taskManager->spawn); | |
100 } | |
101 } else { | |
102 goto meta(context, C_odgCommitCUDA1); | |
103 } | |
104 } | |
227 | 105 |
305 | 106 __code odgCommitCUDA1_stub(struct Context* context) { |
107 struct Context* task = &Gearef(context, Queue)->data->Context; | |
108 goto odgCommitCUDA1(context, | |
109 Gearef(context, TaskManager), | |
110 task); | |
111 | |
112 } | |
113 | |
114 | |
115 __code shutdownCUDAWorker(struct Context* context, CUDAWorker* worker) { | |
116 for (int i=0;i<worker->num_stream;i++) | |
117 checkCudaErrors(cuStreamDestroy(worker->stream[i])); | |
118 checkCudaErrors(cuCtxDestroy(worker->cuCtx)); | |
230 | 119 } |
227 | 120 |
303 | 121 __code shutdownCUDAWorker_stub(struct Context* context) { |
305 | 122 CUDAWorker* worker = (CUDAWorker *)GearImpl(context, Worker, worker); |
303 | 123 goto shutdownCUDAWorker(context,worker); |
227 | 124 } |