【问题标题】:Do you need to allocate memory to operate on an array in CUDA? [closed]您是否需要分配内存才能在 CUDA 中对数组进行操作? [关闭]
【发布时间】:2019-04-02 23:15:48
【问题描述】:

我见过 CUDA 程序,您在设备上分配内存,对其进行操作,然后将其复制回主机,如下所示:

float* h_a = (float*) malloc(numBytes);
float* d_a = 0;
cudaMalloc((void**) &a, numBytes);
cuda_function<<< N/blockSize, blockSize>>>(d_a);
cudaMemcpy(d_a, h_a, numBytes, cudaMemcpyDeviceToHost);

但是我也看到了 CUDA 程序仅在其引用被传递给它的内存上运行的代码,如下所示:

__global__ void cuda_function(int* a)
{
  ...<operate on a>...
}

int main()
{
  cuda_function<<<N/256, 256>>>(a)
}

这两种方法有什么不同?

谢谢!

【问题讨论】:

  • 您可能需要考虑一个基本的 C 教程。存在设备和主机内存的事实是一个特殊的 CUDA 功能,但您要问的是 C、内存管理和指针的基本基础
  • 区别在于一个可以工作,一个不能。我将把它作为练习留给读者来猜测哪个是哪个.....

标签: c parallel-processing cuda


【解决方案1】:

无论如何,您都必须在设备上分配内存。您可以自己直接管理内存,使用 cudaMalloc 之类的东西,或者允许使用 cudaMallocManaged 为您管理内存。

在第一种方法中,您必须使用cudaMemcpy 将内存复制到设备或从设备复制内存。然后,您将指向设备内存的指针(由cudaMalloc 提供给您)作为参数传递给内核。

第二种方法使用统一内存,您不必手动将数据移入或移出 GPU。当它被访问时,它将被分页到 GPU 或从 GPU(并发访问有一些细微差别,但这是另一次讨论)。您仍然需要向内核传递一个指向使用cudaMallocManaged 分配的托管内存块的指针。

我不知道只传递一个指向内核的指针并对支持数据进行操作。

希望这会有所帮助!

【讨论】:

  • 我也倾向于认为 OP 可能是在谈论统一内存。但是请注意,实际上并不能说。严格来说,上面问题中给出的第二个示例并没有显示任何可以区分的内容,例如,如果您只是采用第一个示例并删除除内核启动之外的每一行,您会得到什么。所有相关位都丢失了……
  • 是的,当然。只有使用“按我的意思做,而不是按我说的做”的语言才能实现最底层。 CUDA 绝对不是。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-09-28
  • 2021-11-27
  • 2011-06-20
  • 2012-01-06
  • 1970-01-01
  • 2016-10-09
相关资源
最近更新 更多