C++ cudamaloc和cudaMemcpy的包装函数
我厌倦了查看所有用于将数据复制到设备的样板cuda代码,因此我编写了以下包装函数:C++ cudamaloc和cudaMemcpy的包装函数,c++,c,cuda,C++,C,Cuda,我厌倦了查看所有用于将数据复制到设备的样板cuda代码,因此我编写了以下包装函数: void allocateAndCopyToDevice(void* device_array, const void* host_array, const size_t &count) { gpuErrchk(cudaMalloc((void**)&device_array, count)); gpuErrchk(cudaMemcpy(device_array, host_a
void allocateAndCopyToDevice(void* device_array, const void* host_array, const size_t &count)
{
gpuErrchk(cudaMalloc((void**)&device_array, count));
gpuErrchk(cudaMemcpy(device_array, host_array, count, cudaMemcpyHostToDevice));
}
但由于某些原因,每当使用以这种方式初始化的数组时,这都会导致超出范围的内存访问。我使用的初始化代码如下所示:
cuDoubleComplex *d_cmplx;
allocateAndCopyToDevice(d_cmplx,cmplx,size*sizeof(cuDoubleComplex));
cuDoubleComplex *d_cmplx;
allocateAndCopyToDevice((void **)&d_cmplx,cmplx,size*sizeof(cuDoubleComplex));
有人能解释一下为什么这不起作用吗
看到immibis的评论后,我意识到cudaMalloc需要一个指向指针的指针,因此我通过值传递指向指针的指针:
void allocateAndCopyToDevice(void** device_array, const void* host_array, const size_t &count)
{
gpuErrchk(cudaMalloc(device_array, count));
gpuErrchk(cudaMemcpy(*device_array, host_array, count, cudaMemcpyHostToDevice));
}
现在初始化如下所示:
cuDoubleComplex *d_cmplx;
allocateAndCopyToDevice(d_cmplx,cmplx,size*sizeof(cuDoubleComplex));
cuDoubleComplex *d_cmplx;
allocateAndCopyToDevice((void **)&d_cmplx,cmplx,size*sizeof(cuDoubleComplex));
它是有效的,但我仍然想知道是否有更好的方法来做到这一点?其他人如何处理cuda代码中的内存传输
template <typename T>
T* allocateAndCopyToDevice(const T* host_array, std::size_t count)
{
// some static_assert for allowed types: pod and built-in.
T* device_array = nullptr;
gpuErrchk(cudaMalloc(&device_array, count * sizeof(T)));
gpuErrchk(cudaMemcpy(device_array, host_array, count * sizeof(T), cudaMemcpyHostToDevice));
return device_array;
}
提示:为什么
void f(int x){x=42;}int main(){int j;f(j);printf(“%d\n”,j);返回0;}
not print 42?@immibis:可能是这样,因为j
没有初始化。我实际上没有通过引用传递指针。--您仍然没有通过引用传递指针。您仍在传递值,但该值恰好是void**
而不是(错误的)void*
。在C++中传递引用是指传递引用(引用不是指针)。与CUAC不相关的,不允许通过引用,仅通过值。这比我拥有的更好。为什么需要使用nullptr?我更喜欢总是初始化变量。