OpenCL/C++ - 返回一个 cl::Buffer 对象

OpenCL/C++ - Returning a cl::Buffer object

我有以下代码在我的 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;
}

当我 return a cl::Buffer 时,这会导致内存泄漏问题吗?一旦我 return 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 的调用都应该发生在一个专用线程上,因此这应该不是问题。