“跑分” 这件事,相信各位读者对此并不陌生。“不服跑个分” 已经成为了某些手机发布时的保留节目。对于普通用户来说,最常用的跑分程序大概就是鲁大师和安兔兔了。安装一个程序,然后再点几个按钮,几分钟以后跑分结果就出来了,整个过程简单轻松。
如果要跑分的平台不是运行 Windows 系统的 X86 平台,也不是运行安卓系统的 ARM 平台,而是运行国产操作系统的国产处理器平台,用什么方法来衡量这些平台上的处理器性能呢?这时,我们可以使用一个重量级的跑分程序 SPEC CPU 2006。
SPEC CPU 2006 包含 12 项整数测试,17 项浮点测试,共计 29 个测试项目。测试以后会分别根据每一项的测试成绩,用几何平均算出最终的整数测试成绩和浮点测试成绩。根据编译选项设置的不同,可以得到处理器的基础(base)性能和峰值(peak)性能。对于 SPEC CPU 2006 的具体内容,网上已经有很多材料了,在此我不做赘述。在IT之家IT号这里,我着重介绍单核 peak 性能的测试。
一、三款国产处理器性能对比
使用 SPEC CPU 2006,我们可以对各种国产处理器的性能做一个评价。这里,我们首先对比三款国产处理器的 SPEC CPU 2006 性能。
飞腾 FT2000-4 处理器没有官方的 SPEC CPU 2006 性能。网友yygg100使用飞腾的内部测试配置文件,得到了 FT2000-4 处理器的整数峰值性能为 23.2 分;遗憾的是,在这个测试中并没有进行浮点性能的测试,该网友也没有提供配置文件的细节。这个成绩已经初步实现了飞腾在 2016 年的规划,即到 2018 年 SPEC CPU 2006 性能达到 20~30 分。
兆芯则直接在官网上公开了处理器的性能,目前 KX-6000 的性能为 3GHz 下单核整数性能 29.2 分,浮点性能则高达 38 分。由于兆芯处理器采用 X86 指令集,在进行性能测试的时候兆芯可以使用 Intel 编译器来获得最高性能,这也是兆芯的生态优势之一。
龙芯 3A4000,采用 28nm 工艺,主频 2.0 GHz 下,单核 peak 整数性能 21.1 分,浮点性能 21.2 分;单核 base 整数 19.1 分,浮点 18.7 分。我在去年试图复现这个成绩,没有成功,即使超频到 2.15GHz 的情况下,最终的成绩也没有超过 20 分,深感遗憾。现在我想再试一下,以正视听。
二、影响处理器性能的因素
在性能评测中,影响性能的因素有很多,简单的讲可以概括为以下几个个部分:
处理器核的设计水平。处理器核的性能是决定处理器性能的最关键因素。在相同的主频下,使用高效处理器核的处理器性能更好。
处理器主频。采用同样的处理器核,更高的处理器主频能够有更好的性能。优秀的制造工艺能够显著提高处理器的主频。比如,同样采用 FT663 内核,采用 40nm 工艺的飞腾 FT2000-2 处理器主频只有 1.0 GHz,而采用 16/14 nm 工艺的 FT2000-4 处理器主频高达 2.6 GHz。采用优秀的物理设计,也能够显著提高处理器的主频,比如龙芯 3A3000 处理器和龙芯 3A4000 处理器都采用 28 nm 工艺流片,前者主频只有 1.5 GHz,而后者的主频提高到了 2.0 GHz。
处理器的缓存大小。众所周知,Intel 的处理器阉割缓存以后就变成了奔腾。更大的处理器缓存,有助于提高处理器的性能。比如,龙芯 3A2000 处理器共享 3 级缓存为 4M,龙芯 3A3000 处理器的共享三级缓存提高到了 8M,使得 3A3000 处理器的性能有了更多提升。
内存的访存速度。有部分应用是访存密集型的,对这些应用来说,提高内存的访存性能能够有效提高处理器性能。影响内存性能的因素有内存的频率、内存通道的数目。如果主板上有多个处理器,还需要考虑每个处理器和内存的距离。
编译器和编译选项。优秀的编译器,加上与应用特征匹配的编译选项,能够显著提高计算的性能。在 Intel 平台上,要全面发挥处理器的性能,最佳选择是使用 Intel 编译器;如果使用开源的 GCC 编译器,往往不能充分发挥处理器的能力。比如,兆芯 KX6000 处理器 SPEC CPU 2006 峰值性能整数 29.2 分,浮点 38 分,就是使用 Intel 编译器测出来的。此外,还有大量的编译选项提高二进制文件性能,选择合适的编译选项是提高性能的重要手段。比如,对于支持 avx 指令的处理器,在使用 GCC 进行编译的时候开启 - mavx 选项,可能会显著提高程序的性能。
操作系统内核。过于古老的操作系统内核可能无法很好的支持新处理器的特性。如果操作系统内核编译的时候没有设定正确的选项,也可能无法支持新的处理器特性。以龙芯处理器为例,龙芯 3A4000 处理器增加了 MSA 指令,支持 128 位向量操作,如果操作系统内核不支持 MSA,那么所有启用了 MSA 指令的二进制文件都无法正常运行,也就无法发挥处理器的性能。
程序运行依赖的底层函数库。程序运行依赖的 libc 库和 libm 库,对处理器性能的发挥也有影响。高性能的数学库能够加快底层数学函数的计算,提高计算性能。如果是进行矩阵运算、信号处理,那么高性能的 BLAS、LAPACK 库、FFT 库也能提高程序的运算速度。
三、龙芯 3A4000 处理器的 SPEC CPU 2006 性能调优
在对龙芯 3A4000 进行性能测试的时候,我测试了操作系统内核、内存性能、主频、编译选项等对操作系统性能的影响。
1. 编译器优化选项
首先,我考察了编译器的各种优化选项对性能的影响。此时,我的测试环境是龙芯 3A4000 处理器,主频 1.8GHz, 配单根 8GB 2400MT/s 内存条。操作系统为龙梦 Fedora 28,内核版本为 5.4.60,编译器版本为 GCC 8.4。我简单尝试了 O2、O3、Ofast 三个优化选项,得到的 SPEC CPU 2006 性能如图 2 所示。
这个性能看起来实在是不怎么样。从 O2 到 O3 再到 Ofast,程序的性能有些许的提升,但距离龙芯官方生成的 20 分还差的很远。接下来,我们可以通过进一步编译器参数来对处理器的性能进行优化。我采用的主要编译器参数和作用如下表所示。
编译器参数 |
作用 |
-march=loongson3a |
开启针对龙芯 3A 处理器的优化 |
-mabi=n32 |
使用 N32 的 ABI |
-funroll-all-loops |
循环展开 |
-mmsa |
使用 MIPS SIMD 指令 |
-flto |
开启链接时优化 |
-ftree-parallelize-loops |
开启自动并行 |
-fprofile-generate,-fprofile-use |
使用 profile guided optimization |
对每个测试项目的编译参数,都进行了调整,最终得到的 peak 性能分数提高到了整数 18.09 分,浮点 17.64 分,相对于仅使用 Ofast 参数的性能分别提高了 34% 和 24%。图 3~ 4 对比了只使用 Ofast 参数的性能和 peak 性能的对比。
图 4 peak 性能和仅采用 Ofast 选项的性能对比
从测试的结果看,仅仅依靠编译选项的调整,就可以大幅提高应用程序运行的速度。对于部分测试的性能,甚至有数倍的性能提升。比如,456.hmmer 测试项目的分数从 11.7 分提高到 27.4 分,性能是之前的 2.3 倍,这主要是因为启用了 MIPS 的 SIMD 指令;436.cactusADM 测试项目的分数从 2.5 分提高到 7.3 分,性能是之前的 2.9 倍。
2. 操作系统内核的选择
除了编译选项的调整,操作系统内核也对应用程序的性能有着非常大的影响。采用同样的编译选项,我分别使用 Fedora 28 的 5.4.60 内核以及龙芯提供的 4.19.161 内核进行了性能测试。使用 4.19.161 内核,进一步提升了程序的性能,整数 / 浮点性能分别从 18.09 分 /17.64 分,提高到了 18.8 分 / 19.92 分,性能的提升分别为 4% 和 13%。
如图 5 所示,429.mcf 性能从 20.56 分提高到了 24.9 分,性能提高了 21%。而性能提升最为明显的项目是 436.cactusADM,分数从 7.3 分提高到了 44.9 分,性能暴涨到原来的 6.15 倍,简直像开挂了一样。这也表明龙芯公司在操作系统内核的优化上,也做了很多工作。
3. 内存性能
进一步,我对比了内存性能对系统性能的影响。当系统增加一根内存条,组成双通道以后,整体的性能再次提升,整数 / 浮点性能分别提升到了 19.60 分和 20.99 分,相比之前的测试分别又提高了 4.3% 和 5.5%。其中,性能提升较大的项目如图 6 所示。很明显,这些项目也是访存密集型的。在对内存性能进行调优以后,1.8 GHz 主频的龙芯 3A4000 处理器的浮点性能已经超过了 20 分。
从测试的结果也可以看出,462.libquantum 测试对访存性能非常敏感,将内存从单通道升级到双通道,性能提升了 66%。
4. 处理器主频
以上的测试都是在 1.8 GHz 主频下完成的。实际上,龙芯 3A4000 处理器睿频频率可以到 2.0 GHz。而使用龙芯内核开发者 flygoat 提供的龙梦 A1901 主板内核超频补丁,还可以进一步提升龙芯 3A4000 处理器的主频到 2.2 GHz。
提高主频的话,龙芯 3A4000 处理器的性能究竟可以提升到什么程度?从下图 7 可以看出,在 2.0GHz 主频下,整数性能和浮点性能分别为 21.3 分和 22.9 分,这已经超过了龙芯官方提供的整数 21.1 分、浮点 21.2 分的 peak 性能。我所测试的 A1901 主板,3A4000 处理器可以稳定在 2.1GHz 主频下,在此主频下整数性能和浮点性能分别为 22.2 分和 23.8 分。
然而,这并非是龙芯 3A400 处理器的性能极限。我在测试中使用的是 GCC 8.4 编译器,其中对龙芯 3A4000 中指令的支持并不完善。比如,龙芯 3A4000 中实现了 256 位向量操作指令 LASX,但我在跑分的时候只用到了 128 位的向量操作指令 MSA。如果编译器中的编译选项对龙芯处理器进行了深度的调优,整个系统的性能还有进一步提升的空间。
经过上述的测试,我对系统的硬件、软件等方面进行了多种调优,通过优化编译器选项、操作系统内核、内存性能,以及对处理器的超频,将 SPEC CPU 2006 的性能从最初的整数 13.1 分、浮点 12.2 分,提高到了最终的整数 22.2 分、浮点 23.8 分(2.1 GHz)。这些优化的经验,对于类似的系统同样适用。
四、针尖对麦芒:飞腾 FT2000/4 vs 龙芯 3A4000 处理器
我们了解了龙芯 3A4000 处理器的性能,那么和友商的飞腾 FT2000-4 处理器相比,龙芯 3A4000 的差距有多大呢?
项目 |
龙芯 3A4000 |
飞腾 2000-4 |
处理器核 |
GS464V |
FTC663 |
指令集 |
LoongISA |
ARM V8 |
处理器核数 |
4 |
4 |
处理器主频 |
2.0 |
2.6 |
工艺 |
28nm |
14nm |
功耗 |
30~50W |
10~15W |
内存控制器 |
DDR4 最高 2400MT/s |
DDR4 最高 3200MT/s |
可以看出,采用先进工艺的 FT2000-4 处理器在主频和功耗上大幅领先龙芯 3A4000 处理器。那么处理器的真实性能有多大的差距呢?最近,贴吧网友 yygg100 对 FT2000 处理器的 SPEC CPU 2006 的 peak 性能进行了测试,得到了在 2.6GHz 主频下单核 peak 整数性能 23.2 分的成绩。虽然他的测试并不完善,只有整数性能测试,没有浮点性能测试的数据,但这依旧是目前已知的 FT2000 处理器单核性能的最高值。
我们将这个数据与龙芯 3A4000 在 2.0GHz 下的性能进行了对比,龙芯 3A4000 性能为 21.3 分。由于龙芯处理器工艺落后,主频较低,主频只有飞腾处理器的 77%,而整数性能达到了飞腾处理器的 92%。
图 8 龙芯 3A4000 和飞腾 FT2000-4 处理器整数性能对比。
从图中可以看出,在 12 项测试中,飞腾处理器在 8 个项目上性能强于龙芯 3A4000,其中 libquantum 这一项的性能差距最大,龙芯处理器性能只有 FT2000 的 58%,因为飞腾处理器不仅主频较高,而且内存频率为 2666MT/s,相比龙芯 3A4000 的 2400MT/s 有明显的优势。
而在 429.mcf,445.gobmk,456.hmmer, 458.sjeng 这 4 个项目上,2.6 GHz 的飞腾 2000 处理器性能弱于 2.0 GHz 的 3A4000 处理器。随着龙芯 3A5000 处理器的上市,飞腾 2000 处理器的单核性能领先优势将会逐渐消失。
五、对龙芯 3A5000 的展望
龙芯 3A5000 处理器已经流片,很快就要发布了。龙芯 3A5000 处理器将采用台积电 12nm 工艺流片,处理器主频有望提高到 2.5 GHz 以上,和友商处理器的主频差距进一步缩小。据称,龙芯 3A5000 的 SPEC CPU 2006 性能将达到 25~30 分。
根据我对龙芯 3A4000 处理器的性能测试,如果把龙芯 3A5000 处理器视为 3A4000 的简单升级版,仅仅提高主频,内存频率和缓存都不变,采用图 7 中的数据,进行一个简单的数据拟合,我预测龙芯 3A4000 处理器在 2.5 GHz 主频时 peak 性能约为整数 25.9 分、浮点 26.7 分。龙芯 3A5000 会将三级缓存大小加倍,提高内存的频率 (有望达到 3200MT/s),还会进一步提升处理器的性能,我们可以假设有这些调整可以带来 5% 的性能提升;龙芯 3A5000 处理器采用了 Loongarch 指令集,摆脱了 MIPS 指令集的历史包袱,根据胡伟武研究员的报告,仅仅是指令集的更新,就可以让性能提升 16.6% 和 9.4%,我们可以保守估计有 9% 的性能提升。龙芯 3A5000 也有望使用真正的 256 位向量指令,而非 MSA 中的 128 位向量,程序运行速度可以进一步提高,可以保守估计这能带来 2% 的性能提升。
根据上面的计算,我认为龙芯 3A5000 处理器的 SPEC CPU 2006 单核 peak 性能可以达到整数 30 分、浮点 30 分。届时,龙芯处理器将在单核性能上追平或赶超其他国产处理器。2021 年下半年,16 核龙芯 3C5000 以及 64 核龙芯 3E5000 的流片,也将提高龙芯处理器的多核性能,有助于龙芯扩展服务器市场。
致谢
本次测试借用了网友 gueenet 的龙芯 3A4000 主机,对他的慷慨和信任我深表感谢!在对内核的性能测试中得到了陈华才、flygoat 的指导。对 SPEC CPU 2006 性能的探索,受到了网友 yygg100 所发视频的启发,对他的视频分享一并表示感谢。封面图由龙芯吧 Windows1089 提供。