我一直在对一些CUDA程序(2D和3D格子boltzmann解算器)进行基准测试,并且遇到了一些不同寻常的事情;我会期望求解器的性能随着时间的推移会有一些随机变化,但是会出现各种不同的问题大小,块大小,OS'和GPU(更不用说2D和3D代码是完全独立的,而不是不同的配置。相同的程序)我可以看到内核执行时间非常清晰的正弦波动。对于我测试的两个GPU(K5000m和K20c),变化似乎具有10-12Hz范围内的频率。
对此有任何已知的解释吗?我的想法是热/电源管理,但我无法证明这一点。还有其他人经历过这个吗?
进一步的信息和例子
可以在https://docs.google.com/viewer?a=v&pid=sites&srcid=ZGVmYXVsdGRvbWFpbnxtYXJram1hd3NvbnxneDplOWMwNWNhNDA4MmMwMjg找到一个用于小示例代码的MSVC2010项目。该项目需要CUDA 5.0和sm_30设备,尽管只有一个文件,因此手动构建项目将是微不足道的。代码是相当自我解释的,简单内核的100次迭代(从几个数组读取内核并默认执行写入多个数组)定时并将其结果打印到文件中。执行执行时间的FFT会在K5000m上产生接近11Hz的可见峰值。我会发布一张图片,但我没有声誉。
答案 0 :(得分:1)
Windows对GPU内核执行的详细时序有行为影响,尤其是在WDDM模式下运行GPU时。请重新运行您的观察和FFT,最好是在Linux上没有运行X的Linux环境中。这将为您提供最一致的行为。 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.00182 0.001888 0.001888 0.001888 0.001888 0.001888 0.00182 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.001888 0.001888 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 0.001888 < / p>
偶尔会有变化,但不要忘记您的cudaTime
变量正在毫秒中捕获时间。因此,我在上述数据中看到的变化大多数是小于1微秒的变化,运行起来。
抛出第一个数字,我看到的最大变化在少数情况下约为2-3微秒。鉴于测量的执行时间通常小于2微秒,这是一个很大的变化,但它仍然在噪声中,而不是像你报告的10微秒那样。
对于我未经训练的眼睛,我也没有在数据中看到任何正弦曲线模式,但是如果你告诉我那里有一个11Hz的频率(甚至不确定那是什么意思,因为这些数据点没有时间标记我可以看到) - 我会接受你的话。