CUDA中流的非阻塞同步?

CUDA中流的非阻塞同步?,c,cuda,synchronization,gpu,cuda-events,C,Cuda,Synchronization,Gpu,Cuda Events,是否可以在不阻塞主机的情况下同步两个CUDA流?我知道有cudaStreamWaitEvent,它是非阻塞的。但是使用cudaEventCreate 和cudaEventDestroy cudaEventDestroy的代码说明: 如果事件已记录但尚未完成,则 调用cudaEventDestroy()时,函数将立即返回 与事件关联的资源将自动释放一次 设备已完成事件 我不明白的是记录的事件和完成的事件之间有什么区别。这似乎也意味着 如果事件尚未录制,则呼叫将被阻止 有谁能解释一下吗?您使用cud

是否可以在不阻塞主机的情况下同步两个CUDA流?我知道有
cudaStreamWaitEvent
,它是非阻塞的。但是使用
cudaEventCreate
cudaEventDestroy

cudaEventDestroy的代码说明:

如果事件已记录但尚未完成,则 调用cudaEventDestroy()时,函数将立即返回 与事件关联的资源将自动释放一次 设备已完成事件

我不明白的是记录的事件和完成的事件之间有什么区别。这似乎也意味着 如果事件尚未录制,则呼叫将被阻止


有谁能解释一下吗?

您使用
cudaStreamWaitEvent
的方法是正确的。创建事件确实会带来一些成本,但它们可以在应用程序启动期间创建,以防止在GPU例程期间创建时间开销过大


将事件放入流中时,将记录事件。它是在事件完成之前放入流中的所有活动完成之后完成的。记录事件基本上会在流中放置一个标记,该标记使
cudaStreamWaitEvent
能够停止流上的前进,直到事件完成

当您对其调用
cudaEventCreate()
时,将创建一个事件。调用
cudaventrecord()
时会记录一个事件。当记录事件的流的处理到达该事件时,事件完成。例如,如果我在内核调用后立即将事件记录到流中,那么该事件将被记录但不完整,直到内核调用完成处理。一旦内核调用完成处理,它之后记录的事件将被标记为完成(流处理将继续)。如果事件尚未记录,则
cudaEventDestroy
调用不会被阻止。我无法在启动时创建事件,因为我不知道必须多久同步一次。此外,我还希望将工作放在其他执行流上,因此我需要主机上的异步行为。但是我得到了记录的事件和完成的事件之间的差异,所以谢谢你。FWIW我只是计时创建和销毁1000个事件。平均来说,创造大约是115us,破坏甚至没有在计时器上登记。NVPROF报告的时间通常在500ns左右,带有一些异常值。看起来大约每10-15件作品中就有1件比其他作品花费的时间更长,这拖累了我的平均值。希望这不会对您的需求造成太多的同步。