2012-01-20 146 views
1

好吧, 因此,我正在CPU上进行一些计算,然后将数字传输到GPU并在那里做一些工作。我想计算在CPU + GPU上执行计算所花费的总时间。我该怎么做?如何计算CPU + GPU的总时间

回答

0

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

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

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

编辑:

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

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

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

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

+0

这些系统定时器是否也考虑在GPU上进行计算所需的时间?我不这么认为......之间,我想要一段代码。因此,只是在主要启动没有帮助 – Programmer

+0

@Programmer请检查我的编辑。 – Patrick87

0

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

我的建议是使用CUDA事件计时器甚至更​​好NVIDIA视觉探查时间GPU和使用秒表(增加迭代以减少人为误差)来测量完成时间。然后只需从GPU中减去GPU时间即可获得CPU时间。

+0

你的第一点并不完全正确。是的,内核启动是异步的,但标准的mempcpy API是阻塞的,所以主机定时器会记录正确的挂钟时间。 – talonmies