8

如果不是,那么在cudaMalloc抛出异常时释放内存的标准方法是什么?(请注意,我无法使用 Thrust。)

4

2 回答 2

9

您可以使用RAII习语并将您的cudaMalloc()cudaFree()调用分别放入对象的构造函数和析构函数。

一旦抛出异常,您的析构函数将被调用,这将释放分配的内存。

如果你把这个对象包装成一个智能指针(或者让它表现得像一个指针),你将得到你的 CUDA 智能指针。

于 2013-08-21T12:42:50.693 回答
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),因此如果您的应用程序需要,它会很容易操作。

于 2020-12-17T11:43:26.533 回答