【问题标题】:Non-blocking synchronization of streams in CUDA?CUDA中流的非阻塞同步?
【发布时间】:2016-12-14 02:02:20
【问题描述】:

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

documentation 代表 cudaEventDestroy 说:

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

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

谁能解释一下?

【问题讨论】:

  • 当您在其上调用cudaEventCreate() 时会创建一个事件。当您在其上调用cudaEventRecord() 时会记录一个事件。当已记录事件的流的处理到达该事件时,事件完成。例如,如果我在内核调用后立即将事件记录到流中,那么该事件将被记录但不完整,直到内核调用完成处理。一旦内核调用完成处理,它之后记录的事件将被标记为完成(并且流处理将继续。)
  • 如果事件尚未记录cudaEventDestroy 调用不会阻塞。

标签: c cuda synchronization gpu cuda-events


【解决方案1】:

使用cudaStreamWaitEvent,您走在了正确的轨道上。创建事件确实需要一些成本,但可以在应用程序启动期间创建它们,以防止在 GPU 例程期间创建时间成本很高。

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

【讨论】:

  • 我无法在启动时创建事件,因为我不知道我需要多久进行一次同步。此外,我想将工作放在其他执行流上,因此我需要主机上的异步行为。但我知道记录事件和完成事件之间的区别,所以谢谢。
  • FWIW 我刚刚定时创建和销毁 1000 个事件。平均创建时间约为 115 微秒,而破坏甚至没有记录在计时器上。 NVPROF 报告的时间通常在 500ns 左右,并带有一些异常值。看起来每 10 到 15 件作品中大约有 1 件作品比其他作品花费的时间更长,这拖累了我的平均水平。希望这不会对您的需求造成太多同步。
猜你喜欢
  • 2018-04-06
  • 2023-03-14
  • 2013-07-20
  • 2017-05-08
  • 1970-01-01
  • 2011-10-21
  • 2013-05-07
  • 1970-01-01
相关资源
最近更新 更多