如何计算CPU + GPU的总时间

时间:2012-01-20 18:10:12

标签: cuda cpu gpu cpu-usage

我正在对CPU进行一些计算,然后将数字传输到GPU并在那里做一些工作。我想计算在CPU + GPU上进行计算所需的总时间。我该怎么做?

2 个答案:

答案 0 :(得分:0)

程序启动时,在main()中,使用任何系统计时器记录时间。当程序在main()的底部结束时,使用相同的系统计时器记录时间。取时间2和时间1之间的差异。你去吧!

您可以使用不同的系统计时器,其中一些计时器的分辨率高于其他计时器。我建议您在SO网站上搜索“系统计时器”,而不是在这里讨论。如果您只想要任何系统计时器,gettimeofday()可以在Linux系统上运行,但它已被更新,更高精度的功能所取代。实际上,gettimeofday()只测量以微秒为单位的时间,这应该足以满足您的需求。

如果无法获得具有足够分辨率的定时器,请考虑多次循环运行程序,定时执行循环,并将测量时间除以循环迭代次数。

编辑:

系统计时器可用于测量总体应用程序性能,包括GPU计算期间使用的时间。请注意,以这种方式使用系统计时器仅适用于实时或挂钟时间,而不是处理时间。基于挂钟时间的测量必须包括等待GPU操作完成所花费的时间。

如果您想测量GPU内核所用的时间,您可以选择几个选项。首先,您可以使用Compute Visual Profiler收集各种分析信息,虽然我不确定它是否报告时间,但它必须能够(这是一个基本的分析功能)。其他分析器 - 脑海中浮现 - 提供对CUDA内核的支持。

另一种选择是使用CUDA事件来记录时间。请参阅CUDA 4.0编程指南,其中讨论了使用CUDA事件来测量时间。

另一个选择是使用围绕GPU内核调用的系统计时器。请注意,鉴于内核调用返回的异步性质,您还需要使用主机端GPU同步调用(例如cudaThreadSynchronize())来跟随内核调用,以使此方法适用。如果你选择这个选项,我强烈建议在循环中调用内核,在结束时定时循环+一次同步(因为在不在不同流中执行的内核调用之间发生同步,循环内部不需要cudaThreadSynchronize()),并除以迭代次数。

答案 1 :(得分:0)

无论GPU是否正常工作,C计时器都会继续运行。如果你不相信我那么做这个小实验:在GPU_Function_Call上进行1000次迭代,做一个 for循环。将任何C计时器放在for循环周围。现在当你运行程序时(假设GPU功能花费大量时间,如20ms),你会看到它在返回之前用肉眼运行几秒钟。但是当你打印C时,你会注意到它会显示你几毫秒。这是因为C计时器没有等待1000 MemcpyHtoD和1000 MemcpyfromDtoH和1000内核调用。

我建议使用 CUDA事件计时器或更好的 NVIDIA Visual Profiler 来计时GPU并使用秒表(增加迭代以减少人为错误)来衡量完整的时间。然后从总计中减去GPU时间以获得CPU时间。