当我在具有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 ++上的最新驱动程序。
答案 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();
在排队事件后也修复了漏洞,但尚未深入测试此解决方案。