摘要:本文档以XX密码算法为例,研究对CPU的睿频、超线程、SIMD指令集等特性对密码算法性能的影响。初步结结论为:1)睿频很重要,默认是开启的,尽量不要关闭,注意全核睿频通常小于最大睿频(单核睿频);2)超线程的1核2线程性能要打折扣,资源竞争使得2个线程的性能并不是1个线程的2倍,要乘个系数;3)SIMD指令集的确可以改善算法,但与超线程相遇时会显著降低性能;越是高级的SIMD指令就越是降得多。线程个数开到物理核心数而不是逻辑核心数可能是更好的选择。
1. 背景
测试XX密码算法的多线程性能时,多线程的性能数据比我们想象的低得多,多线程时在Intel 10th I7 CPU(8核/16线程)和Intel 11th I7 CPU(8核/16线程)上分别测试了单线程和多线程的性能,每个线程的性能只有单线程性能的60%左右。如下表1。
表1 单线程和多线程性能对比
测试平台 |
单线程性能S1 (mbps) |
16线程性能S16 (mbps) |
16线程平均每个线程性能SA(mbps) |
效率比值 (SA / S1) |
10th I7 Linux GCC |
7342 |
73658 |
4604 |
62.7% |
11th I7 Win10 VS2019 |
9790 |
84156 |
5260 |
53.7% |
基于此现象,探索下CPU相关设定对多线程性能的影响。
2. 测试平台与测试参数设定
2.1 测试平台
后续测试基于如下平台进行。
- CPU:Intel 11th I7(以下信息来至于www.cpu-world.com)
- 基准频率:2.5GHz
- 睿频:睿频加速技术2.0(Turbo Boost technology 2.0)时,单核最大睿频4.8GHz,全核最大睿频4.4GHz;睿频加速技术3.0(Turbo Boost technology 3.0)时,单核最大睿频4.9GHz;全核最大睿频未列出(估计也是4.4GHz)
- 核心数:8核/16线程
- 操作系统:Win10工作站版
- 编译器:VS2019,Release、“最大优化优选速度/O2”、“启用增强指令集:未设置”
2.2 要探究的CPU特征
测试了如下CPU特征在开关时对密码算法性能的影响:
- 睿频:根据睿频开闭,了解睿频对CPU主频和密码算法性能的影响;
- 超线程:因该CPU为8个物理核,所以超线程未开启时测试了1、8线程,超线程开启时测试了1、8、16线程,以此了解线程达到物理核心数和逻辑核心数时的性能,以及物理核全功率(线程数等于物理核心数)核逻辑核全功率(开启超线程时线程数设置为逻辑核心数)时的密码算法的性能表现。
- 指令:分为普通指令、SSE指令、AVX指令、AVX512指令,以了解不同类型指令集实现的密码算法受多线程的影响程度。
3. 测试结果与解释
3.1 测试结果
下表2列出了多线程时每个线程的效率,它是同样参数配置下多线程并行时每个线程的性能除以单线程测试时的性能。例:在“1-3”行和“普通指令”列的数字为75.8%,75.8% =在“1-3”行的参数设定下每个线程的性能 / 同样配置下仅开1线程的性能。测试数据显示,在“1-3”行的参数设定下(睿频开、超线程开),16个线程的总性能为11491 mbps,平均每个线程的性能为11494 / 16 = 718.4 mbps,而仅运行1个线程的性能为948 mbps,因此,效率 = 多线程时每个线程的性能 / 单线程的性能 = 718.4 / 948 = 75.8%。
表2 测试效率汇总
序号 |
睿频 |
超线程 |
线程数 |
普通指令 |
SSE系列 指令 |
AVX1+2 指令 |
AVX512 指令 |
||||
性能 |
效率 |
性能 |
效率 |
性能 |
效率 |
性能 |
效率 |
||||
1-1 |
开 |
开 |
1 |
948 |
100.0% |
2811 |
100.0% |
9790 |
100.0% |
13780 |
100.0% |
1-2 |
开 |
开 |
8 |
6785 |
89.5% |
20262 |
90.1% |
69580 |
88.8% |
90999 |
82.5% |
1-3 |
开 |
开 |
16 |
11491 |
75.8% |
32519 |
72.3% |
84156 |
53.7% |
104483 |
47.4% |
2-1 |
开 |
关 |
1 |
941 |
100.0% |
2828 |
100.0% |
9868 |
100.0% |
13528 |
100.0% |
2-2 |
开 |
关 |
8 |
6784 |
90.1% |
20415 |
90.2% |
69930 |
88.6% |
82439 |
76.2% |
3-1 |
关 |
开 |
1 |
484 |
100.0% |
1450 |
100.0% |
5070 |
100.0% |
7089 |
100.0% |
3-2 |
关 |
开 |
8 |
3881 |
100.2% |
11605 |
100.0% |
39119 |
96.4% |
52201 |
92.0% |
3-3 |
关 |
开 |
16 |
6505 |
84.0% |
18674 |
80.5% |
50987 |
62.9% |
67371 |
59.4% |
4-1 |
关 |
关 |
1 |
485 |
100.0% |
1449 |
100.0% |
5053 |
100.0% |
7095 |
100.0% |
4-2 |
关 |
关 |
8 |
3856 |
99.4% |
11474 |
99.0% |
40325 |
99.8% |
55968 |
98.6% |
3.2 睿频及其对性能的影响
睿频依靠处理器的智能自主处理,会根据实际运行情况智能调整处理器的频率、电压。简言之,忙时提升主频快速处理任务,闲时降低主频省电节能。参见表3。
表3 睿频对主频的影响
CPU闲置时 |
CPU繁忙时 |
|
开启睿频 |
由设定而定(注1) |
高频率运行(如4.8G左右) |
关闭睿频 |
以基准频率运行(如2.5G) |
以基准频率运行(如2.5G) |
注1:根据系统设置不同,闲置状态下的CPU频率可能差异较大;如Win10操作系统的“电源计划”设定为“平衡”,则闲置时以低于基准频率的较低频率运行(如1.0GHz);如Win10操作系统的“电源计划”设定为“卓越性能”,则闲置时以也会以较高的睿频运行(如4.7GHz)。
例如,图1为开启睿频技术时,CPU繁忙态的CPU处于4.69GHz的高频率状态;图2为关闭睿频技术时,即使CPU处于繁忙状态CPU仍然按基准频率2.5GHz运行。
1a) CPU睿频开启时 1b) CPU睿频关闭时
图1 CPU睿频对运行程序的影响
表1中“3-X”和“4-X”关闭睿频使得执行性能大大降低,在实际中没有太多实用价值,这两栏仅供了解即可。
通常有如下两个睿频概念。
- 最大睿频:个人理解就是在极少量的高能耗线程(如1个线程)运行时,CPU能够达到的最大频率,基本就是单核最大睿频,如这颗CPU的最大睿频能达到4.9GHz。
- 全核最大睿频:所有核都忙于干活儿时,CPU达到的最大睿频。随着开启的高能耗线程越来越多,睿频会逐渐降低,睿频降低的原因估计是功率和温度限制。因此全核最大睿频一般比最大睿频小,如这颗CPU的全核最大睿频能达到4.4GHz。
在测试过程中就发现CPU主频从单线程时的4.8GHz降低至16线程时的4.4GHz,前者就是最大睿频,后者就是全核最大睿频。
3.4 SIMD指令集及其对性能的影响
SIMD指令集有很多,比如128比特并行的SSE指令集、256比特并行的AVX指令集、512比特并行的AVX512指令集。目前已经有很多使用SIMD指令集与其它特定指令集来优化提升密码算法性能的研究,的确也显著改善了密码算法的性能。其性能提升主要与SIMD并行处理的分组数m有关,但性能提升并不会简单粗暴的提升至m倍,这与优化实现的算法、使用指令的指令延时、指令吞吐量等众多因素相关。
3.5 超线程及其对性能的影响
超线程把两个逻辑内核模拟成两个物理核/芯片,让单个处理器就能使用线程级的并行计算,进而兼容多线程操作系统和软件。超线程技术充分利用空闲CPU资源,在相同时间内完成更多工作。
虽然采用超线程技术能够同时执行两个线程,当两个线程同时需要某个资源时,其中一个线程必须让出资源暂时挂起,直到这些资源空闲以后才能继续。因此,超线程的性能并不等于两个CPU的性能。这就使得超线程技术下的两个线程之间会争抢CPU资源。与超线程相关的现象分析如下表。
表4 分析超线程相关测试现象
现象 |
例子 |
原因分析 |
线程数未超过物理核心数时,超线程开关对性能无影响 |
表1中“1-2”和“2-2”8线程时各指令的效率差异小,如89.5%和90.1%。 |
显然 |
线程数未超过物理核心数时,效率有10%的降低 |
表1中的“1-2”和“1-3”在8线程时,普通指令、SSE指令、AVX指令的效率相差不大,都在90%左右。 |
应为睿频降低所致,从最大睿频(单核睿频)到全核睿频约降10%。 |
线程数未超过物理核心数时,超线程使得性能显著降低 |
表1中的“1-2”和“2-2”开16线程后,普通指令效率骤降为75.8%,SSE进一步降至72.3%,AVX指令更是降为惊人的53.7%。如表5和图2。 |
物理核内资源竞争所致。猜测越高级指令集,内部越复杂,资源越有限,竞争越激烈,导致效率降低越显著。 |
表5 普通指令和AVX指令在8线程和16线程时的局部对比
序号 |
睿频 |
超线程 |
线程数 |
普通指令效率 |
SSE指令效率 |
AVX1+2效率 |
1-2 |
开 |
开 |
8 |
89.5% |
90.1% |
88.8% |
1-3 |
开 |
开 |
16 |
75.8% |
72.3% |
53.7% |
图5 不同指令集在满线程和超线程时的效率对比图
因此,超线程的确是可以提升性能,使用普通指令和SSE指令时,可以考虑利用超线程开启超过物理核心数的线程;但是如果超线程遇到AVX指令或AVX512指令,那性能提升就非常有限了,此时建议谨慎考虑。
4. 初步结论
经过以上初步分析,结论为:
- 睿频很重要,默认是开启的,尽量不要关闭,注意全核睿频通常小于最大睿频(单核睿频);虽然在不开启睿频也不开启超线程时,多线程几乎无性能损失,但是又有多少场景能接受CPU全程以低速的基准频率来运行呢。
- 指令集对算法的性能提升较为显著,当然这更多取决于密码算法怎样使用SIMD指令来优化密码算法以及SIMD并行处理的分组数。从快速实现的角度讲,也希望更多的密码算法在设计时将并行实现考虑进去。
- 超线程可以提升性能,但资源竞争使得2个线程的性能并不是1个线程的2倍;特别是当超线程遇到SIMD指令集时,若使用普通指令和SSE指令时,建议利用超线程开启超过物理核心数的线程,可以进一步提升性能;但超线程遇到AVX/AVX512指令,那性能提升就非常有限了,而且越是高级的SIMD指令有效率越是有限,所以建议谨慎考虑。
密码算法多线程运行时的建议:在密码算法用到了AVX/AVX512等高级SIMD指令时,如果不是一味的追求性能,线程个数开到物理核心数而不是逻辑核心数可能是更均衡的选择。这感觉有点像老鸟在画《龙珠》时,比特兰特斯追求更高能量的超1变身,虽然力量更大但膨胀的肌肉降低了速度,孙悟空更均衡的超1变身考虑了力量和速度的折中。