我有以下代码在我的GPU缓冲区中存储点云:
cl::Buffer writePointCloudToGPU(pcl::PointCloud<pcl::PointXYZ>& pointCloud){
cl_int err;
cl::Buffer bufferCloud(getContext(), CL_MEM_READ_WRITE, sizeof(pcl::PointXYZ) * pointCloud.size(), NULL, &err);
getQueue().enqueueWriteBuffer(bufferCloud, CL_TRUE, 0, sizeof(pcl::PointXYZ) * pointCloud.size(), const_cast<float*> (&pointCloud.points[0].x), NULL);
return bufferCloud;
}
当我返回cl :: Buffer时,这是否会导致内存泄漏问题?一旦我返回bufferCloud对象,程序何时调用release?
答案 0 :(得分:1)
<CL/cl2.hpp>
OpenCL Wrappers使用OpenCL API引用计数来跟踪您对cl::Buffer
或任何其他类型的opencl对象的使用,因此虽然我不建议只删除{{{{ 1}}或cl::Buffer &
左右(因为引用计数总是带来价格......)从逻辑上讲,复制这些类型是完全安全的:你可以把它们看作是{{1或者某些类似的构造,前提是您了解它们实际使用cl::Buffer const&
。
据我所知,其直接后果是,跨多个线程的调用不能保证引用计数。但是如果您的程序设计得当,所有对OpenCL API的调用都应该在一个专用线程上进行,这不应该是一个问题。