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

时间:2016-12-29 01:57:14

标签: cuda gpgpu

GPU paralleled computation非常快,而且执行CPU的速度为15-30(有些甚至是50),但是, 与CPU内存相比,GPU内存非常有限,GPU内存和CPU之间的通信速度也不快。

让我们说我们有一些数据不适合GPU内存,但我们仍然想使用 它的计算奇迹。我们可以做的是将这些数据分成几部分并逐个将其提供给GPU。

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

按照这种逻辑,我们应该节省一些时间,因为数据传输应该在计算时进行,希望不会中断它的工作,一旦完成,它就可以,好吧,继续它& #39;无需等待新数据路径的工作。

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

我的问题是,是否有可能完成上述内容,如果可以,可以展示一个例子或提供一些如何完成的信息来源?

谢谢!

1 个答案:

答案 0 :(得分:7)

  

是否有可能完成上述内容

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

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

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

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