运行时间问题

请问大家,我的核函数每次计算时间总是不一样。时间差总是在20ms的范围内波动。

请问这是否正常?谢谢!

(1)如果你的kernel不是稳定的,而是根据输入数据执行不同次数的访存/计算,那么浮动是正常的。

(2)就算你的kernel是稳定的,那么如果你使用了过时的测试手段,那么结果不对也是正常的。

例如您使用了clock(), 那么该函数的能力很差,误差20ms很正常。

此时则推荐您使用QueryPerformanceCounter()/QueryPerformanceFrequency()。它们使用HPET芯片作为时钟源(除非你使用的是古董级主板,无HPET, High-Performance Event Timer)。精度不错。

版主您好!我使用的是QueryPerformanceCounter()/QueryPerformanceFrequency(),测试

计算的数据也一样的,但时间还是有浮动的,不知是否正常啊?谢谢!

善哉。浮动20ms么?不知道您的kernel总时间多少?如果是较大型的,也许正常。

但如果本来就是,例如说100ms, 但却浮动在20ms, 那么如果不是您本身kernel的特性,那么就是计时的问题。

然后我继续估计下:
您的20ms浮动和windows的时间片大小(~10ms-15ms)有点像,所以您可能CPU不是100%空闲,以至于哪怕kernel完成了,进行测试的线程没有机会立刻使用CPU。

所以请尽量保持CPU空闲。

以及,您还可以考虑使用cudaSetDeviceFlags(cudaDeviceScheduleSpin)于您的程序开头,看看如果假设您的kernel较小的情况下,有无改善。(注意,这条建议不一定起到正面效果。请以实际为准)。

以及,您可以使用profiler进行测试。这个较好。(如果可用的话)。

谢谢版主,总时长是100毫秒级。如您所言,在CPU空闲之后,测试时间就比较稳定

了。但还是有微小的波动。

嗯嗯。感谢反馈。现在波动是多少了?(以及您可以考虑多次测试,然后求平均值)。

有的时候,OS的线程调度你无法避免。但是您可以尽量减少调度代价。(例如通过使用更快更强的CPU来减少时间)。

此外,设置同步的调度方式的建议,您尝试后,有正面的还是反面的结果?