GPU paralleled computation非常快,而且执行CPU的速度为15-30(有些甚至是50),但是, 与CPU内存相比,GPU内存非常有限,GPU内存和CPU之间的通信速度也不快。
让我们说我们有一些数据不适合GPU内存,但我们仍然想使用 它的计算奇迹。我们可以做的是将这些数据分成几部分并逐个将其提供给GPU。
将大数据发送到GPU可能需要一些时间,人们可能会想,如果我们将数据块分成两部分并提供前半部分,运行内核然后在内核运行时提供另一半,该怎么办。
按照这种逻辑,我们应该节省一些时间,因为数据传输应该在计算时进行,希望不会中断它的工作,一旦完成,它就可以,好吧,继续它& #39;无需等待新数据路径的工作。
我必须说我是gpgpu的新手,是cuda的新手,但我一直在尝试使用简单的cuda代码,并注意到用于在CPU和GPU之间传输数据的函数cudaMemcpy将阻止如果科纳正在跑步。它会等到内核完成然后才能完成它的工作。
我的问题是,是否有可能完成上述内容,如果可以,可以展示一个例子或提供一些如何完成的信息来源?
谢谢!
答案 0 :(得分:7)
是否有可能完成上述内容
是的,这是可能的。您所描述的是流水线算法,CUDA具有各种异步功能来启用它。
asynchronous concurrent execution section of the programming guide涵盖了CUDA中必要的元素以使其工作。要使用您的示例,存在cudaMemcpy
的非阻止版本,称为cudaMemcpyAsync
。您需要了解CUDA 流以及如何使用它们。
我还建议this presentation涵盖大部分需要的内容。
最后,here是一个有效的例子。该特定示例恰好使用CUDA流回调,但这些不是基本流水线操作所必需的。它们使得在管道中的各个点处异步触发额外的面向主机的处理,但是在处理过程中数据的基本分块和数据传送不依赖于流回调。另请注意该答案中的链接CUDA示例代码,这可能对学习/学习很有用。