Events 是不是;“值得”;在CUDA中重用事件变量?

Events 是不是;“值得”;在CUDA中重用事件变量?,events,cuda,Events,Cuda,在CUDA中使用事件时,我通常创建一个事件并立即将其记录到某个流中。在同步之后,我不必费心去保留那个cudaEvent\u t,在其他地方使用它——我只是销毁了它 除了避免事件创建和销毁的开销外,“回收”事件还有其他好处吗?如果没有,为什么英伟达要麻烦地将cudaEventCreate()与cudaventrecord()分开?首先,我想回答一个问题“开销可能是多少”。因为我们没有CUDA事件的源代码。一切都是基于合理的猜测。您可以做出完全不同的设计决策,以实现具有相同或类似行为的CUDA事件

在CUDA中使用事件时,我通常创建一个事件并立即将其记录到某个流中。在同步之后,我不必费心去保留那个
cudaEvent\u t
,在其他地方使用它——我只是销毁了它


除了避免事件创建和销毁的开销外,“回收”事件还有其他好处吗?如果没有,为什么英伟达要麻烦地将
cudaEventCreate()
cudaventrecord()
分开?

首先,我想回答一个问题“开销可能是多少”。因为我们没有CUDA事件的源代码。一切都是基于合理的猜测。您可以做出完全不同的设计决策,以实现具有相同或类似行为的CUDA事件

在计时任务中,我们知道至少在某个地方记录了事件的时间。由于事件发生在设备端,我认为时间会记录在设备端内存中,以避免在记录期间使用PCIe(高开销)。当您最终从主机端获得时间时,记录的时间必须在某个时间通过PCIe传输(可能是
eventSync()

在整个过程中,主机和设备端内存都需要一些空间来存储时间。在我看来,这是一个在
eventCreate()
/
eventDestroy()
中分配/释放内存的完美位置,就像
malloc()
/
free()
一样。在重复记录时间(重用事件)时,它看起来也是您希望避免的完美开销

所以这里有两种类型的开销,分配设备和主机空间,以及PCIe传输。这是我的猜测。也许您可以有另一种方法来实现计时功能,而不涉及这些开销


最后,避免这些开销似乎是nVidia使用单独的
eventCreate()

Yes的一个很好的理由。单独的
create()
看起来像是避免创建开销的直接方法。为什么你认为nVidia仍然需要“其他利益”来做出这个设计决定?我相信事件创建是一个同步活动。我有理由相信这一点。在管道/处理循环中,避免设备范围内的同步活动是可取的,这与您在性能敏感的处理循环中不会(不应该)鲁莽地放弃cudamaloc/cudaFree的原因相同。@kangshiyin:因为事件似乎没有任何用处,也不会产生任何开销,除了关于他们的
record()
ing以外。@RobertCrovella:这对我来说有点奇怪-我的意思是,当你malloc时,你给了一个参数-大小;这需要更新一些主机端数据结构,可能还需要更新一些设备端数据结构。但是说“嘿,事件!”不应该真的做任何事情。最多你会认为你会有一个类似于
cudasetMaxOnCurrentEvents()
的东西运行一次。无论如何,也许这应该是一个答案。我不是100%确定
cudaEventCreate
的同步行为,它没有明确的文档记录。然而,构建一个有针对性的测试来证明或反驳是很容易的。1.当有疑问时,如果文档没有明确说明,CUDAAPI调用可能正在同步。2.
cudaEventRecord
明确表示它是异步3。我看不出这两个进程是如何异步的——事件本身只是一个句柄,但创建过程会更新CUDA运行时必须能够引用的表(即使在其他设备中!)。无论如何,我可能是错的,这应该很容易测试和证明/反驳。