【发布时间】:2017-03-27 04:58:40
【问题描述】:
我刚开始尝试再次学习 CUDA,遇到了一些我不完全理解的代码。
// declare GPU memory pointers
float * d_in;
float * d_out;
// allocate GPU memory
cudaMalloc((void**) &d_in, ARRAY_BYTES);
cudaMalloc((void**) &d_out, ARRAY_BYTES);
在声明 GPU 内存指针时,它们会在主机上分配内存。 cudaMalloc 调用丢弃了 d_in 和 d_out 是指向浮点数的指针的信息。
我想不出为什么 cudaMalloc 需要知道 d_in 和 d_out 最初存储在主机内存中的位置。甚至不清楚为什么我需要使用主机字节来存储 d_in 和 d_out 指向的任何主机地址。
那么,在宿主机上原始变量声明的目的是什么?
================================================ ========================
我认为这样的事情会更有意义:
// declare GPU memory pointers
cudaFloat * d_in;
cudaFloat * d_out;
// allocate GPU memory
cudaMalloc((void**) &d_in, ARRAY_BYTES);
cudaMalloc((void**) &d_out, ARRAY_BYTES);
这样,与 GPU 相关的一切都在 GPU 上进行。如果在主机代码中意外使用了d_in 或d_out,则可能会在编译时引发错误,因为这些变量不会在主机上定义。
我想我也感到困惑的是,通过在主机上存储设备内存地址,感觉设备并没有完全负责管理自己的内存。感觉主机代码存在意外覆盖d_in 或d_out 的值的风险,或者通过在主机代码中意外分配给它们或另一个更微妙的错误,这可能导致GPU 无法访问自己的内存。此外,分配给d_in 和d_out 的地址是由主机而不是设备选择的,这似乎很奇怪。为什么主机应该知道设备上哪些地址可用/不可用?
我在这里有什么不明白的地方?
【问题讨论】:
标签: cuda