前言

SPEC CPU是一套行业标准的CPU密集型基准测试套件。SPEC设计了此套件,以使用实际用户应用程序开发的工作负载,在最广泛的实际硬件范围内提供计算密集型性能的比较度量。这些基准作为源代码提供,要求用户习惯使用编译器命令以及通过控制台或命令提示窗口通过命令解释器使用的其他命令,以便生成可执行二进制文件。

SPEC CPU2006和SPEC CPU2017说明

SPEC CPU2006是2006年6月推出的基准测试套件,它有几种不同的方法来衡量计算机性能。一种方法是测量计算机完成单个任务的速度。这是速度测量。另一种方法是测量计算机在一定时间内可以完成多少个任务。这称为吞吐量,容量或速率测量

SPEC CPU2006包含12个Integer Benchmarks,和17个Floating Point Benchmarks
详细说明参考:SPEC CPU2006 Documentation

SPEC CPU2017是2017年6月发布的,基准测试包包含43个基准,分为四个套件:
SPECrate 2017 Integer   SPECspeed 2017 Integer
SPECrate 2017 Floating Point   SPECspeed 2017 Floating Point

SPEC CPU2017分别包含:10个Integer rate,10个Integer speed,13个Floating Point rate,10个Floating Point speed

cpu2017目录结构:

  1. benchspec -> CPU -> 主要500-999,43个基准 -> 1) src:源码文件 2)build:编译目录 3)run:运行目录 4)exe:可执行文件目录 5)data:三个数据集目录
  2. benchspec -> Makefile.defaults makefile模板文件
  3. bin -> runcpu runcpu命令文件
  4. bin -> harness
  5. config -> Example-gcc-linux-x86.cfg 模板配置文件,例如:gcc_dir, label, optimize优化参数等
  6. result 存放运行日志

详细说明参考:SPEC CPU2017 Documentation

SPEC CPU 2006使用及注意事项

  1. 修改config目录下的.cfg配置文件(如果是使用的cpu2017的配置文件,需要修改intspeed为int,fpspeed为fp)。
  2. 在cpu2006目录下source shrc。
  3. 基本使用:
// runspec测试433 benchmark,test.cfg配置文件,test数据集,运行一次
runspec -c test.cfg -a run --rebuild -i test -n 1 --noreportable 433

选项说明:

  • -c 等价于--config--conf
  • -a 等价于 --action (此处参数run代表运行,常用参数还有build等)
  • -D 等价于 --rebuild, 表示运行时重新build目录,如果不加此选项不会生效你修改过的test.cfg配置文件,如果已经build成功了,只需要run则可以不加此选项
  • -i 等价于--size 表示数据集大小,数据集共有三种:test、train、ref
  • -n 等价于--iterations 表示每个benchmark的运行次数
  • output_format 输出文件的格式,选项有:txt,html,cfg,pdf,csv

注意事项:

  • -n参数,默认值为3
  • 不加--noreportable则默认为reportable,表示生成的结果时用于报告的,也就是说此时不管你设置的-n参数为多少,它都至少为你运行两遍,如果使用--noreportable,则-n指定运行几遍就运行几遍
  • 如果运行时你修改了配置文件,但你不想让它重新编译,可以把--rebuild选项换成`--nobuild

SPEC CPU2017使用及注意事项

  1. 配置文件区分intrate、intspeed、fprate和fpspeed
  2. 使用前也需要source shrc
  3. 基本使用:
// runcpu测试500 benchmark,test.cfg配置文件,test数据集,运行一次
runcpu -c test.cfg -a run --rebuild -i test -n 1 --noreportable 500

选项说明:

  • cpu2017中移除选项-rate-speed-parallel_setup
  • 新增重要选项--threads,默认值为1。如果在配置中使用了openmp选项OMP_NUM_THREADS 则会忽略该选项。
  • -tune tuning,选择tuning使用base或是peak,默认使用base
  • -C 等价于 --copies,表示rate运行多少个copies,根据系统选择32或是64

正确运行效果应该如下:
result

除了使用以上命令测试之外,通常也可以使用脚本进行批量测试,示例脚本使用说明如下:

  1. SPEC CPU2017 GCC测试脚本如下(SPEC CPU2006,ICC、AOCC、LLVM脚本只需简单修改即可):
 #!/bin/bash                                                                                                                                                        
function config()
{
    source /home/zgl/cpu2017/0-setenv-gcc.sh
    source /home/zgl/cpu2017/shrc
    
    path=/home/zgl/cpu2017/test-log
    filename=${1}-`date`-gcc.log
    cfg='gcc.cfg --noreportable'
}
# 可增加一些方法进行每次测试前的memory、cache等清理,
# 使得到的结果更准确

function build(){
   config $1    
   echo '****** buildstart time '`date +%Y-%m-%d-%H-%M-%S`' *****'>>${path}/${filename} cfg>&1

   runcpu -c $cfg  -a clean $1 >>${path}/${filename} 2>&1    
 
   runcpu -c $cfg  -a clobber $1 >>${path}/${filename} 2>&1
    
   runcpu -c $cfg  -a build --rebuild $1>>${path}/${filename} 2>&1    
   echo '****** build-end time is '`date +%Y-%m-%d-%H-%M-%S`' ******'>>${path}/${filename} cfg>&1
}
function run(){
   echo '****** run start time '`date +%Y-%m-%d-%H-%M-%S`' *****'>>${path}/${filename} cfg>&1
   
   runcpu -c $cfg  -a run --nobuild -i ref -n 1  $1 >>${path}/${filename} 2>&1

   echo '****** run-end time is '`date +%Y-%m-%d-%H-%M-%S`' *****'>>${path}/${filename} cfg>&1

}
#build fprate
#run fprate

#build intrate
#run intrate

#build intspeed
#run intspeed

#build fpspeed
#run fpspeed 
12345678910111213141516171819202122232425262728293031323334353637383940414243
  1. config文件可从Spec Results上下载模板之后进行修改:https://www.spec.org/cpu2017/results/cfp2017.html

SPEC CPU与benchmark关系

SPEC CPU包含多个benchmark,每个benchmark有不同的应用领域,采用语言是C,C++,Fortran,benchmark位于spec cpu目录下的benchspec/CPU目录,每个benchmark包含build,data,Docs,exe,run,Spec等目录。

Q:

  1. 每个 benchmark 的运行与 runcpu(或者 runspec)有什么关系?
  2. benchmark 的这些目录如何生成的?以及每个目录作用是什么?
  3. 对于 rate benchmark(例如:500.perlbench_r)和 speed benchmark(例如:600.perlbench_r)有什么关系?

A:

  • 关于 spec 的运行机制:首先 spec 有一个Makefile.defaults模板文件,spec 先读取 cfg 配置文件,根据模板文件生成对应 benchmark 的Makefile.spec文件,再根据Makefile.spec中的优化选项和配置信息进行编译和运行。
  • 也就是说 benchmark 的 build,exe,run 目录是由 spec 生成,对应文件作用也就分别是存放源码已经 build 生成的中间文件,存放了可执行文件,可执行文件运行目录,包含输出模板信息和输入文件及输入参数信息等。
  • 对于500.perlbench_r600.perlbench_r 这样的 benchmark 打开他们的目录你会发现,它们目录的区别就是 500.perlbench_r 中多一个 src 目录,因为这样的 benchmark,源码是存放在这里的。两个benchmark 的不同还在于它们的 binary 文件可能不一样,输入参数可能不一样,一个是测试rate 另一个测试 speed

其实我们更应该学会这样使用SPEC:需要运行哪个benchmark 就进入哪个 benchmark 的 build 目录(前提是你运行过runcpu命令生成了目录),直接修改 Makefile.spec 配置,再执行make cleanmake -j 重新编译生成 binary,再把生成的binary copy到run目录运行,如何运行?在run目录下面你会看到speccmds.cmd文件,文件的最后给出了该benchmark的运行参数和输入,如下所示:
cmd
然后你就可以在run目录执行time -p ...,得到运行时间,具体操作如下:

cd cpu2017/benchspec/CPU/600.perlbench_r/build/build_base_gcc-m64.0000/
vi Makefile.spec # 修改配置选项
make clean # 清除中间文件
make -j 32 # 进行编译
cp test ../../run/run_base_test_gcc-x86-m64.0000/ #拷贝可执行到run目录
cd  ../../run/run_base_test_gcc-x86-m64.0000/ #进入到run目录
vi speccmds.cmd  #查看最后的参数
time -p ./test <inp.in xx xx xx >xx >>xxx 
12345678

其它:

  1. 区别cpu2006使用runspec,cpu2017使用runcpu。
  2. 运行test和train数据集只能得到run time,运行ref数据集时间最长,能得到run time和对应的ratio值
  3. SPEC CPU Results中收集了各大平台发布的speed和rate测试的结果集和配置文件(包含base的优化选项和peak的优化选项)。
  4. 注意配置文件中使用的jemalloc库的版本和路径,-lmvec选项库的使用和-vector-library=LIBMVEC选项的使用。
  5. 测base数据时不用打开openmp相关的选项。
  6. 数据测试时为避免终端打印太多运行信息,可关闭teeout选项,运行信息可使用脚本记录到日志文件(运行结果信息:cfg文件,csv文件,html文件,pdf文件等会自动保存到result文件夹)。
  7. 关于jemalloc选项的配置使用和介绍信息在jemalloc介绍和使用

References:

posted on 2020-08-21 11:02  不同的日子丶看不同的云  阅读(10353)  评论(0编辑  收藏  举报