release old OpenCL kernel before creating a new one

This commit is contained in:
Uldis Locans
2017-08-18 13:13:55 +02:00
parent 6d14df5b32
commit 74b12ebdc0

View File

@ -716,6 +716,11 @@ int OpenCLBase::ocl_copyData(cl_mem src_ptr, cl_mem dst_ptr, size_t size) {
*/ */
int OpenCLBase::ocl_createKernel(const char* kernel_name) { int OpenCLBase::ocl_createKernel(const char* kernel_name) {
cl_int ierr; cl_int ierr;
//release the old kernel
if (m_kernel != NULL)
clReleaseKernel(m_kernel);
//create a new kernel
m_kernel = clCreateKernel(m_program, kernel_name, &ierr); m_kernel = clCreateKernel(m_program, kernel_name, &ierr);
if (ierr != CL_SUCCESS) { if (ierr != CL_SUCCESS) {
DEBUG_MSG("Error creating kernel, OpenCL error: " << ierr); DEBUG_MSG("Error creating kernel, OpenCL error: " << ierr);
@ -743,25 +748,31 @@ int OpenCLBase::ocl_setKernelArg(int idx, size_t size, const void *arg_value) {
optional: work_group_size - can specify how work items are divided in work groups, optional: work_group_size - can specify how work items are divided in work groups,
if left NULL OpenCL implementation handles this part. if left NULL OpenCL implementation handles this part.
*/ */
int OpenCLBase::ocl_executeKernel(cl_uint ndim, const size_t *work_items, const size_t *work_group_size) { int OpenCLBase::ocl_executeKernel(cl_uint ndim, const size_t *work_items,
const size_t *work_group_size)
{
cl_int ierr; cl_int ierr;
cl_event tmp_event; cl_event tmp_event;
if (m_last_event == NULL) { if (m_last_event == NULL) {
ierr = clEnqueueNDRangeKernel(m_command_queue, m_kernel, ndim, NULL, work_items, work_group_size, ierr = clEnqueueNDRangeKernel(m_command_queue, m_kernel, ndim, NULL,
work_items, work_group_size,
0, NULL, &tmp_event); 0, NULL, &tmp_event);
} else { } else {
ierr = clEnqueueNDRangeKernel(m_command_queue, m_kernel, ndim, NULL, work_items, work_group_size, ierr = clEnqueueNDRangeKernel(m_command_queue, m_kernel, ndim, NULL,
work_items, work_group_size,
1, &m_last_event, &tmp_event); 1, &m_last_event, &tmp_event);
} }
clFlush(m_command_queue);
if (ierr != CL_SUCCESS) if (ierr != CL_SUCCESS)
DEBUG_MSG("Error executing kernel, OpenCL error: " << ierr DEBUG_MSG("Error executing kernel, OpenCL error: " << ierr
<< " work items: " << *work_items << ", " << " work items: " << *work_items << ", "
<< " work group: " << *work_group_size); << " work group: " << *work_group_size);
m_last_event = tmp_event; clReleaseEvent(tmp_event);
m_events.push_back(m_last_event); //m_last_event = tmp_event;
//m_events.push_back(m_last_event);
return ierr; return ierr;
} }