这个问题是关于CUDA流(流)的概念以及流上记录的CUDA事件(事件)的明显异常。
请考虑以下代码来演示此配置文件,
cudaEventRecord(eventStart, stream1)
kernel1<<<..., stream1>>>(...)
cudaEventRecord(eventBetween, stream1)
kernel2<<<..., stream1>>>(...)
cudaEventRecord(eventEnd, stream1)
由于流上的所有工作都是顺序的,因此应该发生以下事件序列,
- "
eventStart
"被记录为完整 kernel1
运行和完成- "
eventBetween
"被记录为已完成 kernel2
运行和完成- "
eventEnd
"被记录为已完成
将主机线程与设备同步后,eventStart
和eventBetween
之间的时间(以cudaEventElapsedTime
测量)应该是kernel1
的运行时间,eventBetween
和eventEnd
之间的时间应该是kernel2
的运行时间。
但根据英伟达关于cudaStreamWaitEvent
的文档,
使提交到流的所有未来工作都等到事件报告 在开始执行之前完成。
和博客文章,
您还可以在 使用 cudaStreamWaitEvent(event) 的特定事件
事件不需要在同一流上录制事件后计划的所有工作之前报告完成。这令人惊讶,因为在流上计划的所有工作都应该以顺序方式运行。
有人可以澄清流中事件的这种异步行为吗?
您混淆的原因似乎是将主机流同步和流流同步混为一谈。
总之:
- 流是 FIFO,流中的所有操作 彼此同步。
- 您所指的文档描述了程序员希望在不同流中的事件之间同步的用例。
- 您引用的博客文章正在讨论调用主机线程与流中排队的事件之间的同步。有三个级别的主机-设备同步粒度可用 - 整个设备、整个流或流中的事件。该博客正在描述后者。
您引用的任何来源之间都没有矛盾。