简介
测Cuda应用性能时受GPU频率影响很大。参考Nvidia的这篇报告提高基准测试结果的稳定性。(视频)
Cuda应用的性能测试结果的稳定性会受到以下几个硬件因素的影响:
- CPU频率
- NUMA结构
- GPU时钟
性能测试时还需要考虑以下因素:
- Cuda JIT编译
- Cuda stream中用Cuda event测试
- 多stream竞争锁
CPU频率
CPU频率对基准测试的影响很大,睿频或者过热降频都会影响基准测试的结果。
linux上cpupower是一个实用的cpu性能监控工具。
监视动态信息:
1 | cpupower monitor -m Mperf |
获取静态信息:
1 | cpupower frequency-info |
用户不能直接控制intel CPU的频率。可以通过手动关闭睿频来获得稳定的基准测试结果。在文件/sys/devices/system/cpu/intel_pstate/no_turbo中写入1。
1 | Set the frequency Scaling Governor to Performance |
这么做会让CPU性能下降,这是为了稳定性做出的牺牲。
NUMA
Cuda主机和设备之间做内存拷贝时可能会出现性能不一致的情况,这可能是NUMA结构导致的。每个设备只能与一个NUMA节点直接pcie连接,当跨节点做内存拷贝时会有限制的性能下降。
numactl指令可以查看NUMA节点的配置:
1 | numactl --hardware |
nvidia-smi指令可以查看多个GPU设备之间的连接情况:
1 | nvidia-smi topo -mp |
numactl指令支持测试时绑定特定cpu和设备:
1 | numactl --cpunodebind=0 --membind=0 ./bandwidthTest --device=0 |
GPU时钟
GPU时钟频率的变化也会影响性能测试的稳定性。
nvidia-smi指令可以用来监控程序运行时CPU的时钟频率:
1 | Show current Performance State and throttling |
为了获得稳定的结果,最佳实践是锁住GPU的时钟频率。
用下面指令获取可用的GPU时钟设定:
1 | nvidia-smi –q –d SUPPORTED_CLOCKS |
用下面指令打印当前GPU时钟:
1 | nvidia-smi –q –d CLOCK |
用下面指令锁住GPU时钟(Volta之后架构):
1 | nvidia-smi –lgc <Default Graphics Clock> |
这么做会让GPU性能下降,这是为了稳定性做出的牺牲。
补充说明
nvidia-smi锁定频率有两种方式(具体可见man nvidia-smi)。这两个锁频方式会同时生效,最佳实践是只用其中一个。
nvidia-smi -lgc- 这个方法的参数是(最小时钟频率, 最大时钟频率)。可以限制时钟频率的最小值和最大值。有个相似的命令是
nvidia-smi -lmc可以控制内存的频率。 - 支持的架构:Volta及以后
- 解锁的命令
nvidia-smi -rgc和nvidia-smi -rmc
- 这个方法的参数是(最小时钟频率, 最大时钟频率)。可以限制时钟频率的最小值和最大值。有个相似的命令是
nvidia-smi -ac- 这个方法的参数是(内存频率上限,显卡频率上限)。只能限制显卡跑应用时频率的最大值。
- 支持的架构:Maxwell及以后
- 解锁的命令
nvidia-smi -rac
此外,多卡情况下可以用-i <device id>来对指定卡做限制。
Cuda JIT
TODO: 完成后半部分