1#include "Base/OpenCL/ComputeKernel.h"
5static void OnError(std::string message)
7 std::cout <<
"OpenCL Error : " << message << std::endl;
10static void OnStatus(std::string message)
12 std::cout <<
"OpenCL Status : " << message << std::endl;
15ComputeKernel::ComputeKernel()
20ComputeKernel::~ComputeKernel()
24ComputeKernel::ComputeKernel(std::function<
void(std::string)> errFunc, std::function<
void(std::string)> statusFunc)
27 onStatus = statusFunc;
28 std::vector<cl::Platform> platforms;
29 cl::Platform::get(&platforms);
31 if (platforms.size() == 0)
33 onError(
"No Platform found supporting OpenCL!");
37 platform = platforms[0];
38 onStatus(
"Using OpenCL Platform : " + platform.getInfo<CL_PLATFORM_NAME>() );
39 std::vector<cl::Device> devices;
40 platform.getDevices(CL_DEVICE_TYPE_ALL, &devices);
42 if (devices.size() == 0)
44 onError(
"No Device found supporting OpenCL!");
50 for (
auto &d : devices)
52 tmp = (d.getInfo<CL_DEVICE_TYPE>() == CL_DEVICE_TYPE_GPU);
57 onStatus(
"Using GPU Device : " + device.getInfo<CL_DEVICE_NAME>());
65 onStatus(
"Using CPU Device : " + device.getInfo<CL_DEVICE_NAME>());
68 context = cl::Context({device});
69 queue = cl::CommandQueue(context, device);
72void ComputeKernel::AddSoruce(std::string source)
74 sources.push_back({source.c_str(), source.size()});
77void ComputeKernel::BuildProgram(std::string options)
79 program = cl::Program(context, sources);
81 if (program.build({ device }, options.c_str()) != CL_SUCCESS)
83 onStatus(
"Error Building : " + program.getBuildInfo<CL_PROGRAM_BUILD_LOG>(device));
88void ComputeKernel::AddKernel(std::string name)
90 kernels[name] = cl::Kernel(program, name.c_str());
93void ComputeKernel::Clear()
99void ComputeKernel::ExecuteKernel(std::string name, cl::NDRange local, cl::NDRange global)
101 queue.enqueueNDRangeKernel(kernels[name], cl::NullRange, global, local);
105void ComputeKernel::CreateBuffer(std::string name,
int type,
size_t size)
109 buffer.buffer = cl::Buffer(context, type, size);
110 buffers[name] = buffer;
113void ComputeKernel::SetKernelArg(std::string name,
int arg, std::string buffer)
115 kernels[name].setArg(arg, buffers[buffer].buffer);
118void ComputeKernel::ReadBuffer(std::string buffer,
bool blocking,
size_t size,
void *data)
120 queue.enqueueReadBuffer(buffers[buffer].buffer, blocking ? CL_TRUE : CL_FALSE, 0, size, data);
123void ComputeKernel::WriteBuffer(std::string buffer,
bool blocking,
size_t size,
void *data)
125 queue.enqueueWriteBuffer(buffers[buffer].buffer, blocking ? CL_TRUE : CL_FALSE, 0, size, data);