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

在并行计算和GPU执行速度方面,GPU的速度非常快,达到了15-30(有些报告甚至达到了50)倍,但是与CPU内存相比,GPU内存非常有限,并且GPU内存和CPU之间的通信速度并不快。

假设我们有一些数据不适合GPU ram,但我们仍然想用它来计算奇迹。 我们可以做的就是将这些数据分成几块,然后将它们逐个送入GPU。

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

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

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


我的问题是,是否有可能完成类似上述的内容,如果可以,可以举个例子或者提供一些信息来说明如何实现?

谢谢!


是否有可能完成上述那样的事情

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

编程指南的异步并发执行部分涵盖了CUDA中的必要元素以使其工作。 要使用你的榜样,存在的非阻塞版本cudaMemcpy ,叫cudaMemcpyAsync 。 您需要了解CUDA流以及如何使用它们。

我还建议这个演示文稿涵盖大部分需要的内容。

最后,这里是一个成功的例子。 这个特定的例子恰好使用CUDA流回调,但这些对于基本流水线来说不是必需的。 它们使额外的面向主机的处理能够在流水线中的各个点异步触发,但基本的数据分块以及在处理过程中传输数据不依赖于流回调。 还要注意该答案中链接的CUDA示例代码,这可能对学习/学习有用。

链接地址: http://www.djcxy.com/p/64631.html

上一篇: Transferring data to GPU while kernel is running to save time

下一篇: Setting up GPUDirect for infiniband