我开发了一个高性能的Cholesky分解程序,应该在单个CPU上(不考虑超线程)的峰值性能约为10.5 GFLOPs。但是当我测试其性能时,出现了一些我不理解的现象。在我的实验中,我测量了从250到10000逐渐增加的矩阵维度N的性能。
CPU频率和温度在第二和第三张图中显示。实验在400秒内完成。当实验开始时,温度为51度,当CPU忙碌时,温度迅速上升至72度。之后它缓慢增长到最高点78度。 CPU频率基本稳定,并且在温度升高时没有下降。
所以,我的问题是:由于CPU频率没有下降,为什么性能会受到影响?
温度如何影响CPU性能?从72度到78度的增加是否真的会使事情变得更糟?
![enter image description here](https://istack.dev59.com/paWZ4.webp)
在高性能计算中,这显然是非常无聊的设置:我们希望机器一直以最高性能运行,直到完成非常大的任务为止。因此,这种停顿毫无意义。但这有助于更好地了解温度对性能的影响。
这次,我们看到所有N都实现了峰值性能,就像理论支持的那样!
CPU频率和温度的周期特征是冷却和提升的结果。温度仍然呈上升趋势,仅因为随着N的增加,工作负载变得越来越大。这也证明了需要更多的冷却时间来使其足够冷却,就像我所做的那样。
达到峰值性能似乎排除了除温度以外的所有影响。但这真的很烦人。基本上它说计算机在HPC中会感到疲劳,所以我们不能获得预期的性能提升。那么开发HPC算法有什么意义呢?
OK,这是新的一组图表:
我不知道为什么无法上传第6个图。SO在添加第6个图时不允许我提交编辑。对于CPU频率的图表,我很抱歉无法附加。
作为总体度量。
- 在我的算法中,我应用了缓存(调整了块因子),并且在计算期间始终使用单位步幅访问数据,因此缓存性能是最佳的;TLB和分页问题已被消除;
- 我有8GB可用RAM,并且在实验过程中最大内存占用量不到800MB,因此没有交换发生;
- 在实验期间,没有运行像Web浏览器这样的资源密集型进程。只有一些真正便宜的后台进程在运行,以记录每2秒的CPU频率和CPU温度数据。
CPU频率和温度在第二和第三张图中显示。实验在400秒内完成。当实验开始时,温度为51度,当CPU忙碌时,温度迅速上升至72度。之后它缓慢增长到最高点78度。 CPU频率基本稳定,并且在温度升高时没有下降。
所以,我的问题是:
![enter image description here](https://istack.dev59.com/ZmjX3.webp)
![enter image description here](https://istack.dev59.com/ZqGIq.webp)
![enter image description here](https://istack.dev59.com/paWZ4.webp)
CPU信息
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之间时,冷却时间为5秒;
- N在2750和5000之间时,冷却时间为20秒;
- N在5250和7500之间时,冷却时间为40秒;
- 最后,N在7750和10000之间时,冷却时间为60秒。
在高性能计算中,这显然是非常无聊的设置:我们希望机器一直以最高性能运行,直到完成非常大的任务为止。因此,这种停顿毫无意义。但这有助于更好地了解温度对性能的影响。
这次,我们看到所有N都实现了峰值性能,就像理论支持的那样!
CPU频率和温度的周期特征是冷却和提升的结果。温度仍然呈上升趋势,仅因为随着N的增加,工作负载变得越来越大。这也证明了需要更多的冷却时间来使其足够冷却,就像我所做的那样。
达到峰值性能似乎排除了除温度以外的所有影响。但这真的很烦人。基本上它说计算机在HPC中会感到疲劳,所以我们不能获得预期的性能提升。那么开发HPC算法有什么意义呢?
OK,这是新的一组图表:
![输入图片描述](https://istack.dev59.com/sstot.webp)
![输入图片描述](https://istack.dev59.com/0OI9Z.webp)
更新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
由于我没有将计算固定在一个核心上,操作系统会交替使用两个不同的核心。更合理的做法是
freq[i] <- max (freq0[i], freq1[i])
temp[i] <- max (temp0[i], temp1[i])
作为总体度量。