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
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;
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
8e7926f3e271 fix CUDAWorker
ikkun
parents: 275
diff changeset
36 worker->taskReceive = C_taskReceiveCUDAWorker;
8e7926f3e271 fix CUDAWorker
ikkun
parents: 275
diff changeset
37 worker->shutdown = C_shutdownCUDAWorker;
8e7926f3e271 fix CUDAWorker
ikkun
parents: 275
diff changeset
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
mir3636
parents: 175
diff changeset
40 }
mir3636
parents: 175
diff changeset
41
303
1dbaef86593b CUDAtwice.cbc
ikkun
parents: 302
diff changeset
42 static void start_CUDAworker(Worker* worker) {
305
ec0a5b4fba05 CUDAWorker
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 304
diff changeset
43 CUDAWorker* cudaWorker = (CUDAWorker*)worker->worker;
ec0a5b4fba05 CUDAWorker
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 304
diff changeset
44 cudaWorker->context = NEW(struct Context);
ec0a5b4fba05 CUDAWorker
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 304
diff changeset
45 initContext(cudaWorker->context);
ec0a5b4fba05 CUDAWorker
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 304
diff changeset
46 Gearef(cudaWorker->context, Worker)->worker = (union Data*)worker;
303
1dbaef86593b CUDAtwice.cbc
ikkun
parents: 302
diff changeset
47
305
ec0a5b4fba05 CUDAWorker
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 304
diff changeset
48 goto meta(cudaWorker->context, C_taskReceiveCUDAWorker);
233
06133afb3b5b create worker start_code
mir3636
parents: 232
diff changeset
49 }
06133afb3b5b create worker start_code
mir3636
parents: 232
diff changeset
50
305
ec0a5b4fba05 CUDAWorker
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 304
diff changeset
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
ec0a5b4fba05 CUDAWorker
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 304
diff changeset
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
991f3d1ce072 fix worker
ikkun
parents: 222
diff changeset
55 }
991f3d1ce072 fix worker
ikkun
parents: 222
diff changeset
56
302
8e7926f3e271 fix CUDAWorker
ikkun
parents: 275
diff changeset
57 __code taskReceiveCUDAWorker_stub(struct Context* context) {
8e7926f3e271 fix CUDAWorker
ikkun
parents: 275
diff changeset
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
ec0a5b4fba05 CUDAWorker
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 304
diff changeset
61 __code getTaskCUDA(struct Worker* worker, struct Context* task) {
240
864bb372f37f Add spawnTask1
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents: 237
diff changeset
62 if (!task)
236
865179a0a56d fix taskManager
ikkun
parents: 235
diff changeset
63 return; // end thread
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
ec0a5b4fba05 CUDAWorker
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 304
diff changeset
116
ec0a5b4fba05 CUDAWorker
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 304
diff changeset
117 __code shutdownCUDAWorker(struct Context* context, CUDAWorker* worker) {
ec0a5b4fba05 CUDAWorker
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 304
diff changeset
118 for (int i=0;i<worker->num_stream;i++)
ec0a5b4fba05 CUDAWorker
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 304
diff changeset
119 checkCudaErrors(cuStreamDestroy(worker->stream[i]));
ec0a5b4fba05 CUDAWorker
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 304
diff changeset
120 checkCudaErrors(cuCtxDestroy(worker->cuCtx));
230
a1fb3f2d1a36 fix worker
ikkun
parents: 227
diff changeset
121 }
227
991f3d1ce072 fix worker
ikkun
parents: 222
diff changeset
122
303
1dbaef86593b CUDAtwice.cbc
ikkun
parents: 302
diff changeset
123 __code shutdownCUDAWorker_stub(struct Context* context) {
305
ec0a5b4fba05 CUDAWorker
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 304
diff changeset
124 CUDAWorker* worker = (CUDAWorker *)GearImpl(context, Worker, worker);
303
1dbaef86593b CUDAtwice.cbc
ikkun
parents: 302
diff changeset
125 goto shutdownCUDAWorker(context,worker);
227
991f3d1ce072 fix worker
ikkun
parents: 222
diff changeset
126 }