使用 CPU计时器和 CUDA计时器事件来衡量执行某些CUDA代码所需的时间有什么区别? CUDA程序员应该使用哪些以及为什么?
CPU计时器使用将涉及在记录任何时间之前调用cudaThreadSynchronize
。注意可以使用clock()
时间,或者可以查询QueryPerformanceCounter
(在Windows上)等高分辨率性能计数器。
CUDA计时器事件将涉及使用cudaEventRecord
之前和之后的录制。稍后,通过在事件上调用cudaEventSynchronize
,然后cudaEventElapsedTime
获取已用时间来获取已用时间。
答案 0 :(得分:9)
第一部分问题的答案是cudaEvents定时器基于GPU上的高分辨率计数器,与使用主机定时器相比,它们具有更低的延迟和更高的分辨率,因为它们“脱离金属”。您应该期望来自cudaEvents定时器的亚微秒分辨率。出于这个原因,你应该更喜欢它们来定时GPU操作。 cudaEvents的每个流的特性也可用于检测异步操作,如同步内核执行和重叠复制以及内核执行。使用主机定时器进行这种时间测量几乎是不可能的。
编辑:我不会回答最后一段,因为你删除了它。
答案 1 :(得分:3)
使用CUDA事件进行计时的主要优点是,它们不会受到其他系统事件(如磁盘或网络控制器的分页或中断)的干扰。此外,因为cu(da)EventRecord是异步的,所以在对GPU密集型操作进行定时时,Heisenberg效应较少。
CUDA事件的另一个优点是它们具有干净的跨平台API - 无需包装gettimeofday()或QueryPerformanceCounter()。
最后一点:在使用流式CUDA事件进行计时时要小心 - 如果不指定NULL流,则可能会结束您不想要的计时操作。在CUDA事件和读取CPU的时间戳计数器之间有一个很好的类比,它是一个序列化指令。在现代超标量处理器上,序列化语义使得时序明确无误。也像RDTSC一样,你应该总是把你想要的事件包括在一起,并且时间是有意义的(就像你不能使用RDTSC来有意义地计算单个机器指令的时间)。