我正在使用CUDA流启用异步数据传输并隐藏内存拷贝延迟。我有2个CPU线程和2个CUDA流:一个是“数据”流,它基本上是由第一个CPU线程启动的一系列cudaMemcpyAsync调用,另一个是执行计算内核的“计算”流。数据流正在为计算流准备批处理,因此对于计算流来说,确保流将要处理的批次完全加载到内存中至关重要。同步两个CUDA流
我应该使用CUDA事件进行这种同步还是其他一些机制?
更新:让我澄清为什么我不能在每个流中使用具有数据副本/计算的单独流。问题是批处理必须按顺序处理,我不能并行执行它们(当然,这可能会对多个流执行)。但是,在处理每批时,我可以预先加载下一批的数据,从而隐藏数据传输。 要使用罗伯特的例子:
cudaMemcpyAsync(<data for batch1>, dataStream);
cudaMemcpyAsync(<data for batch2>, dataStream);
kernelForBatch1<<<..., opsStream>>>(...);
kernelForBatch2<<<..., opsStream>>>(...);
谢谢。我现在意识到我没有很好地解释我的问题,所以我添加了更多细节。 –
尽管你有更新,但我不清楚为什么你不能直接使用流。对于必须按顺序处理的批次,将这些内核放在同一个流中。从概念上讲,一个内核依次调用几个并没有什么区别。如果有帮助,请使用2个以上的流。如果你确信你不能使用流,你可以像我指出的那样使用事件。 –