为什么enqueueAcquireGLObjects()在这个OpenCL代码中泄漏了内存?

时间:2014-03-07 17:04:55

标签: c++ memory memory-leaks opencl

当我在具有400K元素的循环中运行以下OpenCL代码时,内存开始泄漏。

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 ++上的最新驱动程序。

1 个答案:

答案 0 :(得分:1)

我终于设法在无数个小时试图调试问题后解决这个问题。在我看来,这个问题与NVIDIA有关。我会在这里留下我的解决方案以防万一有人遇到同样的问题。

任何时候将事件传递给这些函数之一:

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

创建一个新指针,永远不会释放。该修复程序未使用&amp; event:

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();

在排队事件后也修复了漏洞,但尚未深入测试此解决方案。

相关问题