我有以下代码将点云存储在我的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的所有调用都应在单个专用线程上进行,因此这不成问题。

10-06 09:58