CUDA设备指针

CUDA设备指针,c,cuda,C,Cuda,关于标准CUDA内存分配模型的快速问题: double* x_device; cudaMalloc(&x_device,myArraySize); 变量x\u device是指向double的指针。在我调用cudaMalloc之后,x_设备现在是否指向cuda设备上的内存位置?因此,换句话说,*x_设备将导致SEGFULT,因为我们无法直接从主机访问设备内存 附带的问题,编译器没有抱怨我没有使用(void**)和x_设备,这是必需的吗?我有时在例子中看到,有时没有 谢谢 你说得对:cu

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

double* x_device;
cudaMalloc(&x_device,myArraySize);
变量
x\u device
是指向double的指针。在我调用cudaMalloc之后,x_设备现在是否指向cuda设备上的内存位置?因此,换句话说,
*x_设备
将导致SEGFULT,因为我们无法直接从主机访问设备内存

附带的问题,编译器没有抱怨我没有使用
(void**)和x_设备
,这是必需的吗?我有时在例子中看到,有时没有


谢谢

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

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


第二个问题:C++不允许指针类型之间隐式转换,因此,忽略显式的CAST <代码>(Vult**)和Xi设备< /代码>会导致编译器错误。

我相信在主机上的去引用设备指针时,不能依赖于获取SeGebug。结果未定义,但不能保证SEGFULT。无论结果如何,您都不应该这样做(在主机代码中取消对设备指针的引用)。我认为第二个问题的答案并不完全正确。原因是在
cuda_runtime.h
中声明了
cudamaloc
的模板版本,它会自动将传递给它的任何类型的指针强制转换为
void**
。调用
cudaMalloc(&x_设备,myArraySize)时,编译器生成具有以下签名的函数定义:
cudamaloc(double**,size\u t)
。这就是为什么没有编译器错误。