gpt4 book ai didi

c++ - CUDA:在 C++ 中包装设备内存分配

转载 作者:IT老高 更新时间:2023-10-28 22:14:10 25 4
gpt4 key购买 nike

我现在开始使用 CUDA,不得不承认我对 C API 有点失望。我理解选择 C ​​的原因,但是如果该语言是基于 C++ 的,那么几个方面会简单得多,例如设备内存分配(通过 cudaMalloc)。

我的计划是自己做这个,使用重载的 operator new 和放置 new 和 RAII(两种选择)。我想知道到目前为止是否有任何我没有注意到的警告。代码似乎可以工作,但我仍然想知道潜在的内存泄漏。

RAII代码的用法如下:

CudaArray<float> device_data(SIZE);
// Use `device_data` as if it were a raw pointer.

也许在这种情况下一个类是多余的(特别是因为你仍然必须使用 cudaMemcpy,这个类只封装了 RAII)所以另一种方法是 placement new :

float* device_data = new (cudaDevice) float[SIZE];
// Use `device_data` …
operator delete [](device_data, cudaDevice);

这里,cudaDevice 只是作为一个标签来触发重载。然而,由于在正常放置 new 中这将指示放置,我发现语法奇怪地一致,甚至可能比使用类更可取。

我会很感激各种批评。有人可能知道下一个版本的 CUDA 是否计划在这个方向上做一些事情(据我所知,这将改进其对 C++ 的支持,不管他们的意思是什么)。

所以,我的问题实际上是三方面的:

  1. 我的展示位置 new 重载在语义上是否正确?它会泄漏内存吗?
  2. 有没有人知道 future CUDA 开发朝着这个大方向发展的信息(让我们面对现实:C++ s*ck 中的 C 接口(interface))?
  3. 我怎样才能以一致的方式更进一步(还有其他 API 需要考虑,例如,不仅有设备内存,还有常量内存存储和纹理内存)?

// Singleton tag for CUDA device memory placement.
struct CudaDevice {
static CudaDevice const& get() { return instance; }
private:
static CudaDevice const instance;
CudaDevice() { }
CudaDevice(CudaDevice const&);
CudaDevice& operator =(CudaDevice const&);
} const& cudaDevice = CudaDevice::get();

CudaDevice const CudaDevice::instance;

inline void* operator new [](std::size_t nbytes, CudaDevice const&) {
void* ret;
cudaMalloc(&ret, nbytes);
return ret;
}

inline void operator delete [](void* p, CudaDevice const&) throw() {
cudaFree(p);
}

template <typename T>
class CudaArray {
public:
explicit
CudaArray(std::size_t size) : size(size), data(new (cudaDevice) T[size]) { }

operator T* () { return data; }

~CudaArray() {
operator delete [](data, cudaDevice);
}

private:
std::size_t const size;
T* const data;

CudaArray(CudaArray const&);
CudaArray& operator =(CudaArray const&);
};

关于这里使用的单例:是的,我知道它的缺点。但是,这些在这种情况下无关紧要。我在这里只需要一个不可复制的小型标签。其他所有内容(即多线程注意事项、初始化时间)均不适用。

最佳答案

与此同时,还有一些进一步的发展(不是在 CUDA API 方面,但至少在尝试使用类似 STL 的方法来管理 CUDA 数据管理的项目方面)。

最值得注意的是 NVIDIA 研究的一个项目:thrust

关于c++ - CUDA:在 C++ 中包装设备内存分配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/299761/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com