CUDA流中CUDA事件的异步行为

CUDA流中CUDA事件的异步行为,cuda,cuda-streams,cuda-events,Cuda,Cuda Streams,Cuda Events,这个问题是关于CUDA流(流)的概念以及流上记录的CUDA事件(事件)的明显异常 考虑下面的代码来演示这个anamoly cudaEventRecord(eventStart, stream1) kernel1<<<..., stream1>>>(...) cudaEventRecord(eventBetween, stream1) kernel2<<<..., stream1>>>(...) cudaEventRecord

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

考虑下面的代码来演示这个anamoly

cudaEventRecord(eventStart, stream1)
kernel1<<<..., stream1>>>(...)
cudaEventRecord(eventBetween, stream1)
kernel2<<<..., stream1>>>(...)
cudaEventRecord(eventEnd, stream1)
cudaEventRecord(事件开始,流1)
内核1(…)
cudaEventRecord(事件之间,流1)
内核2(…)
cudaEventRecord(事件结束,stream1)
由于流上的所有工作都是连续的,因此应该发生以下事件序列

  • eventStart
    ”被记录为完成
  • kernel1
    运行并完成
  • eventBetween
    ”被记录为已完成
  • kernel2
    运行并完成
  • eventEnd
    ”被记录为已完成
  • 将主机线程与设备同步后,
    eventStart
    eventBetween
    之间所用的时间(通过
    cudaeventreleasedtime
    测量)应该是
    kernel1
    的运行时,而
    eventBetween
    eventEnd
    之间的时间应该是
    kernel2
    的运行时

    但是根据关于cudaStreamWaitEvent的

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

    以及

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

    事件不需要在将事件记录在同一流上之后计划的所有工作之前报告完成情况。这是一个惊喜,因为流上计划的所有工作都应该以顺序方式运行


    有人能澄清流中事件的这种异步行为吗?

    看来造成混淆的原因是主机流同步和流同步混淆了

    简言之:

  • 流是FIFO,流中的所有操作都是相互同步的
  • 您所指的文档描述了一个用例,程序员希望在不同流中的事件之间进行同步
  • 您提到的博客文章讨论了调用主机线程和排队在流中的事件之间的同步。主机设备同步粒度有三个级别--整个设备、整个流或流中的事件。博客正在描述后者
  • 你引用的任何资料之间都没有矛盾