0

我一直在对一些 CUDA 程序(2D 和 3D 晶格 Boltzmann 求解器)进行基准测试,并且遇到了一些不寻常的事情;我希望求解器的性能随着时间的推移会出现一些随机变化,但是在各种不同的问题大小、块大小、操作系统和 GPU 上(更不用说 2D 和 3D 代码是完全独立的,而不是不同的配置)同一个程序)我可以看到内核执行时间非常明显的正弦波动。对于我测试过的两个 GPU(K5000m 和 K20c)来说,变化的频率似乎在 10-12Hz 范围内。

对此有什么已知的解释吗?我的首选想法是热/电源管理,但我无法证明这一点。有没有其他人经历过这个?

更多信息和示例

一个小示例代码的 MSVC2010 项目可以在https://docs.google.com/viewer?a=v&pid=sites&srcid=ZGVmYXVsdGRvbWFpbnxtYXJram1hd3NvbnxneDplOWMwNWNhNDA4MmMwMjg该项目需要 CUDA 5.0 和一个 sm_30 设备,虽然只有一个文件所以构建手动项目将是微不足道的。代码是相当不言自明的,一个简单内核的 100 次迭代(默认情况下执行从多个数组读取和写入多个数组的内核)并将它们的结果打印到文件中。对执行时间进行 FFT 会在 K5000m 上产生接近 11Hz 的可见峰值。我会发布一张图片,但我没有声誉。

4

1 回答 1

1

Windows 对 GPU 内核执行的详细时序有行为影响,尤其是在 WDDM 模式下运行 GPU 时。请最好在 X 不在 GPU 上运行的 Linux 环境中重新运行您的观察和 FFT。这将为您提供最一致的行为。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.001888 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.001888 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 的频率(甚至不确定这意味着什么,因为这些数据点没有我可以看到的时间戳) - 你的话我记住了。

于 2013-08-21T00:53:06.440 回答