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

Aid*_*aly 3 cuda gpgpu

GPU在并行计算方面非常快,并且执行CPU的速度为15-30(有些甚至报告甚至50倍)然而,GPU内存与CPU内存相比非常有限,GPU内存与CPU之间的通信速度并不快.

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

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

通过这种逻辑,我们应该节省一些时间,因为数据传输应该在计算过程中进行,希望不会中断它的工作,一旦完成,它就可以继续它的工作,而无需等待新的数据路径.

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


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

谢谢!

Rob*_*lla 7

是否有可能完成上述内容

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

编程指南异步并发执行部分涵盖了CUDA中的必要元素以使其工作.要使用您的示例,存在一个非阻塞版本cudaMemcpy,称为cudaMemcpyAsync.您需要了解CUDA 以及如何使用它们.

我还建议这个介绍涵盖了大部分需要的内容.

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