CUDA流中CUDA事件的异步行为
这个问题是关于CUDA流(流)的概念以及流上记录的CUDA事件(事件)的明显异常 考虑下面的代码来演示这个anamolyCUDA流中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
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,流中的所有操作都是相互同步的
您所指的文档描述了一个用例,程序员希望在不同流中的事件之间进行同步
您提到的博客文章讨论了调用主机线程和排队在流中的事件之间的同步。主机设备同步粒度有三个级别--整个设备、整个流或流中的事件。博客正在描述后者
你引用的任何资料之间都没有矛盾