-
Notifications
You must be signed in to change notification settings - Fork 88
/
cocl_context.cpp
128 lines (107 loc) · 3.99 KB
/
cocl_context.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
// Copyright Hugh Perkins 2016, 2017
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
// http://www.apache.org/licenses/LICENSE-2.0
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
#include "cocl/cocl_context.h"
#include "cocl/hostside_opencl_funcs.h"
#include "cocl/cocl_streams.h"
#include <iostream>
#include <memory>
#include <vector>
#include <map>
#include <set>
#include "EasyCL/EasyCL.h"
using namespace std;
using namespace cocl;
using namespace easycl;
#undef COCL_PRINT
#define COCL_PRINT(x)
#define OFFSETS_32BIT_ENV_VAR "COCL_OFFSETS_32BIT"
namespace cocl {
std::mutex clcontextcreation_mutex;
Context::Context(int gpuOrdinal) : gpuOrdinal(gpuOrdinal) {
COCL_PRINT(cout << "Context() " << this << endl);
std::lock_guard< std::mutex > guard(clcontextcreation_mutex);
cocl::CoclDevice *coclDevice = cocl::getCoclDeviceByGpuOrdinal(gpuOrdinal);
cl.reset(EasyCL::createForPlatformDeviceIds(coclDevice->platformId, coclDevice->deviceId));
default_stream.reset(new CoclStream(cl.get()));
}
Context::~Context() {
COCL_PRINT(cout << "~Context() " << this << endl);
}
ContextMutex::ContextMutex(Context *context) : context(context) {
context->mu.lock();
}
ContextMutex::~ContextMutex() {
context->mu.unlock();
}
ThreadVars::ThreadVars() {
if(getenv(OFFSETS_32BIT_ENV_VAR) != 0) {
if(string(getenv(OFFSETS_32BIT_ENV_VAR)) == "1") {
cout << OFFSETS_32BIT_ENV_VAR << " enabled" << endl;
this->offsets_32bit = true;
}
}
}
ThreadVars::~ThreadVars() {
}
Context *ThreadVars::getContext() {
if(currentContext == 0) {
COCL_PRINT(cout << "creating default context" << endl);
currentContext = new Context(currentGpuOrdinal);
}
return currentContext;
}
thread_local ThreadVars *threadVars = nullptr;
ThreadVars *getThreadVars() {
if(threadVars == nullptr) {
threadVars = new ThreadVars();
}
return threadVars;
}
}
size_t cuCtxGetDevice(CUdevice *pdevice) {
COCL_PRINT(cout << "cuCtxGetDevice" << endl);
throw runtime_error("cuctxgetdevice not implemented");
return 0;
}
size_t cuCtxSynchronize(void) {
COCL_PRINT(cout << "cuCtxSynchronize" << endl);
ThreadVars *v = getThreadVars();
EasyCL *cl = v->getContext()->getCl();
cl->finish();
return 0;
}
size_t cuCtxGetCurrent(char **_ppContext) {
Context **ppContext = (Context **)_ppContext;
ThreadVars *threadVars = getThreadVars();
*ppContext = threadVars->currentContext;
COCL_PRINT(cout << "cuCtxGetCurrent context=" << (void *)threadVars->currentContext << endl);
return 0;
}
size_t cuCtxSetCurrent(char *_pContext) {
COCL_PRINT(cout << "cuCtxSetCurrent context=" << (void *)_pContext << endl);
Context *context = (Context *)_pContext;
ThreadVars *threadVars = getThreadVars();
threadVars->currentContext = context;
return 0;
}
size_t cuCtxCreate (char **_ppContext, unsigned int flags, long long device) {
COCL_PRINT(cout << "cuCtxCreate_v2 device=" << device << " flags=" << flags << endl);
Context **ppContext = (Context **)_ppContext;
Context *newContext = new Context(device);
ThreadVars *threadVars = getThreadVars();
threadVars->currentContext = newContext;
COCL_PRINT(cout << "cuCtxCreate_v2 new context=" << (void *)newContext << endl);
*ppContext = newContext;
return 0;
}
size_t cuCtxCreate_v2 (char **_ppContext, unsigned int flags, long long device) {
return cuCtxCreate(_ppContext, flags, device);
}