-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathbaseProcessor.cpp
More file actions
58 lines (49 loc) · 1.52 KB
/
Copy pathbaseProcessor.cpp
File metadata and controls
58 lines (49 loc) · 1.52 KB
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
#include "baseProcessor.h"
bool BaseProcessor::firstTime = true;
void (BaseProcessor::* BaseProcessor::uploadFunc)(const unsigned char*) = nullptr;
void (BaseProcessor::* BaseProcessor::downloadFunc)(unsigned char*) const = nullptr;
void BaseProcessor::allocateCUDA() {
cudaMallocAsync(&d_img, imgSize, m_cudaStream);
}
void BaseProcessor::allocateOpenCL() {
cl_int err;
m_imgBuf = clCreateBuffer(globalContextOpenCL, CL_MEM_READ_WRITE, imgSize, nullptr, &err);
}
void BaseProcessor::uploadCUDA(const unsigned char* Src) {
cudaMemcpyAsync(d_img, Src, imgSize, cudaMemcpyHostToDevice, m_cudaStream);
}
void BaseProcessor::uploadOpenCL(const unsigned char* Src) {
clEnqueueWriteBuffer(globalQueueOpenCL,
m_imgBuf,
CL_FALSE,
0,
imgSize,
Src,
0, nullptr, nullptr);
}
void BaseProcessor::downloadCUDA(unsigned char* Dst) const {
cudaMemcpyAsync(Dst, d_img, imgSize, cudaMemcpyDeviceToHost, m_cudaStream);
cudaStreamSynchronize(m_cudaStream);
}
void BaseProcessor::downloadOpenCL(unsigned char* Dst) const {
clEnqueueReadBuffer(globalQueueOpenCL,
m_imgBuf,
CL_TRUE, // Blocking read
0,
imgSize,
Dst,
0, nullptr, nullptr);
}
void BaseProcessor::init() {
if (BaseProcessor::firstTime) {
if (isCudaAvailable()) {
BaseProcessor::uploadFunc = &BaseProcessor::uploadCUDA;
BaseProcessor::downloadFunc = &BaseProcessor::downloadCUDA;
}
else {
BaseProcessor::uploadFunc = &BaseProcessor::uploadOpenCL;
BaseProcessor::downloadFunc = &BaseProcessor::downloadOpenCL;
}
BaseProcessor::firstTime = false;
}
}