C++ cudamaloc和cudaMemcpy的包装函数

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

我厌倦了查看所有用于将数据复制到设备的样板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_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?我更喜欢总是初始化变量。