我一直在考虑在CUDA中将std :: unique_ptr与设备指针一起使用。我想知道的是,当前的c ++ 11 unique_ptr是否可以与cudaMalloc结合使用。我知道它可以与普通的malloc 一起使用(是否可以将C ++智能指针与C的malloc一起使用?),但是cudaMalloc不会在函数的return语句中返回该指针。而是,它返回一个错误代码。指针在引用中返回。
这篇博客文章推荐以下技术:
auto deleter=[&](float* ptr){ cudaFree(ptr); };
std::unique_ptr<float[], decltype(deleter)> d_in(new float[size], deleter);
cudaMalloc((void **) &d_in, size * sizeof(float));
Run Code Online (Sandbox Code Playgroud)
问题:但是,我担心这会创建永不删除(即d_in(new float[size], deleter);)的主机内存吗?除非new float[size]实际上不会生成主机内存或被覆盖?如果上述方法实际上不起作用,可以定义我自己的cudaMalloc包装器吗?-将指针传递给unique_ptr?
就像是:
void* myCudaMalloc(size_t mySize){
void * p;
checkCUDAerrorMacro(cudaMalloc((void**) &p, size);)
return p;
}
...
auto deleter=[](float* ptr){ cudaFree(ptr); };
std::unique_ptr<float[], decltype(deleter)> d_in(myCudaMalloc(size_t mySize), deleter);
Run Code Online (Sandbox Code Playgroud)