Timer CUDA:CPU计时器和CUDA计时器事件之间的差异?

Timer CUDA:CPU计时器和CUDA计时器事件之间的差异?,timer,cuda,Timer,Cuda,使用CPU定时器和CUDA定时器事件测量执行某些CUDA代码所用的时间有什么区别?CUDA程序员应该使用以下哪项?为什么 CPU计时器的使用需要在记录任何时间之前调用cudaThreadSynchronize。为了记录时间,可以使用clock(),也可以查询高分辨率性能计数器,如(在Windows上) CUDA定时器事件将涉及使用cudaEventRecord在前后进行记录。稍后,通过调用事件上的cudaEventSynchronize来获取经过的时间,然后调用cudaeventslessedt

使用CPU定时器CUDA定时器事件测量执行某些CUDA代码所用的时间有什么区别?CUDA程序员应该使用以下哪项?为什么

CPU计时器的使用需要在记录任何时间之前调用
cudaThreadSynchronize
。为了记录时间,可以使用
clock()
,也可以查询高分辨率性能计数器,如(在Windows上)


CUDA定时器事件将涉及使用
cudaEventRecord
在前后进行记录。稍后,通过调用事件上的
cudaEventSynchronize
来获取经过的时间,然后调用
cudaeventslessedtime
来获取经过的时间。

问题第一部分的答案是,cudaEvents计时器基于GPU上的高分辨率计数器,与使用主机计时器相比,它们具有更低的延迟和更好的分辨率,因为它们“脱离金属”。您应该期望cudaEvents计时器具有亚微秒的分辨率。你应该更喜欢他们的时间GPU操作正是出于这个原因。cudaEvents的每流特性对于检测异步操作(如同步内核执行和重叠复制与内核执行)也很有用。使用主机计时器进行这种时间测量几乎是不可能的


编辑:我不会回答最后一段,因为你删除了它。

使用CUDA事件计时的主要优点是,它们不太容易受到其他系统事件的干扰,如分页或来自磁盘或网络控制器的中断。此外,由于cu(da)事件记录是异步的,因此当时间短、GPU密集型操作时,海森堡效应较少

CUDA事件的另一个优点是,它们有一个干净的跨平台API—无需包装gettimeofday()或QueryPerformanceCounter()


最后一点注意:在使用流CUDA事件进行计时时要小心-如果不指定空流,则可能会结束不打算进行的计时操作。CUDA事件和读取CPU的时间戳计数器之间有一个很好的类比,这是一个串行化指令。在现代超标量处理器上,串行化语义使定时变得明确。同样与RDTSC一样,您应该始终将要计时的事件与计时有意义的足够工作相结合(就像您不能使用RDTSC有意义地计时单个机器指令一样)。

您是否开始编写一个问题,然后完成另一个问题的编写?我不明白最后一段如何与问题的其余部分相吻合。你真正想知道的是什么?您是否试图协调主机和设备计时器测量的输出,但无法协调,或者其他什么?Talonmes:我已经删除了最后一段。所以问题只是。。。作为一名程序员,我不知道这两个计时器应该使用哪一个,为什么?Talonmies:你能详细解释一下“复制和内核重叠”是什么意思吗?为什么不可能用CPU来衡量这一点?@Ashwin:在过去3年左右的时间里,所有与CUDA兼容的GPU都支持内核执行的同时主机设备复制。但要做到这一点,需要cudamemcpyapi的异步版本,而且因为它们与主机是异步的,所以在不强制调用同步的情况下,无法对操作进行指令插入,从而停止重叠。因此,您可以使用主机计时器测量总的重叠复制执行操作,但无法解决在开始和结束时间之间发生的问题。但是,通过将事件插入到流中,您可以。