cuda - 在内核运行时将数据传输到 GPU 以节省时间

标签 cuda gpgpu

GPU 在处理 paralleled computation 时非常快并且比 CPU 快 15-30(有些报告甚至是 50)倍,但是, 与 CPU 内存相比,GPU 内存非常有限,而且 GPU 内存和 CPU 之间的通信速度也没有那么快。

假设我们有一些数据不适合 GPU 内存,但我们仍然想使用 计算真是太神奇了。我们可以做的是将该数据拆分成多个部分,然后将其一个一个地输入 GPU。

将大数据发送到 GPU 可能需要时间,有人可能会想,如果我们将数据分成两部分并提供前半部分,运行内核,然后在内核运行时提供另一半会怎样。

按照这个逻辑,我们应该节省一些时间,因为数据传输应该在计算的同时进行,希望不会打断它的工作,完成后,它可以继续工作而不需要等待新的数据路径。

我必须说我是 gpgpu 的新手,是 cuda 的新手,但我一直在尝试使用简单的 cuda 代码并注意到函数 cudaMemcpy如果 kerner 正在运行,用于在 CPU 和 GPU 之间传输数据的函数将阻塞。它将等到内核完成,然后执行它的工作。


我的问题是,是否有可能完成如上所述的事情?如果可以,是否可以举个例子或提供一些有关如何完成的信息来源?

谢谢!

最佳答案

is it possible to accomplish something like that described above

是的,这是可能的。您所描述的是一种流水线算法,CUDA 具有各种异步功能来启用它。

asynchronous concurrent execution section of the programming guide涵盖了 CUDA 中使其工作的必要元素。要使用您的示例,存在 cudaMemcpy 的非阻塞版本,称为 cudaMemcpyAsync。您需要了解 CUDA 以及如何使用它们。

我还建议 this presentation其中涵盖了大部分需要的内容。

最后,here是一个有效的例子。该特定示例恰好使用了 CUDA 流回调,但对于基本流水线操作而言,这些并不是必需的。它们使额外的面向主机的处理能够在管道中的不同点被异步触发,但基本的数据分 block 和处理过程中的数据传递不依赖于流回调。另请注意该答案中链接的 CUDA 示例代码,这可能对研究/学习有用。

关于cuda - 在内核运行时将数据传输到 GPU 以节省时间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41372168/

相关文章:

c++ - CUDA - 在内核中创建对象并在主机上使用它们

cuda - 在 CUDA 中读取 nvprof 的输出

CUDA __umul24 函数,有用还是没用?

c++ - 在运行时根据 CUDA 计算能力切换主机功能

c++ - CUDA - 复制到对象数组中的数组

cuda - 我可以将 CUDA 与非 NVIDIA GPU 一起使用吗?

concurrency - 如何使已编写的并发程序在GPU阵列上运行?

algorithm - 使用二进制搜索的并行合并排序

c - 使用 Cuda-C 查找表

ios - iOS 上 GPU 上的快速傅里叶变换