【发布时间】:2017-12-01 17:10:43
【问题描述】:
这个问题是关于 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和@987654334之间的时间@ 应该是 kernel2 的运行时。
但是根据NVIDIA's documentationcudaStreamWaitEvent,
让所有未来的工作提交到流媒体等到事件报告 在开始执行之前完成。
和blogpost,
您还可以在单个流中同步操作 使用 cudaStreamWaitEvent(event) 的特定事件
在同一流上录制事件后安排的所有工作之前,事件不需要报告完成。这让人感到意外,因为在 Stream 上安排的所有工作都应该按顺序运行。
有人可以澄清 Stream 中事件的这种异步行为吗?
【问题讨论】:
标签: cuda cuda-streams cuda-events