我正在尝试使用 CUDA 在 GPU 上实现以下类型的管道:
我有四个流,每个流都有一个 Host2Device 副本、一个内核调用和一个 Device2Host 副本。但是,内核调用必须等待下一个流的 Host2Device 副本完成。
我打算cudaStreamWaitEvent
用于同步。但是,根据文档,这仅cudaEventRecord
在之前为相应事件调用过的情况下才有效。在这种情况下,情况并非如此。
流由单独的 CPU 线程管理,基本上如下所示:
Do some work ...
cudaMemcpyAsync H2D
cudaEventRecord (event_copy_complete[current_stream])
cudaStreamWaitEvent (event_copy_complete[next_stream])
call kernel on current stream
cudaMemcpyAsync D2H
Do some work ...
CPU 线程被管理以正确的顺序启动流。因此,cudaStreamWaitEvent
对于流 1 的复制完成事件,在该事件(在流 1 中)之前调用(在流 0cudaEventRecord
中)。这导致功能性无操作。
我觉得不能以这种方式使用事件。是否有另一种方法来实现所需的同步?
顺便说一句,我不能只是颠倒流顺序,因为还有更多的依赖关系。
API调用顺序
根据要求,这是发出 CUDA 调用的顺序:
//all on stream 0
cpy H2D
cudaEventRecord (event_copy_complete[0])
cudaStreamWaitEvent (event_copy_complete[1])
K<<< >>>
cpy D2H
//all on stream 1
cpy H2D
cudaEventRecord (event_copy_complete[1])
cudaStreamWaitEvent (event_copy_complete[2])
K<<< >>>
cpy D2H
//all on stream 2
cpy H2D
cudaEventRecord (event_copy_complete[2])
cudaStreamWaitEvent (event_copy_complete[3])
K<<< >>>
cpy D2H
...
可以看出,调用 tocudaStreamWaitEvent
总是早于调用 to cudaEventRecord
。