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