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 的调用都应该发生在一个专用线程上,因此这应该不是问题。
我有以下代码在我的 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 的调用都应该发生在一个专用线程上,因此这应该不是问题。