如果不是,那么在cudaMalloc
抛出异常时释放内存的标准方法是什么?(请注意,我无法使用 Thrust。)
问问题
3961 次
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 回答