#include #include #include #include "openClSplittingEngine.h" #include "pcloudStimulusBuffer.h" namespace smo { namespace stim_buff { OpenClSplittingEngine::OpenClSplittingEngine(PcloudStimulusBuffer& parent_) : parent(parent_), platform(nullptr), device(nullptr), context(nullptr), commandQueue(nullptr), program(nullptr), kernel(nullptr), isSetup(false), assemblyBuffer(nullptr), xyzBuffer(nullptr), intensityBuffer(nullptr) { } OpenClSplittingEngine::~OpenClSplittingEngine() { finalize(); } bool OpenClSplittingEngine::setup() { if (isSetup) { return true; } cl_int err; cl_queue_properties queueProps[] = {CL_QUEUE_PROPERTIES, 0, 0}; // Get platform cl_uint numPlatforms; err = clGetPlatformIDs(1, &platform, &numPlatforms); if (err != CL_SUCCESS || numPlatforms == 0) { std::cerr << __func__ << ": failed to get OpenCL platform: " << err << std::endl; return false; } // Get device err = clGetDeviceIDs(platform, CL_DEVICE_TYPE_GPU, 1, &device, nullptr); if (err != CL_SUCCESS) { std::cerr << __func__ << ": failed to get GPU device: " << err << std::endl; return false; } // Create context context = clCreateContext(nullptr, 1, &device, nullptr, nullptr, &err); if (err != CL_SUCCESS || !context) { std::cerr << __func__ << ": failed to create OpenCL context: " << err << std::endl; goto cleanup; } // Create command queue commandQueue = clCreateCommandQueueWithProperties( context, device, queueProps, &err); if (err != CL_SUCCESS || !commandQueue) { std::cerr << __func__ << ": failed to create command queue: " << err << std::endl; goto cleanup; } // TODO: Create program and kernel // TODO: Create buffers isSetup = true; return true; cleanup: finalize(); return false; } void OpenClSplittingEngine::finalize() { if (intensityBuffer) { clReleaseMemObject(intensityBuffer); intensityBuffer = nullptr; } if (xyzBuffer) { clReleaseMemObject(xyzBuffer); xyzBuffer = nullptr; } if (assemblyBuffer) { clReleaseMemObject(assemblyBuffer); assemblyBuffer = nullptr; } if (kernel) { clReleaseKernel(kernel); kernel = nullptr; } if (program) { clReleaseProgram(program); program = nullptr; } if (commandQueue) { clReleaseCommandQueue(commandQueue); commandQueue = nullptr; } if (context) { clReleaseContext(context); context = nullptr; } device = nullptr; platform = nullptr; isSetup = false; } } // namespace stim_buff } // namespace smo