我有关于cuda事件和异步计算的问题,我不确定在那种情况下何时触发事件(伪代码):
cudaStream_t oStream;
cudaEvent_t oEvent;
cudaStreamCreate( &oStream);
cudaEventCreate( &oEvent);
MyKernel1<<<..,..,.., oStream>>>();
cudaEventRecord( oStream, oEvent);
MyKernel2<<<..,..,.., oStream>>>();
cudaEventSynchronize( oEvent );
oEvent
之后或MyKernel1
之后是MyKernel2
,这意味着主持人何时在cudaEventSynchronize
之后再次开始处理? (当然,在我的MyKernel1
呼叫在主机上完成时MyKernel2
未完成{/ p>
答案 0 :(得分:4)
oEvent
&#34;火灾&#34; MyKernel1()
完成后(在MyKernel2()
开始执行之前)(已完成)。
内核执行是序列化的,因为它们发布到同一个流。
将内核发布到流中,cudaEventRecord
发送到流应该都是异步的。
cudaEventSynchronize()
语句将导致主机线程暂停直到oEvent
完成,然后允许主机线程继续。这意味着主机线程可以在MyKernel2
执行时继续,但不能在MyKernel1
执行时继续。