我有以下代码将点云存储在我的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对象,程序调用何时释放?
最佳答案
<CL/cl2.hpp>
OpenCL包装器使用OpenCL API引用计数来跟踪您对cl::Buffer
或任何其他类型的opencl对象的使用,因此,尽管我不建议仅删除对cl::Buffer &
或cl::Buffer const&
的所有使用(因为引用计数始终附带在其中)从逻辑上讲,复制这些类型是绝对安全的:如果您了解它们实际上并未使用std::shared_ptr<cl_mem>
,则可以将它们视为std::shared_ptr
或类似结构的包装。
据我所知,其直接后果是无法保证跨多个线程的调用的引用计数。但是,如果您的程序设计正确,则对OpenCL API的所有调用都应在单个专用线程上进行,因此这不成问题。