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/