2013-08-19 33 views
0

我一直在对一些CUDA程序(二维和三维格子玻尔兹曼求解器)进行基准测试,并且遇到了一些不寻常的事情;我希望随着时间的推移,解算器的性能会出现一些随机变化,但是会超过各种不同的问题大小,块大小,OS和GPU(更不用说2D和3D代码是完全独立的,相同的程序)我可以看到内核执行时间非常明显的正弦波动。对于我测试过的两款GPU(K5000m和K20c),这种变化似乎在10-12Hz范围内有一个频率。CUDA内核性能的时间依赖性变化

对此有任何已知的解释吗?我的想法是热量/电力管理,但我无法证明它。有没有其他人经历过这个?

进一步INFO和实施例

甲MSVC2010项目为一个小例子代码能够在https://docs.google.com/viewer?a=v&pid=sites&srcid=ZGVmYXVsdGRvbWFpbnxtYXJram1hd3NvbnxneDplOWMwNWNhNDA4MmMwMjg的项目中找到需要CUDA 5.0和sm_30设备,虽然只有一个文件,以便构建项目手动将是微不足道。代码相当自我解释,100个简单内核的迭代(内核从几个数组中读取,并写入几个数组默认执行)被计时并将其结果打印到一个文件中。执行执行时间的FFT可在K5000m上产生接近11Hz的可见峰值。我会张贴一张图片,但我没有声望。

+0

执行时间变化的幅度是多少? – talonmies

+0

在10微秒的数量级上,我最初认为这是使用cudaEvents的时间舍入误差,但他们*应该*具有大约0.5微秒的分辨率。 – mjm26

+0

流体是否以正弦加速模式运动?在这样的内核中有If-句子,并且性能随条件变差而变化(完全随机分支跨线程)和良好的(线程中有关于分支的顺序) –

回答

1

Windows对GPU内核执行的详细时间具有行为影响,尤其是在WDDM模式下运行GPU时。请优先在Linux环境中重新运行观察和FFT,其中X不在GPU上运行。这会给你最一致的行为。 WDDM设置中的CUDA驱动程序在某种程度上受制于Windows操作系统。

我跑你的代码SM35设备上的CentOS 5.5,CUDA 5.5,得到了以下Times.dat输出:

0.007648 0.0024 0.001888 0.001888 0.001888 0.001888 0.001888 0.00192 0.001888 0.001888 0.00192 0.00192 0.001856 0.00192 0.001888 0.00192 0.001888 0.001888 0.001888 0.001888 0.00192 0.001888 0.001888 0.001888 0.001856 0.001888 0.001888 0.001888 0.001888 0.001888 0.001888 0.002016 0.001888 0.001888 0.00192 0.001952 0.001888 0.001888 0.001888 0.001888 0.00192 0.00192 0.001888 0.00192 0.001888 0.001888 0.001888 0.001888 0.001888 0.001888 0.001888 0.001888 0.001888 0.00192 0.001888 0.001888 0.001856 0.001888 0.00192 0.001888 0.001888 0.001888 0.001888 0.001888 0.001888 0.001888 0.001888 0.001888 0.00 1888 0.001888 0.001888 0.003904 0.001888 0.001888 0.001888 0.001888 0.001888 0.001888 0.00192 0.001888 0.001888 0.001888 0.001888 0.001888 0.001888 0.001888 0.001888 0.00192 0.001888 0.001888 0.001888 0.001888 0.00192 0.001888 0.00192 0.001888 0.001888 0.001888 0.001888 0.001888 0.00192 0.001888 0.00192 0.001856 0.001888 0.001856 0.001888 0.001888 0.001888 0.001888 0.001888 0.001888 0.001952 0.001888 0.001888 0.00192 0.00192 0.00192 0.001888 0.001888 0.001952 0.001888 0.00192 0.001888 0.001856 0.001888 0.00192 0.001888 0.001888 0.001888 0.00192 0.001856 0.001888 0.001888 0.001888 0.001888 0.00192 0.00192 0.001888 0.001888 0.00192 0.001888 0.001888 0.001888 0.001888 0.001888 0.00192 0.001888 0.00192 0.001888 0.001888 0.00192 0.001888 0.00192 0.001888 0.001888 0.001888 0.001888 0.001888 0.00192 0.004448 0.001888 0.001952 0.001888 0.001888 0.001888 0.001888 0.001888 0.001856 0.001888 0.001888 0.001888 0.001888 0.001888 0.001888 0.001888 0.00192 0.001856 0.0 01888 0.001888 0.001888 0.001888 0.001856 0.001888 0.001888 0.001856 0.001888 0.001888 0.001888 0.001888 0.001888 0.001888 0.001888 0.001888 0.001888 0.001888 0.001888 0.001888

有偶尔的变化但不要忘记你的cudaTime变量在毫秒捕获时间。所以我在上面的数据中看到的变化大部分是小于1微秒变化的数量级,运行即可运行。

抛出第一个数字,我看到的最大变化在少数情况下大约为2-3微秒。由于所测量的执行时间通常小于2微秒,这是一个很大的变化,但它仍然处于噪音之中,而不是像您所报告的10微秒。

对于我未经训练的眼睛,我也没有在数据中看到任何正弦波模式,但是如果您告诉我那里有11Hz的频率(甚至不确定是什么意思,因为这些数据点没有时间标记我可以看到) - 我会听你的。

+0

时间标记是通过总结先前迭代的执行时间得出的;它显然不是精确的,因为它忽略了对内核进行计时所花的时间,但是关心我的结果的一致性而不是确切的频率。你的结果似乎没有表现出这种行为,我的印象是,我一直使用的K20c没有使用x。也许我错了,我会在该机器上运行我的样本并确认。 – mjm26

+0

至于变化的顺序,我不相信样本会产生,因为它是非常精简的,旨在重现正弦行为而不是幅度。 – mjm26