使用CPU计时器和CUDA计时器事件来测量执行某些CUDA代码所需的时间有什么区别?
一个CUDA程序员应该使用哪一个?
为什么?
我所知道的
CPU计时器的使用将涉及在任何时间之前调用cudaThreadSynchronize。为了说明时间,可以使用其中之一:
clock()QueryPerformanceCounter (在Windows上)、CUDA计时器事件将涉及使用cudaEventRecord记录前后。稍后,将通过对事件调用cudaEventSynchronize来获得经过的时间,然后调用cudaEventElapsedTime来获得经过的时间。
发布于 2011-04-29 07:05:09
问题的第一部分的答案是,cudaEvents定时器是基于GPU上的高分辨率计数器的,与使用主机计时器相比,它们具有更低的延迟和更好的分辨率,因为它们“脱离了金属”。您应该期望来自cudaEvents定时器的亚微秒分辨率。正是出于这个原因,您应该更喜欢它们来计时GPU操作。cudaEvents的每流特性也可以用于检测异步操作,如同步内核执行、重叠复制和内核执行。使用主机计时器进行这种时间测量几乎是不可能的。
编辑:我不会回答最后一段,因为你删除了它。
发布于 2011-05-01 03:59:31
使用CUDA事件来计时的主要优点是,由于其他系统事件(如分页或来自磁盘或网络控制器的中断),它们不受扰动的影响。另外,由于cu(da)EventRecord是异步的,所以在定时短、GPU密集的操作中,海森堡效应较小。
CUDA事件的另一个优点是它们具有清晰的跨平台API --不需要包装gettimeofday()或QueryPerformanceCounter()。
最后一个注意事项:在使用流CUDA事件进行计时时要小心--如果您不指定空流,则可能会结束您无意中的计时操作。在CUDA事件和读取CPU的时间戳计数器(这是一个序列化指令)之间有一个很好的类比。在现代超标量处理器上,串行化语义使得时序变得清晰。同样,与RDTSC一样,您应该始终用足够的工作来安排您想要计时的事件,从而使时间是有意义的(就像您不能使用RDTSC对单个机器指令进行有意义的计时一样)。
https://stackoverflow.com/questions/5828816
复制相似问题