关于标准 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,这是必需的吗?我有时会在示例中看到它,有时不会。
谢谢!
你是对的:cudaMalloc在设备上分配内存。您不能直接在主机上使用此指针,而只能作为 , 等函数的cudaMemcpy参数以及内核调用的参数。
最近的 CUDA 版本支持统一内存寻址,您可以cudaMallocManaged在那里分配设备内存,并通过设备指针直接在主机上访问它。
对于第二个问题:C++ 不允许指针类型之间的隐式转换,因此忽略显式转换(void**)&x_device将导致编译器错误。