在 CUDA 中使用事件时,我通常创建一个事件并立即将其记录在某个流上。同步后,我懒得保留那个
cudaEvent_t
,在其他地方使用它 - 我只是销毁它。
除了避免事件创建和销毁的开销之外,“回收”事件还有其他好处吗?如果不是,为什么
nVIDIA
费心将 cudaEventCreate()
与 cudaEventRecord()
分开?
首先我试图回答“开销可能是多少”的问题。因为我们没有 CUDA 事件的源代码。一切都基于一些合理的猜测。您可以做出完全不同的设计决策来实现具有相同或相似行为的 CUDA 事件。
在计时任务中我们知道至少事件发生的时间被记录在某处。由于事件发生在设备端,我认为时间记录在设备端内存中,以避免在记录过程中使用 PCIe(高开销)。当您最终从主机端获取时间时,记录的时间必须在某个时候通过 PCIe 传输(可能
eventSync()
)。
您会看到在整个过程中,主机和设备端内存都需要一些空间来存储时间。在我看来,它是在
eventCreate()
/eventDestroy()
中分配/释放内存的完美位置,就像 malloc()
/free()
一样。它看起来也像是您在重复记录时间(重用事件)时想要避免的完美开销。
这里有两种类型的开销,分配设备和主机空间,以及 PCIe 传输。这是我的猜测。也许您可以有另一种方法来实现计时功能而不涉及这些开销。
最后,避免这些开销似乎是 nVidia 使用单独的
eventCreate()
的一个很好的理由。