我正在使用 CUDA 流来启用异步数据传输并隐藏内存复制延迟。我有 2 个 CPU 线程和 2 个 CUDA 流:一个是“数据”流,它本质上是由第一个 CPU 线程发起的一系列 cudaMemcpyAsync 调用,另一个是执行计算内核的“计算”流。数据流正在为计算流准备批处理,因此计算流必须确保流将要处理的批处理完全加载到内存中。
我应该使用 CUDA 事件进行这种同步还是其他一些机制?
更新:让我澄清为什么我不能在每个流中使用带有数据副本/计算的单独流。问题是必须按顺序处理批处理,也就是说,我不能并行执行它们(当然,这可以用多个流来完成)。但是,在处理每批时,我可以为下一批预加载数据,从而隐藏数据传输。以罗伯特为例:
cudaMemcpyAsync( <data for batch1>, dataStream);
cudaMemcpyAsync( <data for batch2>, dataStream);
kernelForBatch1<<<..., opsStream>>>(...);
kernelForBatch2<<<..., opsStream>>>(...);