CUDA流中CUDA事件的异步行为

时间:2017-12-01 06:13:31

标签: cuda cuda-streams cuda-events

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

考虑以下代码演示这个anamoly,

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

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

  1. &#34; eventStart&#34;记录为完整
  2. kernel1运行并完成
  3. &#34; eventBetween&#34;记录已完成
  4. kernel2运行并完成
  5. &#34; eventEnd&#34;记录已完成
  6. 将主机线程与设备同步后,eventStarteventBetween之间的时间(由cudaEventElapsedTime测量)应该是kernel1的运行时间和时间在eventBetweeneventEnd之间进行的操作时间应为kernel2

    但根据cudaStreamWaitEvent上的NVIDIA's documentation

      

    将所有未来的工作提交给流,直到事件报告为止   在开始执行之前完成。

    blogpost

      

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

    事件无需在完成在同一个流上录制事件后安排的所有工作之前报告完成情况。这是一个惊喜,因为在Stream上安排的所有工作都应该以顺序方式运行。

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

1 个答案:

答案 0 :(得分:1)

看起来混淆的原因是主机流同步和流 - 流同步。

简而言之:

  1. Streams是FIFO,流中的所有操作都是相互同步的。
  2. 您所指的文档描述了程序员希望在不同流中的事件之间进行同步的用例。
  3. 您所引用的博客文章讨论了调用主机线程与流中排队的事件之间的同步。可用的主机 - 设备同步粒度有三个级别 - 整个设备,整个流或流中的事件。博客正在描述后者。
  4. 您引用的任何来源之间都没有矛盾。