Memory leaks clFinish()之后的Opencl clWaitEvent()导致内存泄漏

Memory leaks clFinish()之后的Opencl clWaitEvent()导致内存泄漏,memory-leaks,opencl,Memory Leaks,Opencl,由于函数clWaitEvent(),我有一些内存泄漏问题。 我使用clWaitEvent()计算内核的执行时间: ciErrNum=clEnqueueNDRangeKernel(此->命令队列,此->内核,1,NULL,&globalWorkSize,&localWorkSize,0,NULL,&prof_事件); clFinish(此->命令队列); ciErrNum=clWaitForEvents(1,&prof_事件); ciErrNum |=clGetEventProfilingInfo

由于函数clWaitEvent(),我有一些内存泄漏问题。 我使用clWaitEvent()计算内核的执行时间:

ciErrNum=clEnqueueNDRangeKernel(此->命令队列,此->内核,1,NULL,&globalWorkSize,&localWorkSize,0,NULL,&prof_事件);
clFinish(此->命令队列);
ciErrNum=clWaitForEvents(1,&prof_事件);
ciErrNum |=clGetEventProfilingInfo(prof_事件、CL_PROFILING_命令、sizeof(CL_ulong)和ev_START_时间,NULL);
ciErrNum |=clGetEventProfilingInfo(prof_事件,CL_PROFILING_命令,sizeof(CL_ulong),ev_END_时间,NULL);
ciErrNum |=clReleaseEvent(prof_事件);
oclCheckError(ciErrNum,CL_SUCCESS);
在valgrind中,我发现了一些内存泄漏,如果我对clWaitForEvents()函数进行注释,它将被删除。
我在这个方法之后释放事件,所以我不知道为什么会发生这种情况。有人有主意吗?

请在克伦奎恩德兰格内核之后再试试这个

clFinish(CommandQueue);

可能是一个糟糕的OpenCL实现你是说,OpenCL版本?我选择的平台配置文件是:PROFILE=FULL\u PROFILE VERSION=OpenCL 1.1 CUDA 6.5.14 NAME=NVIDIA CUDA VENDOR=NVIDIA Corporation EXTENSIONS=cl_khr_byte_addressable_store cl_khr_icd cl_khr_gl_共享cl_nv_编译器选项cl_nv_设备属性查询cl_nv_pragma_展开,对于我的设备是:device_NAME=GeForce GTX690 DEVICE_VENDOR=NVIDIA Corporation DEVICE_VERSION=OpenCL 1.1 CUDA DRIVER_VERSION=340.29,因此OpenCL 1.1 versionI意味着内存泄漏可能位于OpenCL库内部。OpenCL对象是引用计数对象,如果计数器降到0,则释放该对象。使用CLRELEASEVENT时,您将计数器递减1,并且由于在(提供的)代码中没有递增计数器,因此应该释放该事件。这并不是说它可能是Nvidia的OpenCL实现中的一个问题。我认为OpenCL库中没有关于这个问题的错误,因为我在web上找不到这个问题。所以我认为我犯了一个错误。你能解释一下,计数器什么时候递增吗?在我使用该事件的唯一时刻,它就出现在我发布的代码中。在本例中,您不应该需要clWaitForEvents。您只需要clFinish或clWaitForEvents。两者都应确保配置信息已准备就绪。不过,我不认为您的代码有内存泄漏的原因。