【问题标题】:CUDA device pointersCUDA 设备指针
【发布时间】:2015-03-23 22:20:02
【问题描述】:

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

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

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

顺便问一句,编译器没有抱怨我不用(void**)&x_device,这是必须的吗?我有时会在示例中看到它,有时不会。

谢谢!

【问题讨论】:

  • 我相信您在取消引用主机上的设备指针时不能依赖获取段错误。结果未定义,但不能保证段错误。无论结果如何,您都不应该这样做(在主机代码中取消引用设备指针)。

标签: c cuda


【解决方案1】:

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

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

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

【讨论】:

  • 我认为第二个问题的答案并不完全正确。原因是在cuda_runtime.h 中声明了cudaMalloc 的模板版本,它自动将传递给它的任何类型的指针转​​换为void**。在调用cudaMalloc(&x_device,myArraySize); 时,编译器会生成一个具有以下签名的函数定义:cudaMalloc(double**, size_t)。这就是没有编译器错误的原因。
猜你喜欢
  • 1970-01-01
  • 2011-07-18
  • 2014-03-26
  • 2013-05-20
  • 2021-07-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-06-08
相关资源
最近更新 更多