【问题标题】:Asynchronous behavior of CUDA events within a CUDA streamCUDA 流中 CUDA 事件的异步行为
【发布时间】:2017-12-01 17:10:43
【问题描述】:

这个问题是关于 CUDA 流 (Stream) 的概念以及记录在流上的 CUDA 事件 (Event) 的明显异常。

考虑以下演示此异常的代码,

cudaEventRecord(eventStart, stream1)
kernel1<<<..., stream1>>>(...)
cudaEventRecord(eventBetween, stream1)
kernel2<<<..., stream1>>>(...)
cudaEventRecord(eventEnd, stream1)

由于 Stream 上的所有工作都是连续的,因此应该发生以下事件序列,

  1. eventStart”记录完成
  2. kernel1 运行并完成
  3. eventBetween”记录为已完成
  4. kernel2 运行并完成
  5. eventEnd”记录为已完成

主机线程与设备同步后,eventStarteventBetween之间的时间(用cudaEventElapsedTime测量)应该是kernel1的运行时间和eventBetween和@987654334之间的时间@ 应该是 kernel2 的运行时。

但是根据NVIDIA's documentationcudaStreamWaitEvent

让所有未来的工作提交到流媒体等到事件报告 在开始执行之前完成。

blogpost

您还可以在单​​个流中同步操作 使用 cudaStreamWaitEvent(event) 的特定事件

在同一流上录制事件后安排的所有工作之前,事件不需要报告完成。这让人感到意外,因为在 Stream 上安排的所有工作都应该按顺序运行。

有人可以澄清 Stream 中事件的这种异步行为吗?

【问题讨论】:

    标签: cuda cuda-streams cuda-events


    【解决方案1】:

    看来您混淆的原因是将主机流同步和流流同步混为一谈。

    简而言之:

    1. 流是 FIFO,流中的所有操作都相互同步。
    2. 您所指的文档描述了程序员希望在不同流中的事件之间进行同步的用例。
    3. 您参考的博客文章正在讨论调用主机线程 与流中排队的事件之间的同步。提供三个级别的主机-设备同步粒度——整个设备、整个流或流中的事件。该博客描述的是后者。

    您引用的任何来源之间没有矛盾。

    【讨论】:

      猜你喜欢
      • 2013-04-19
      • 1970-01-01
      • 1970-01-01
      • 2017-05-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-12-14
      相关资源
      最近更新 更多