CUDA 设备指针

icu*_*ys1 5 c cuda

关于标准 CUDA 内存分配模型的快速问题:

double* x_device;
cudaMalloc(&x_device,myArraySize);
Run Code Online (Sandbox Code Playgroud)

该变量x_device是一个指向双精度的指针。在我调用 cudaMalloc 之后,x_device 现在是否指向cuda 设备上的内存位置?因此,换句话说,*x_device会导致段错误,因为我们无法直接从主机访问设备内存。

附带问题,编译器没有抱怨我不使用(void**)&x_device,这是必需的吗?我有时会在示例中看到它,有时不会。

谢谢!

roe*_*and 5

你是对的:cudaMalloc在设备上分配内存。您不能直接在主机上使用此指针,而只能作为 , 等函数的cudaMemcpy参数以及内核调用的参数。

最近的 CUDA 版本支持统一内存寻址,您可以cudaMallocManaged在那里分配设备内存,并通过设备指针直接在主机上访问它。

对于第二个问题:C++ 不允许指针类型之间的隐式转换,因此忽略显式转换(void**)&x_device将导致编译器错误。

  • 我认为第二个问题的答案并不完全正确。原因是在“cuda_runtime.h”中声明了“cudaMalloc”的模板版本,它会自动将传递给它的任何类型的指针转​​换为“void**”。当调用“cudaMalloc(&x_device,myArraySize);”时,编译器会生成具有以下签名的函数定义:“cudaMalloc(double**, size_t)”。这就是为什么没有编译器错误。 (2认同)