我想通过将数据传输与内核执行重叠来优化我的CUDA
程序。但是CUDA SDK中的示例程序asyncAPI.cu
太简单了,无法提供帮助。
我确实搜索过这个问题,并发现一些教程使用两个CUDA流来实现重叠。在我的情况下,需要计算大量数据,因此我需要循环并在每次迭代时将一部分数据分派到GPU
。但我不知道如何编写这样的循环,因为所有操作都是异步的,我担心传输数据会擦除/覆盖当前正在运行的数据。
有没有人经历过这种情况? 任何帮助都将不胜感激。
答案 0 :(得分:2)
您应该记住的一件事是,同一个流中的操作将按顺序执行,并且只会与其他流中的操作重叠。当我使用流时,我的方法是为每个流使用单独的内存位置。这将消除流之间的同步问题。如果由于内存限制而无法为您选择,或者您需要在内核之间共享数据,则必须自己编程同步。
此外,如果您对默认流进行任何调用,则此Steam将在执行前等待所有其他流完成,并且在默认流上运行某些内容时不会执行其他流。
希望这有帮助。