SPEC CPU 2006基准测试的简介、安装、使用和注意事项
原文作者黄崇艺。本文的主要内容为SPEC CPU 2006基准测试的简介、安装、使用和注意事项,使用基于LLVM的Address Sanitizer性能测试作为一个实战案例展示。故而全文推荐。
安装
- 网上找到的版本应该是这个
speccpu2006-v1.0.1-newest.tar
,在想要安装的目录下执行tar -xvf speccpu2006-v1.0.1-newest.tar
就可以解压安装 - 进入到目录里面
cd speccpu2006-v1.0.1
- 安装 spec ,
./install.sh
,如果安装出现错误,极有可能是有一些文件没有可执行文件,递归赋予可执行文件就行chmod -R a+x .
,不会有问题的 - 安装完成之后执行
./shrc
激活spec环境(以后每次重新打开一个 shell 会话的时候都需要激活一下)
构成
- SPEC有两个部分组成,一个是数据,一个是代码(代码以项目的方式组织),运行需要指定数据以及项目
- 数据有三个规格
test
(小型)train
(中型)ref
(大型)
- 代码有以下选项
int
(整型运算性能)float
,也叫 fp(浮点运算性能)all_c
(全部 c 项目)all_cpp
(全部 cpp 项目)all
(全部项目)- 特定项目,比如
453.povray
编译标准
- C 语言要使用
-std=gnu89
- CPP 要使用
-std=c++98
- 如果要启用 address sanitizer,要注意防止 sanitizer 检测到错误的时候 abort 程序而导致 benchmark 提前终止,需要使用以下编译选项
并且要注入环境变量-fsanitize=address -fsanitize-recover=address
ASAN_OPTIONS=halt_on_error=0:detect_leaks=0
配制
运行 spec 需要指定配制,在配制文件里面要声明 reportable = 1
才可以有结果输出
运行模式
spec 有两种运行模式,一个是 base
,基本模式,一般使用这个,一个是 peak
,性能模式,测试峰值性能极限
- 关于这两个关键字的解释,要看下文如何
看结果报告
那一章节
运行命令
runspec --rebuild -c $name -a run -I -l --size $size -n $NUM_RUNS $PROJECT
--rebuild
:每次运行都重新编译,默认行为不是重新编译,而是类似make -j
,另外说一点,spec 使用的不是make
,而是specmake
-c
:指定运行配制(config)-a
:指定任务,有以下选项(action):
- build
- buildsetup
- clean
- clobber
- configpp
- scrub
- report
- run
- setup
- trash
- validate
-I
:忽略任何中断-l
:在执行过程中记录输出--size
:选择数据集大小<test | train | ref>
-n
:spec运行的趟数$PROJECT
:<int | fp | all_c | all_cpp | all>
Fortran 错误
- 由于某些项目是有部分使用 fortran 来实现的,所以如果没有安装 gfortran 的时候可能会导致其编译不了,解决方法有二
- 安装 gfortran
- 让
FC=echo
,相当于直接告诉它不要编译这部分了,浪费时间的
日志位置
- 运行完成之后在安装底层目录的 result 文件夹下可以看到运行日志以及结果
- 看结尾
- 以 log 结尾的文件是一个完整运行日志,包括编译输出,运行输出,以及结果归纳
- 以其他文件类型后缀结尾的都是测试结果归纳,只不过文件格式不一样,内容一样的,一般看txt就行
- 看开头
CINT
表示使用 C/C++ 编写的int benchmark
CFP
表示使用 C/C++ 编写的float benchmark
- 看中间
- 中间是一个编号,遵循以时间为递增的规律
- 看结尾
- 另外在每个项目的文件下也会有单独的编译日志以及运行日志,例如
ls ./benchspec/CPU2006/400.perlbench/run/build_base_1.0000/
这个目录下可以看到编译日志- 如果这个项目编译出错了,可以在这个目录下找到
make.err
日志
- 如果这个项目编译出错了,可以在这个目录下找到
ls ./benchspec/CPU2006/400.perlbench/run/run_base_test_1.0000/
这个目录下可以看到运行日志
看日志
-
有时候 spec 自带的结果汇总会不完整,因为有些程序有可能被 asan 终止之后在拉起就不被计分了,所有有时候得去日志里面翻找成功运行项目案例的运行时间,在上面提到的那个完整日志里面全局搜索关键字
success
就可以了(忽略大小写)-
log2excel 脚本,这里是一个简单的将这些 success 项目信息转为 excel 表格的脚本,以及应该喂给这个脚本的 success 数据格式:
CC = /root/asanopt/llvm-4.0.0-project/build/bin/clang -std=gnu89 -fsanitize=address -fsanitize-recover=address -m64 -g CXX = /root/asanopt/llvm-4.0.0-project/build/bin/clang++ -std=c++98 -fsanitize=address -fsanitize-recover=address -m64 -g 400.perlbench base ref ratio=12.85, runtime=760.415379 400.perlbench base ref ratio=14.33, runtime=681.948309 400.perlbench base ref ratio=14.44, runtime=676.611816 401.bzip2 base ref ratio=18.30, runtime=527.208650 401.bzip2 base ref ratio=18.55, runtime=520.089746 401.bzip2 base ref ratio=18.78, runtime=513.887221 403.gcc base ref ratio=18.22, runtime=441.892276 403.gcc base ref ratio=19.51, runtime=412.592274 403.gcc base ref ratio=19.76, runtime=407.424780 429.mcf base ref ratio=29.58, runtime=308.278307 429.mcf base ref ratio=36.16, runtime=252.184882 429.mcf base ref ratio=38.58, runtime=236.364282 433.milc base ref ratio=20.98, runtime=437.482181 433.milc base ref ratio=21.23, runtime=432.368999 433.milc base ref ratio=21.41, runtime=428.706485 444.namd base ref ratio=19.20, runtime=417.752721 444.namd base ref ratio=19.35, runtime=414.419211 444.namd base ref ratio=20.47, runtime=391.783225 445.gobmk base ref ratio=21.42, runtime=489.668323 445.gobmk base ref ratio=22.60, runtime=464.136214 445.gobmk base ref ratio=22.85, runtime=458.984958 447.dealII base ref ratio=27.67, runtime=413.422023 447.dealII base ref ratio=28.80, runtime=397.228149 447.dealII base ref ratio=30.58, runtime=374.084230 450.soplex base ref ratio=28.75, runtime=290.083530 450.soplex base ref ratio=31.28, runtime=266.656672 450.soplex base ref ratio=32.73, runtime=254.838331 453.povray base ref ratio=20.95, runtime=253.951463 453.povray base ref ratio=21.30, runtime=249.714080 453.povray base ref ratio=22.47, runtime=236.739422 456.hmmer base ref ratio=14.50, runtime=643.463325 456.hmmer base ref ratio=16.22, runtime=575.344854 456.hmmer base ref ratio=16.35, runtime=570.789854 458.sjeng base ref ratio=21.67, runtime=558.318427 458.sjeng base ref ratio=24.55, runtime=492.913527 458.sjeng base ref ratio=25.18, runtime=480.538434 462.libquantum base ref ratio=62.08, runtime=333.748264 462.libquantum base ref ratio=68.76, runtime=301.351093 462.libquantum base ref ratio=73.88, runtime=280.453628 464.h264ref base ref ratio=31.03, runtime=713.099006 464.h264ref base ref ratio=33.94, runtime=652.062848 464.h264ref base ref ratio=35.00, runtime=632.321436 470.lbm base ref ratio=58.00, runtime=236.895693 470.lbm base ref ratio=63.69, runtime=215.746827 470.lbm base ref ratio=64.17, runtime=214.102158 473.astar base ref ratio=17.80, runtime=394.369525 473.astar base ref ratio=18.05, runtime=388.900111 473.astar base ref ratio=18.77, runtime=374.065830 482.sphinx3 base ref ratio=30.24, runtime=644.427922 482.sphinx3 base ref ratio=30.28, runtime=643.674597 482.sphinx3 base ref ratio=32.57, runtime=598.409849 483.xalancbmk base ref ratio=20.32, runtime=339.625837 483.xalancbmk base ref ratio=20.72, runtime=332.940290 483.xalancbmk base ref ratio=21.84, runtime=315.878660 998.specrand base ref ratio=119.83, runtime=0.083455 998.specrand base ref ratio=122.88, runtime=0.081378 998.specrand base ref ratio=123.67, runtime=0.080860 999.specrand base ref ratio=122.42, runtime=0.081687 999.specrand base ref ratio=123.98, runtime=0.080658 999.specrand base ref ratio=124.79, runtime=0.080134
-