这个问题是关于CUDA流(Stream)的概念以及在流上记录的CUDA事件(事件)的明显异常。
考虑以下代码演示这个anamoly,
cudaEventRecord(eventStart, stream1)
kernel1<<<..., stream1>>>(...)
cudaEventRecord(eventBetween, stream1)
kernel2<<<..., stream1>>>(...)
cudaEventRecord(eventEnd, stream1)
由于Stream上的所有工作都是顺序的,因此应该发生以下事件序列,
eventStart
&#34;记录为完整kernel1
运行并完成eventBetween
&#34;记录已完成kernel2
运行并完成eventEnd
&#34;记录已完成将主机线程与设备同步后,eventStart
和eventBetween
之间的时间(由cudaEventElapsedTime
测量)应该是kernel1
的运行时间和时间在eventBetween
和eventEnd
之间进行的操作时间应为kernel2
。
但根据cudaStreamWaitEvent
上的NVIDIA's documentation,
将所有未来的工作提交给流,直到事件报告为止 在开始执行之前完成。
和blogpost,
您还可以在a上同步单个流中的操作 使用cudaStreamWaitEvent(event)的特定事件
事件无需在完成在同一个流上录制事件后安排的所有工作之前报告完成情况。这是一个惊喜,因为在Stream上安排的所有工作都应该以顺序方式运行。
有人可以澄清Stream中事件的这种异步行为吗?
答案 0 :(得分:1)
看起来混淆的原因是主机流同步和流 - 流同步。
简而言之:
您引用的任何来源之间都没有矛盾。