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
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
ec0a5b4fba05 CUDAWorker
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 304
diff changeset
7 // includes, project
ec0a5b4fba05 CUDAWorker
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 304
diff changeset
8 #include <driver_types.h>
ec0a5b4fba05 CUDAWorker
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 304
diff changeset
9 #include <cuda_runtime.h>
303
1dbaef86593b CUDAtwice.cbc
ikkun
parents: 302
diff changeset
10 #include <cuda.h>
1dbaef86593b CUDAtwice.cbc
ikkun
parents: 302
diff changeset
11 #include "helper_cuda.h"
1dbaef86593b CUDAtwice.cbc
ikkun
parents: 302
diff changeset
12
302
8e7926f3e271 fix CUDAWorker
ikkun
parents: 275
diff changeset
13 #include "../context.h"
95
3e28ee215c0e modify twice, use OSAtomiceCompareAndSwap
Shohei KOKUBO <e105744@ie.u-ryukyu.ac.jp>
parents:
diff changeset
14
303
1dbaef86593b CUDAtwice.cbc
ikkun
parents: 302
diff changeset
15 static void start_CUDAworker(Worker* worker);
233
06133afb3b5b create worker start_code
mir3636
parents: 232
diff changeset
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
06133afb3b5b create worker start_code
mir3636
parents: 232
diff changeset
18 struct Worker* worker = ALLOC(context, Worker);
305
ec0a5b4fba05 CUDAWorker
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 304
diff changeset
19 struct CUDAWorker* cudaWorker = new CUDAWorker();
ec0a5b4fba05 CUDAWorker
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 304
diff changeset
20 worker->worker = (union Data*)cudaWorker;
244
d1567718f12c Fix error
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents: 242
diff changeset
21 worker->tasks = queue;
305
ec0a5b4fba05 CUDAWorker
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 304
diff changeset
22 cudaWorker->id = id;
302
8e7926f3e271 fix CUDAWorker
ikkun
parents: 275
diff changeset
23 worker->taskReceive = C_taskReceiveCUDAWorker;
8e7926f3e271 fix CUDAWorker
ikkun
parents: 275
diff changeset
24 worker->shutdown = C_shutdownCUDAWorker;
8e7926f3e271 fix CUDAWorker
ikkun
parents: 275
diff changeset
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
mir3636
parents: 175
diff changeset
27 }
mir3636
parents: 175
diff changeset
28
303
1dbaef86593b CUDAtwice.cbc
ikkun
parents: 302
diff changeset
29 static void start_CUDAworker(Worker* worker) {
305
ec0a5b4fba05 CUDAWorker
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 304
diff changeset
30 CUDAWorker* cudaWorker = (CUDAWorker*)worker->worker;
ec0a5b4fba05 CUDAWorker
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 304
diff changeset
31 cudaWorker->context = NEW(struct Context);
ec0a5b4fba05 CUDAWorker
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 304
diff changeset
32 initContext(cudaWorker->context);
ec0a5b4fba05 CUDAWorker
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 304
diff changeset
33 Gearef(cudaWorker->context, Worker)->worker = (union Data*)worker;
ec0a5b4fba05 CUDAWorker
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 304
diff changeset
34 cudaWorker->num_stream = 1; // number of stream
303
1dbaef86593b CUDAtwice.cbc
ikkun
parents: 302
diff changeset
35
1dbaef86593b CUDAtwice.cbc
ikkun
parents: 302
diff changeset
36 // initialize and load kernel
305
ec0a5b4fba05 CUDAWorker
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 304
diff changeset
37 cudaWorker->stream = NEWN(cudaWorker->num_stream, CUstream );
303
1dbaef86593b CUDAtwice.cbc
ikkun
parents: 302
diff changeset
38 checkCudaErrors(cuInit(0));
305
ec0a5b4fba05 CUDAWorker
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 304
diff changeset
39 checkCudaErrors(cuDeviceGet(&cudaWorker->device, 0));
ec0a5b4fba05 CUDAWorker
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 304
diff changeset
40 checkCudaErrors(cuCtxCreate(&cudaWorker->cuCtx, CU_CTX_SCHED_SPIN, cudaWorker->device));
ec0a5b4fba05 CUDAWorker
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 304
diff changeset
41 if (cudaWorker->num_stream) {
ec0a5b4fba05 CUDAWorker
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 304
diff changeset
42 for (int i=0;i<cudaWorker->num_stream;i++)
ec0a5b4fba05 CUDAWorker
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 304
diff changeset
43 checkCudaErrors(cuStreamCreate(&cudaWorker->stream[i],0));
303
1dbaef86593b CUDAtwice.cbc
ikkun
parents: 302
diff changeset
44 }
1dbaef86593b CUDAtwice.cbc
ikkun
parents: 302
diff changeset
45
305
ec0a5b4fba05 CUDAWorker
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 304
diff changeset
46 goto meta(cudaWorker->context, C_taskReceiveCUDAWorker);
233
06133afb3b5b create worker start_code
mir3636
parents: 232
diff changeset
47 }
06133afb3b5b create worker start_code
mir3636
parents: 232
diff changeset
48
305
ec0a5b4fba05 CUDAWorker
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 304
diff changeset
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
ec0a5b4fba05 CUDAWorker
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 304
diff changeset
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
991f3d1ce072 fix worker
ikkun
parents: 222
diff changeset
53 }
991f3d1ce072 fix worker
ikkun
parents: 222
diff changeset
54
302
8e7926f3e271 fix CUDAWorker
ikkun
parents: 275
diff changeset
55 __code taskReceiveCUDAWorker_stub(struct Context* context) {
8e7926f3e271 fix CUDAWorker
ikkun
parents: 275
diff changeset
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
ec0a5b4fba05 CUDAWorker
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 304
diff changeset
59 __code getTaskCUDA(struct Worker* worker, struct Context* task) {
240
864bb372f37f Add spawnTask1
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents: 237
diff changeset
60 if (!task)
236
865179a0a56d fix taskManager
ikkun
parents: 235
diff changeset
61 return; // end thread
230
a1fb3f2d1a36 fix worker
ikkun
parents: 227
diff changeset
62 task->worker = worker;
305
ec0a5b4fba05 CUDAWorker
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 304
diff changeset
63 enum Code taskCg = task->next;
ec0a5b4fba05 CUDAWorker
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 304
diff changeset
64 task->next = C_odgCommitCUDA; // set CG after task exec
ec0a5b4fba05 CUDAWorker
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 304
diff changeset
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
ec0a5b4fba05 CUDAWorker
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 304
diff changeset
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
ec0a5b4fba05 CUDAWorker
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 304
diff changeset
71 goto getTaskCUDA(context, worker, task);
ec0a5b4fba05 CUDAWorker
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 304
diff changeset
72 }
ec0a5b4fba05 CUDAWorker
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 304
diff changeset
73
ec0a5b4fba05 CUDAWorker
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 304
diff changeset
74 __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
75 int i = loopCounter->i ;
ec0a5b4fba05 CUDAWorker
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 304
diff changeset
76 if(task->odg + i < task->maxOdg) {
ec0a5b4fba05 CUDAWorker
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 304
diff changeset
77 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
78 queue->next = C_odgCommitCUDA1;
ec0a5b4fba05 CUDAWorker
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 304
diff changeset
79 goto meta(context, queue->queue->Queue.take);
ec0a5b4fba05 CUDAWorker
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 304
diff changeset
80 }
ec0a5b4fba05 CUDAWorker
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 304
diff changeset
81 loopCounter->i = 0;
ec0a5b4fba05 CUDAWorker
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 304
diff changeset
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
8987cf13d5bb Add Allocate macro
innparusu
parents: 98
diff changeset
84
305
ec0a5b4fba05 CUDAWorker
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 304
diff changeset
85 __code odgCommitCUDA_stub(struct Context* context) {
ec0a5b4fba05 CUDAWorker
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 304
diff changeset
86 struct Context* workerContext = context->worker->worker->CUDAWorker.context;
ec0a5b4fba05 CUDAWorker
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 304
diff changeset
87 goto odgCommitCUDA(workerContext,
ec0a5b4fba05 CUDAWorker
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 304
diff changeset
88 Gearef(workerContext, LoopCounter),
ec0a5b4fba05 CUDAWorker
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 304
diff changeset
89 Gearef(workerContext, Queue),
ec0a5b4fba05 CUDAWorker
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 304
diff changeset
90 context);
98
d400948dbbab add Cuda infomation to context
ikkun
parents: 95
diff changeset
91 }
305
ec0a5b4fba05 CUDAWorker
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 304
diff changeset
92
ec0a5b4fba05 CUDAWorker
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 304
diff changeset
93 __code odgCommitCUDA1(struct TaskManager* taskManager, struct Context* task) {
ec0a5b4fba05 CUDAWorker
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 304
diff changeset
94 if(__sync_fetch_and_sub(&task->idgCount, 1)) {
ec0a5b4fba05 CUDAWorker
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 304
diff changeset
95 if(task->idgCount == 0) {
ec0a5b4fba05 CUDAWorker
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 304
diff changeset
96 taskManager->taskManager = (union Data*)task->taskManager;
ec0a5b4fba05 CUDAWorker
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 304
diff changeset
97 taskManager->context = task;
ec0a5b4fba05 CUDAWorker
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 304
diff changeset
98 taskManager->next = C_odgCommitCUDA;
ec0a5b4fba05 CUDAWorker
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 304
diff changeset
99 goto meta(context, task->taskManager->spawn);
ec0a5b4fba05 CUDAWorker
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 304
diff changeset
100 }
ec0a5b4fba05 CUDAWorker
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 304
diff changeset
101 } else {
ec0a5b4fba05 CUDAWorker
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 304
diff changeset
102 goto meta(context, C_odgCommitCUDA1);
ec0a5b4fba05 CUDAWorker
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 304
diff changeset
103 }
ec0a5b4fba05 CUDAWorker
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 304
diff changeset
104 }
227
991f3d1ce072 fix worker
ikkun
parents: 222
diff changeset
105
305
ec0a5b4fba05 CUDAWorker
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 304
diff changeset
106 __code odgCommitCUDA1_stub(struct Context* context) {
ec0a5b4fba05 CUDAWorker
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 304
diff changeset
107 struct Context* task = &Gearef(context, Queue)->data->Context;
ec0a5b4fba05 CUDAWorker
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 304
diff changeset
108 goto odgCommitCUDA1(context,
ec0a5b4fba05 CUDAWorker
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 304
diff changeset
109 Gearef(context, TaskManager),
ec0a5b4fba05 CUDAWorker
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 304
diff changeset
110 task);
ec0a5b4fba05 CUDAWorker
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 304
diff changeset
111
ec0a5b4fba05 CUDAWorker
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 304
diff changeset
112 }
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 __code shutdownCUDAWorker(struct Context* context, CUDAWorker* worker) {
ec0a5b4fba05 CUDAWorker
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 304
diff changeset
116 for (int i=0;i<worker->num_stream;i++)
ec0a5b4fba05 CUDAWorker
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 304
diff changeset
117 checkCudaErrors(cuStreamDestroy(worker->stream[i]));
ec0a5b4fba05 CUDAWorker
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 304
diff changeset
118 checkCudaErrors(cuCtxDestroy(worker->cuCtx));
230
a1fb3f2d1a36 fix worker
ikkun
parents: 227
diff changeset
119 }
227
991f3d1ce072 fix worker
ikkun
parents: 222
diff changeset
120
303
1dbaef86593b CUDAtwice.cbc
ikkun
parents: 302
diff changeset
121 __code shutdownCUDAWorker_stub(struct Context* context) {
305
ec0a5b4fba05 CUDAWorker
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 304
diff changeset
122 CUDAWorker* worker = (CUDAWorker *)GearImpl(context, Worker, worker);
303
1dbaef86593b CUDAtwice.cbc
ikkun
parents: 302
diff changeset
123 goto shutdownCUDAWorker(context,worker);
227
991f3d1ce072 fix worker
ikkun
parents: 222
diff changeset
124 }