这个问题是关于 CUDA 流 (Stream) 的概念以及记录在流上的 CUDA 事件 (Event) 的明显异常。
考虑以下演示此异常的代码,
cudaEventRecord(eventStart, stream1)
kernel1<<<..., stream1>>>(...)
cudaEventRecord(eventBetween, stream1)
kernel2<<<..., stream1>>>(...)
cudaEventRecord(eventEnd, stream1)
由于 Stream 上的所有工作都是顺序的,因此应该发生以下事件序列,
- "
eventStart
" 记录为完整 kernel1
运行并完成- "
eventBetween
" 记录为已完成 kernel2
运行并完成- "
eventEnd
" 记录为已完成
将主机线程与设备同步后, 和 之间所用的时间eventStart
(eventBetween
由 测量cudaEventElapsedTime
)应该是 的运行时间,kernel1
和 之间所用的时间eventBetween
应该eventEnd
是 的运行时间kernel2
。
但根据NVIDIA 关于 的文档cudaStreamWaitEvent
,
使提交到流的所有未来工作等到事件报告完成后再开始执行。
和博文,
您还可以使用 cudaStreamWaitEvent(event) 在特定事件的单个流中同步操作
在同一流上记录事件之后安排的所有工作之前,事件不需要报告完成。这令人惊讶,因为在 Stream 上安排的所有工作都应该以顺序方式运行。
有人可以澄清 Stream 中事件的这种异步行为吗?