【问题标题】:Overlap data transfer and kernel execution using CUDA stream使用 CUDA 流重叠数据传输和内核执行
【发布时间】:2011-06-06 06:21:27
【问题描述】:

我想通过将数据传输与内核执行重叠来优化我的CUDA 程序。但是 CUDA SDK 中的示例程序asyncAPI.cu 太简单了,无法提供帮助。

我确实搜索了这个问题,发现一些教程使用两个CUDA流来实现重叠。就我而言,需要计算大量数据,因此我需要循环遍历并将一部分数据发送到 GPU 每次迭代。但是我不怎么写这样的循环,因为所有操作都是异步的,我担心传输的数据会擦除/覆盖当前正在计算的那些。

有人经历过吗?
任何帮助将不胜感激。

【问题讨论】:

    标签: cuda


    【解决方案1】:

    您应该记住的一件事是,同一流中的操作将按顺序执行,并且只会与其他流中的操作重叠。当我使用流时,我的方法是为每个流使用单独的内存位置。这将消除流之间的同步问题。如果由于内存限制而不适合您,或者您需要在内核之间共享数据,您必须自己编程同步。

    此外,如果您在默认流上进行任何调用,此流将等待所有其他流完成后再执行,并且在默认流上运行某些内容时无法执行其他流。

    希望这会有所帮助。

    【讨论】:

    • 更详细地说,例如,您可能还有一个用于输入/输出的数组,并且每个流接收到这些数组的不同偏移量。偏移量应根据每个流中内核处理的元素数量计算,以便一个流中的线程不会接触其他流使用的内存。
    • 是的,我知道了。非常感谢。但是,while 在循环中何时开始下一次数据传输。一段代码 sn-p 会有所帮助。
    • @harrism:听起来很合理。另一个问题,控制立即返回主机,如果在循环中将在前一个完成之前开始下一个数据传输。那么,如何控制这种情况。投票活动?还是有更好的解决方案?谢谢。
    • 您不需要自己进行轮询。您可以使用 cuda 事件(cudaEvent_t,请参阅 CUDA 编程指南 4.0 的第 3.2.5 节)。在 CUDA SDK 中(在 v4.0 中,不确定其他版本)至少还有两个可能有用的示例:concurrentKernels 和 simpleMultiCopy。 simpleMultiCopy 是我认为您正在寻找的(在 for 循环中复制和执行)。
    • @harrism 是的,你是对的!但是如何在 2D 数组中分配块,即 tile 到流似乎非常困难,因为在 1D 数组的情况下,我们可以简单地将那部分数据的基指针作为一个内核的参数,但是在二维数组的情况下如何实现呢?
    猜你喜欢
    • 2020-12-04
    • 2012-12-14
    • 2020-07-30
    • 1970-01-01
    • 2017-09-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多