0

这个问题是关于 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应该eventEnd是 的运行时间kernel2

但根据NVIDIA 关于 的文档cudaStreamWaitEvent

使提交到流的所有未来工作等到事件报告完成后再开始执行。

博文

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

在同一流上记录事件之后安排的所有工作之前,事件不需要报告完成。这令人惊讶,因为在 Stream 上安排的所有工作都应该以顺序方式运行。

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

4

1 回答 1

1

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

简而言之:

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

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

于 2017-12-01T08:44:28.867 回答