2014-03-07 61 views
1

当我在400K元素的循环中运行以下OpenCL代码时,内存开始泄漏。为什么在此OpenCL代码中enqueueAcquireGLObjects()泄漏内存?

std::vector<cl::Memory> cl_vbos; 
glFinish(); 
cl_vbos.push_back(cl::BufferGL(context, CL_MEM_READ_WRITE, VBOs.back(), &err)); 
queue.enqueueAcquireGLObjects(&cl_vbos, NULL, &event); 
queue.enqueueNDRangeKernel(kernel, cl::NullRange, cl::NDRange(globalWorkSize), cl::NDRange(localWorkSize), NULL, &event); 
queue.enqueueReleaseGLObjects(&cl_vbos, NULL, &event); 
glFinish(); 
queue.finish(); 

即使我不启动内核,也会泄漏内存。只有当我评论时:

queue.enqueueAcquireGLObjects(&cl_vbos, NULL, &event); 

该程序停止泄漏内存。奇怪的是,内存不是在GPU上泄漏,而是在CPU上。难道我做错了什么?忘了发布一些东西?

我正在使用NVIDIA®OpenCL 1.1以及Windows 7 64位和VC++上的最新驱动程序。

+0

你确定它是一个真正的泄漏?或者其中一个图书馆泄漏事件并没有真正泄漏到Infinity数量的内存?它看起来像在nVIDIA驱动程序方面糟糕的编程。 – DarkZeros

+0

你可以试试&cl_vbos [0]? –

回答

1

我终于设法解决这个无数小时试图调试问题。在我看来,这个问题与NVIDIA相关。我会在这里解决我的问题,以防万一任何人有这个问题。

任何时候当你传递一个事件要么这个功能:

queue.enqueueAcquireGLObjects() 
queue.enqueueNDRangeKernel() 
... 

一个新的指针被创建,永远不会被释放。此修复程序没有使用&事件:

queue.enqueueAcquireGLObjects(&cl_vbos, NULL, NULL); 
queue.enqueueNDRangeKernel(kernel, cl::NullRange, cl::NDRange(globalWorkSize), cl::NDRange(localWorkSize), NULL, NULL); 
queue.enqueueReleaseGLObjects(&cl_vbos, NULL, NULL); 

我相信使用:

event.wait(); 

排队事件后,还解决了泄漏,但没有测试过深入该解决方案还没有。

+1

无论何时,当您从OpenCL API返回事件时,您都有责任在您完成clReleaseEvent时释放它。否则你会泄漏内存。 – Dithermaster

+0

我正在使用C++绑定,理论上应该在析构函数上执行clReleaseEvent,对吗? – Luis

+1

我会跟踪并检查。 – Dithermaster