因为工作原因陆陆续续接触到SPEC的测试,由于此项测试相对门槛高一些,测试周期长,网上靠谱的资料不多,遂将自己的测试经验总结下来跟大家分享。
本文只涉及到一些基本的测试知识,欢迎有经验的朋友补充,交流~
0 工具介绍
SPEC是标准性能评估公司(Standard Performance Evaluation Corporation)的简称。SPEC是由计算机厂商、系统集成商、大学、研究机构、咨询等多家公司组成的组织,这个组织的目标是建立、维护一套用于评估计算机系统的标准。
在早些年,业界使用的是其上一个版本SPEC CPU 2000。和SPEC CPU 2000一样,SPEC CPU 2006包括了CINT2006和C FP2006两个子项目,前者用于测量和对比整数性能,而后者则用于测量和对比浮点性能,SPEC CPU 2006中对SPEC CPU 2000中的一些测试进行了升级,并抛弃/加入了一些测试,因此两个版本测试得分并没有可比较性。
SPEC CPU测试中,测试系统的处理器、内存子系统和使用到的编译器(SPEC CPU提供的是源代码,并且允许测试用户进行一定的编译优化)都会影响最终的测试性能,而I/O(磁盘)、网络、操作系统和图形子系统对于SPEC CPU2006的影响非常的小。
SPEC CPU 2006 benchmark是SPEC新一代的行业标准化的CPU测试基准套件。重点测试系统的处理器,内存子系统和编译器。这个基准测试套件包括的SPECint基准和SPECfp基准。 其中SPECint2006基准包含12个不同的基准测试和SPECfp2006年基准包含19个不同的基准测试。SPEC设计了这个套件提供了一个比较标准的计算密集型,高性能的跨硬件的CPU测试工具。在SPEC CPU 2006基准有几种不同的方法来衡量计算机性能。 一种方式是测量计算机完成单一任务的速度; 另一种方式吞吐量,容量或速率的测量。 说明:由于spec2006支持多种类型操作系统。以下安装、测试、移植等介绍均基于Unix 和其他的 Unix-like system如linux。Windows系统不在此范围内。
tips1 :SPEC CPU 2006 是收费工具。
之前在某些文章或论坛下面看到求资源的,建议如果是要做相关CPU测试的话,付费购买,或者向你们的供货商索要吧~
tips2:选择正确的SPEC 安装包
SPEC CPU 2006 跟不同的CPU适配后的工具,所以说x86下的源码包不能再MIPS下运行,MIPS的也不能在ARM下运行,基本概念,给刚接触的人提醒一下。
1 安装和编译
安装和编译分为两种情况:一对于源码,是需要安装和编译的;另一种是在相同环境下编译好的安装包,拷贝过来解压后即可运行使用。
以Ubuntu 16.4为例子,介绍源码的安装和编译过程。
安装
首先下载CPU2006到本地,一般会下载到镜像文件,解压之后可以找到install.sh
tips3:SPEC CPU2006没有安装目录的要求。
~$ ./install.sh
SPEC CPU2006 Installation
Top of the CPU2006 tree is '/media/*/SPEC_CPU2006v1.1'
Enter the directory you wish to install to (e.g. /usr/cpu2006)
/home/myname/cpu2006
Installing FROM /media/*/SPEC_CPU2006v1.1
Installing TO /home/myname/cpu2006
Is this correct? (Please enter 'yes' or 'no')
yes
...
之后等待安装完成,到此安装过程结束。
编译
根据文档,在使用之前需要先配置环境。CPU2006中已经集成了配置环境的方法,只需要执行一条命令就可以完成配置操作
source ./shrc
每次重新打开terminal的时候,都需要先运行该命令,之后才可以正常使用。
在编译工具之前,我们首先需要进入config文件夹,根据自己的需要,复制一份已有的配置文件模板作为自己使用的文件,例如
cp Example-linux64-amd64-gcc43.cfg my.cfg
例如我们只需要测试int型的CPU性能,我们可以执行以下操作:
runspec --config=my.config -T base --action=build int
2 运行
运行的方式很简单,即通过runspec 命令+相应的参数,执行相应的测试。以下面的测试命令为例,介绍SPEC测试。
runspec -config=XX.cfg -size=ref -r 4 -tune=base -noreportable -o text,screen,pdf -I -iterations=3 all
0)配置文件:XX.cfg,配置文件中可以包含上述命令的所有信息,但是runspec命令的优先级高。此文件在spec的解压目录下,由 提供的cfg文件修改而来。
1)测试规模:ref(测试规模有test,ref,train其中test最小跑的时间最短,如果测试编译器正确性的时候可以用test规模,但是想测试性能时候用ref)
2)测试次数:iterations=3次(编译器性能稳定时候测一次就行),也可以写成n 3;
tips4:如果想得到加权统计的结果,也就是常说的cpu的spec分数,需要设置iterations大于等于3。
3)测试范围: all 表示进行fp和int测试(将all替换成int 或 fp 进行定点和浮点的测试;将all替换成456/444等文件编号,表示对某一测试项进行单独测试)
对于CPU的SPEC测试,默认这一项是all,但是对于其中的某一项测试分数不满意,可通过指定此测试项的编号,进行单独测试。测试也会得到一个分数,做单项的性能调优时候,可以用得到。
4)输出格式:-o text,screen,pdf 表示测试完成,生成报告的格式,依次分别是txt,屏幕显示和pdf格式,保存目录在spec解压目录result中。
5)noreportable && reportable : 表示检测/不检测生成的二进制文件是否修改过。
--reportable 如果原来生成的二进制文件被修改了,则运行时会自动重新编译生成二进制文件,确保运行的程序是原始的程序。
6)测试核数:-r 设置测试的CPU核心数目;
7)测试模式:-tune = base 基准测试;-tune = peak 峰值测试;-tune默认是base 可以选择base, peak, or all ,Report 首先是base,其次是peak.
8)-I : 表示测试中,如遇报错,略过错误继续测试;
3 常用测试参数
上面给出了例子,介绍了主要的测试参数配置。下面给出一组常用的测试命令及意义。
a.runspec -c test.cfg -i test -I all 基于最小测试数据集快速执行所有的测试,测试过程中如果某个用例发生错误,则跳过错误用例,继续执行其他用例。一般不用于不用于正式测试,验证环境是否有问题。
b.runspec -c test.cfg -i ref -n 3 -I all 基于最大测试数据集全面执行所有的测试,用于测试单核CPU,测试过程中如果某个用例发生错误,则跳过错误用例,继续执行其他用例。
c.runspec -c test.cfg –r ref –n 3 fp 基于最大测试数据集,只运行fp测试
d.runspec -c test.cfg –r ref –n 3 int 基于最大测试数据集,只运行int测试
e.runspec -c test.cfg -i ref 473.astar 基于最大测试数据集只执行473.astar单个测试。
f runspec –c test.cfg –i ref --rate 4 int 基于最大数据测试集进行rate测试,运行4线程测试的分值
其他命令补充
--action build 创建测试项目 --action onlyrun 只是运行,不进行确认测试结果是否正确 --action report 标准测试 --action clean 清理已经建立的测试项目
tips5:SPEC CPU2006测试的时间很长,举例来说龙芯3A3000三遍浮点测试的时间24小时左右,测试不可中断。
tips6:SPEC CPU2006测试时候,需要一定的硬盘空间,建议大于等于20GB;
4 测试结果
测试结束后在result目录下,查看测试结果,测试结果一般以测试类型和测试次序进行区别,并且会按照整点和浮点进行划分。如果是按照正式reportable的模式进行测试的话,会出一份网页版的正式测试结果,参见下图: 非正式结果可以去asc或txt文档查看,格式例如下文:
Base Base Base Peak Peak Peak Benchmarks Ref. Run Time Ratio Ref. Run Time Ratio -------------- ------ --------- --------- ------ --------- --------- 400.perlbench 9770 430 22.7 S 9770 339 28.8 S 400.perlbench 9770 429 22.8 * 9770 338 28.9 S 400.perlbench 9770 429 22.8 S 9770 339 28.8 * 401.bzip2 9650 559 17.3 * 9650 552 17.5 * 401.bzip2 9650 559 17.3 S 9650 553 17.5 S 401.bzip2 9650 560 17.2 S 9650 552 17.5 S 403.gcc 8050 374 21.5 S 8050 337 23.9 S 403.gcc 8050 367 22.0 * 8050 337 23.9 S 403.gcc 8050 366 22.0 S 8050 337 23.9 * 429.mcf 9120 187 48.9 S 9120 187 48.9 S 429.mcf 9120 188 48.6 * 9120 188 48.6 * 429.mcf 9120 211 43.2 S 9120 211 43.2 S 445.gobmk 10490 559 18.8 S 10490 542 19.4 S 445.gobmk 10490 559 18.8 S 10490 542 19.4 * 445.gobmk 10490 559 18.8 * 10490 541 19.4 S 456.hmmer 9330 213 43.8 S 9330 213 43.7 * 456.hmmer 9330 247 37.8 S 9330 214 43.6 S 456.hmmer 9330 214 43.5 * 9330 213 43.7 S 458.sjeng 12100 616 19.6 * 12100 574 21.1 * 458.sjeng 12100 617 19.6 S 12100 575 21.0 S 458.sjeng 12100 585 20.7 S 12100 574 21.1 S 462.libquantum 20720 14.2 1460 * 20720 14.2 1460 * 462.libquantum 20720 14.4 1440 S 20720 14.4 1440 S 462.libquantum 20720 13.5 1540 S 20720 13.5 1540 S 464.h264ref 22130 578 38.3 * 22130 527 42.0 S 464.h264ref 22130 579 38.2 S 22130 526 42.0 * 464.h264ref 22130 578 38.3 S 22130 526 42.0 S 471.omnetpp 6250 349 17.9 S 6250 288 21.7 * 471.omnetpp 6250 348 17.9 * 6250 288 21.7 S 471.omnetpp 6250 348 18.0 S 6250 289 21.7 S 473.astar 7020 313 22.4 S 7020 313 22.4 S 473.astar 7020 311 22.6 S 7020 311 22.6 S 473.astar 7020 311 22.6 * 7020 311 22.6 * 483.xalancbmk 6900 174 39.7 * 6900 170 40.7 S 483.xalancbmk 6900 174 39.6 S 6900 170 40.5 S 483.xalancbmk 6900 174 39.7 S 6900 170 40.6 * ============================================================================== 400.perlbench 9770 429 22.8 * 9770 339 28.8 * 401.bzip2 9650 559 17.3 * 9650 552 17.5 * 403.gcc 8050 367 22.0 * 8050 337 23.9 * 429.mcf 9120 188 48.6 * 9120 188 48.6 * 445.gobmk 10490 559 18.8 * 10490 542 19.4 * 456.hmmer 9330 214 43.5 * 9330 213 43.7 * 458.sjeng 12100 616 19.6 * 12100 574 21.1 * 462.libquantum 20720 14.2 1460 * 20720 14.2 1460 * 464.h264ref 22130 578 38.3 * 22130 526 42.0 * 471.omnetpp 6250 348 17.9 * 6250 288 21.7 * 473.astar 7020 311 22.6 * 7020 311 22.6 * 483.xalancbmk 6900 174 39.7 * 6900 170 40.6 * SPECint(R)_base2006 36.7 SPECint2006 39.1
此结果来源于网络,可以看出定点峰值测试结果(peak) 36.7分;定点基准测试结果36.7分。
本人实测的龙芯3A3000,单核浮点8-9分,多核浮点26-28分。龙芯3A4000测试结果要好蛮多,可见国产CPU还是取得了不小的进步。
5 具体测试项目
Spec int2006 12个整点测试项目
400.perlbench:C语言编写,同spec2000的253.perlbmk类似,是Perl V5.8.7版本的删减版,同样删除了一下操作系统特性有关的东西,增加了第三方的模块,如:SpamAssassin V2.61,Digest-MD5 v2.33,HTML-Parser v3.35,MHonArc V2.6.8,IO-stringy V1.205,MailTools V1.60,TimeDate V1.16。400.perlbench采用3个脚本进行增加负载或工作。1.主要的负载在于打开 垃圾邮件过滤软件SpamAssassin。采取的过滤方式是采用记分制,也就是说会根据我们所设定的标准来给予分数超过标准值的时候即判定为 SPAM(垃圾邮件),其余为非垃圾邮件。但对SpamAssassin软件做了很大程度的修改,避免一些I/0操作,并且没有使用贝叶斯过滤。2.是比较流行的email到HTML的转换器MHonArc 3.使用了spec2006的工具套件specdiff。
401.bzip2: C语言实现,同spec2000的256.bzip2类似,基于Julian Seward的bzip2 v1.03.唯一的不同是SPEC中的bzip2除了输入外,无文件I/O。所有的压缩和解压都在内存中进行。输入,输出都和gzip的相似。负载包括六个部分:两个小的JPEG图片、一个程序、一个tar包起的几个源程序文件、一个HTML文件、混合文件,包括压缩起来的高可压缩文件及不怎么可压缩的文件。测试分别使用了三个不同的压缩等级进行压缩和解压缩
403.gcc:C语言实现,同spec2000的176.gcc类似。该测试是基于gcc V3.2,为AMDCPU生成机器码。相比spec2000的176.gcc,该测试有更多的输入文件,因此测试压力会更大,负载来源于对9组C代码进行编译。
429.mcf:C语言实现,同时需要libm库支持,同spec2000的181.mcf类似,MCF是一个用于大型公共交通中的单站车辆调度的程序。但对输入文件做了一定的修改,由32位变成64位,用以兼容64位系统。并且增加了cache命中和程序的性能。相比spec2000的181.mcf来说,占用的内存由之前的100M-190M变为860M-1700M。
445.gobmk:C语言实现,同spec2000的186.crafty类似。不同的是这里是实现的围棋游戏。相比spec2000程序更复杂。
456.hmmer:C语言实现。HMMER是基于隐马尔可夫模型(profile HMMs),用于生物序列分析工作。同Timed HMMer Search 类似。
458.sjeng:C语言实现。基于一种象棋游戏Sjeng11.2,属于人工智能的范畴。
462.libquantum:C语言实现(C99)。libquantum是模拟量子计算机的库文件,用来进行量子计算机应用的研究。
464.h264ref:C语言实现。一种视频压缩程序,基于H264AVC 9.3版,去除了I/O和平台相关的东西。
471.omnetpp:C++语言实现。OMNeT++,离散事件仿真。包括约8000台计算机和900个交换机/集线器,以及混合了各种从10Mb到1000Mb速率的大型CSMA/CD协议以太网络模拟。
473 astar:C++语言实现,实现了2D寻路算法A*的三种不同版本。
Spec fp2006 17个浮点测试项目
410.bwaves:Fortran 77语言实现,流体力学范畴。对三维瞬跨音速粘性流中冲击波的模拟计算
416.gamess:Fortran语言实现,量子化学范畴。采用GMAESS组件,包含 胞嘧啶分子、水和Cu2+离子、三唑离子等3种SCF自洽场计算。
433.milc:C语言实现,量子力学范畴,采用MILC组件,包含用来研究QCD量子色动力学、夸克及胶子的四维SU(3)格点规范理论的模。
434.zeusmp :Fortran 77/REAL*8语言实现,属于计算流体力学范畴,ZEUS-MP程序,用来计算理想、非相对论条件下的流体力学和磁流体力学,434.zeusmp模拟计算了一个统一磁场中的3D冲击波。
435.gromacs :C & Fortran语言实现,属于生物化学/分子力学范畴。GROMACS是一个分子力学计算套件,然而也可以用于非生物系统,435.gromacs模拟了在一个水和离子溶液中的蛋白质溶菌酶结构在各种实验手段如核磁共振的X光照射下的变化。
436.cactusADM:Fortran 90, ANSI C语言实现,物理中的广义相对论。来源于Cactus BenchADM。436.cactusADM对时空曲率由内部物质决定的爱因斯坦演化方程进行求解,爱因斯坦演化方程由10个标准ADM 3+1分解的二阶非线性偏微分方程组成。
437.leslie3d :Fortran 90语言实现,属于流体力学范畴。 LESlie3d是用来计算湍流的计算流体力学程序,437.leslie3d计算了一个如燃油注入燃烧室的时间分层混合流体。
444.namd:C++语言实现。属于生物/分子学范畴。NAMD是一个大型生物分子系统并行计算程序,444.namd模拟了了92224个原子组成的A-I载脂蛋白
447.dealII:C++语言实现。进行有限元分析,w/Boost lib 、deal.II lib、deal.II是定位于自适应有限元及误差估计的C++库,447.dealII对非常系数的亥姆霍兹方程进行求解,它使用了基于二元加权误差估计生成最佳网格的自适应方法,该方程在3维得解。
450.soplex:C++语言实现。采用Plex v1.2.1程序,Plex使用单纯形算法解线性方程
453.povray:ISO C++ 语言实现。 POV-Ray POV-Ray是一个光线追踪渲染软件,453.povray渲染一幅1280x1024的反锯齿国际象棋棋盘图像
454.calculix:Fortran 90 & C语言实现,结构力学范畴。CalculiX是一个用于线性及非线性三位结构力学的有限元分析软件,454.calculix计算了一个高速旋转的压缩盘片在离心力的作用下的应力和变形情况
459.GemsFDTD:Fortran 90语言实现。属于电磁学范畴。 459.GemsFDTD使用FDTD(有限差分时域)方法求解三维时域中的麦克斯韦方程,计算了一个理想导体的雷达散射截面
465.tonto: Fortran 95实现。量子化学范畴Tonto是一个面向对象的量子化学程序包,465.tonto计算面向量子晶体学,它基于一个符合X光衍射实验数据的、约束的分子Hartree-Fock波函数
470.lbm :ANSI C语言实现。 470.lbm使用LBM(格子波尔兹曼方法)模拟非压缩流体,它模拟了两种情况:类似活塞推动的剪切驱动流体和管道流体,测试包含了3000个步骤
481.wrf :Fortran 90 & C语言实现。WRF v2.0.2 481.wrf基于WRF(Weather Research and Forecastin)模型,对NCAR的数据进行了计算,数据包括了UTC 2001.06.11到UTC 2001.06.12以三小时为间隔的数据
482.sphinx3:C语言实现。Sphinx-3一种语音识别软件。