我开发了一个高性能Cholesky 分解例程,在单个 CPU 上应具有约 10.5 GFLOP 的峰值性能(无超线程)。但是当我测试它的性能时,有一些我不明白的现象。在我的实验中,我测量了矩阵维度 N 从 250 增加到 10000 时的性能。
- 在我的算法中,我应用了缓存(带有调整的阻塞因子),并且在计算期间始终以单位步幅访问数据,因此缓存性能是最佳的;消除了TLB和分页问题;
- 我有 8GB 可用 RAM,实验期间最大内存占用低于 800MB,因此不会出现交换;
- 在实验过程中,没有像Web浏览器这样的资源消耗大的进程同时运行。只有一些非常便宜的后台进程正在运行,每 2 秒记录一次 CPU 频率和 CPU 温度数据。
我预计无论我测试的 N 是什么,性能(以 GFLOP 为单位)都应保持在 10.5 左右。但在实验中间观察到性能显着下降,如第一张图所示。
CPU频率和CPU温度如图2和3所示。实验在 400 秒内完成。实验开始时温度为51度,当CPU繁忙时温度迅速升至72度。之后慢慢增长到最高78度。 CPU频率基本稳定,温度高时没有下降。
所以,我的问题是:
- 既然CPU频率没有下降,为什么性能会受到影响?
- how exactly does temperature affect CPU performance? Does the increment from 72 degree to 78 degree really make things worse?
CPU info
System: Ubuntu 14.04 LTS
Laptop model: Lenovo-YOGA-3-Pro-1370
Processor: Intel Core M-5Y71 CPU @ 1.20 GHz * 2
Architecture: x86_64
CPU op-mode(s): 32-bit, 64-bit
Byte Order: Little Endian
CPU(s): 4
On-line CPU(s) list: 0,1
Off-line CPU(s) list: 2,3
Thread(s) per core: 1
Core(s) per socket: 2
Socket(s): 1
NUMA node(s): 1
Vendor ID: GenuineIntel
CPU family: 6
Model: 61
Stepping: 4
CPU MHz: 1474.484
BogoMIPS: 2799.91
Virtualisation: VT-x
L1d cache: 32K
L1i cache: 32K
L2 cache: 256K
L3 cache: 4096K
NUMA node0 CPU(s): 0,1
CPU 0, 1
driver: intel_pstate
CPUs which run at the same hardware frequency: 0, 1
CPUs which need to have their frequency coordinated by software: 0, 1
maximum transition latency: 0.97 ms.
hardware limits: 500 MHz - 2.90 GHz
available cpufreq governors: performance, powersave
current policy: frequency should be within 500 MHz and 2.90 GHz.
The governor "performance" may decide which speed to use
within this range.
current CPU frequency is 1.40 GHz.
boost state support:
Supported: yes
Active: yes
更新1(对照实验)
在我最初的实验中,CPU从N=250一直忙到N=10000。很多人(主要是那些在重新编辑之前看到这篇文章的人)怀疑CPU过热是性能下降的主要原因。然后我回去安装了lm-sensors
linux包跟踪这些信息,确实,CPU温度上升了。
但为了完成图片,我做了另一个对照实验。这次,我在每个 N 之间给 CPU 一个冷却时间。这是通过要求程序在 N 次循环迭代开始时暂停几秒钟来实现的。
- N在250~2500之间,冷却时间为5s;
- N在2750~5000之间,冷却时间为20s;
- N在5250~7500之间,冷却时间为40s;
- 最后对于7750到10000之间的N,冷却时间为60s。
请注意,冷却时间远大于计算所花费的时间。对于 N = 10000,在峰值性能下 Cholesky 分解只需要 30 秒,但我要求 60 秒的冷却时间。
这当然是一个非常无趣高性能计算中的设置:我们希望我们的机器始终以峰值性能工作,直到完成一个非常大的任务。所以这种停顿是没有意义的。但它有助于更好地了解温度对性能的影响。
这次,我们看到所有 N 都达到了峰值性能,正如理论所支持的那样!CPU频率和温度的周期性特征是散热和升压的结果。温度仍然有增加的趋势,只是因为随着N的增加,工作量越来越大。这也证明了需要更多的冷却时间才能充分冷却,正如我所做的那样。
达到峰值性能似乎排除了除温度以外的所有影响。但这确实很烦人。基本上它表示计算机在 HPC 中会感到疲劳,因此我们无法获得预期的性能增益。那么开发HPC算法的意义何在呢?
OK, here are the new set of plots:
不知道为什么我无法上传第6张图。所以在添加第六个数字时根本不允许我提交编辑。所以很抱歉我无法附上 CPU 频率的数字。
更新2(我如何测量CPU频率和温度)
感谢 Zboson 添加 x86 标签。下列bash
命令是我用于测量的命令:
while true
do
cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_cur_freq >> cpu0_freq.txt ## parameter "freq0"
cat sys/devices/system/cpu/cpu1/cpufreq/scaling_cur_freq >> cpu1_freq.txt ## parameter "freq1"
sensors | grep "Core 0" >> cpu0_temp.txt ## parameter "temp0"
sensors | grep "Core 1" >> cpu1_temp.txt ## parameter "temp1"
sleep 2
done
由于我没有将计算固定到 1 个核心,因此操作系统将交替使用两个不同的核心。采取更有意义
freq[i] <- max (freq0[i], freq1[i])
temp[i] <- max (temp0[i], temp1[i])
作为整体测量。