CUDA设备指针

6

关于标准的CUDA内存分配模型,有一个简短的问题:

double* x_device;
cudaMalloc(&x_device,myArraySize);

变量x_device是一个指向双精度浮点数的指针。在我调用cudaMalloc之后,x_device现在指向cuda设备上的内存位置吗?换句话说,*x_device会导致段错误,因为我们无法直接从主机访问设备内存。
顺带一提,编译器没有抱怨我没有使用(void**)&x_device,这是必需的吗?我有时在示例中看到它,有时不看到。
谢谢!

3
我认为你不能依靠在主机上对设备指针进行解引用而出现段错误。结果是未定义的,但不能保证会出现段错误。无论结果如何,你都绝对不应该这样做(在主机代码中解引用设备指针)。 - void_ptr
1个回答

6

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

较新的CUDA版本支持统一内存寻址,因此您可以使用cudaMallocManaged来分配设备内存,并通过设备指针直接在主机上访问它。

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


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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接