有CUDA智能指针吗?

12

如果不能使用Thrust,当抛出异常时,释放cudaMalloc的内存有标准方法吗?


会抛出异常的是什么? - talonmies
任何函数或类成员 - 例如许多事物 - mchen
我的意思是,主机代码是否会响应CUDA运行时的错误而抛出异常,还是这些其他错误条件与CUDA无关? - talonmies
@MiloChen,我可以问一下,在哪些情况下需要在异常后释放GPU内存吗?我猜测是当异常不中止程序时,对吗?在你的情况下什么时候会发生这种情况? - Vitality
1
cudaMalloc() 的对应免费操作是 cudaFree()。在将指针传递给 cudaFree 之前,测试指针是否不为 NULL 也很常见,但并非所有情况都需要。 - Robert Crovella
4
您可以将cudaFree()调用放在清理函数中,当您捕获主机代码中的异常时,该函数将被调用。然而,您应该如何处理这些异常取决于您想要实现的目标,如果没有更多细节,我们将无法为您提供帮助。 - BenC
2个回答

15

你可以使用 RAII 惯用语,将你的cudaMalloc()cudaFree()调用分别放在对象的构造函数和析构函数中。

一旦发生异常,你的析构函数将被调用,会释放已分配的内存。

如果你将这个对象包装到智能指针中(或使其像指针一样工作),你将得到 CUDA 智能指针。


4
你可以使用自定义的 cuda::shared_ptr 实现。如上所述,此实现将 std::shared_ptr 用作 CUDA 设备内存的包装器。

用法示例:

std::shared_ptr<T[]> data_host =  std::shared_ptr<T[]>(new T[n]);
.
.
.

// In host code:
fun::cuda::shared_ptr<T> data_dev;
data_dev->upload(data_host.get(), n);
// In .cu file:
// data_dev.data() points to device memory which contains data_host;
 

这个仓库确实只有一个头文件 (cudasharedptr.h),所以如果需要的话,对它进行操作将非常容易。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接