介绍spec2006
Basic flow
spec2006使用的流程是:
install
安装spec2006,这步会生成一个目录,里面会包含spec2006所需要的工具集、spec2006 test的源码。
destination selection
选择要生成的目标目录
toolset selection
选择工具集。这步spec会根据当前platform来自动选择,甚至不能跨平台选择。这就导致要交叉编译spec变得困难。最好的办法是放到目标platform来编译。然后打包出来,下次就不用重新编译了。
the files are unpacked and tested
拷贝所需要的文件到目标目录
build
编译benchmark用例。
run
运行benchmark用例。
install
install.sh有两个重要的选项:
-d
指定目标目录
-u
指定platform
比如以下命令:
1 | $ ./install.sh -d /home/francis.zheng/spec2006_installed_x64 -u linux-suse10-amd64 |
runspec
跑之前要source一下环境变量
1 | $ source shrc |
修改绝对路径
1 | $ bin/relocate |
使用runspec命令运行用例。
1 | $ runspec [options] [list of benchmarks to run] |
其中list of benchmarks to run
包括int、fp、all、或者某个用例。
有如下几个常用参数:
-c FILE
–config FILE
指定配置文件,常见配置文件在config目录下。
-i SET[,SET…]
–size SET[,SET…]
指定测试规模。主要分test、train、ref三种(还有一种all)。其中test最短,其次是train,最长的是ref。最终要得到分数,需要跑的是ref。(从benchspec/CPU2006/400.perlbench/data/*/reftime中可以看出用例长短)
-T TUNE[,TUNE…]
–tune TUNE[,TUNE]
指定测试模式。主要分base、peak两种(还有一种all)。base代表基准测试,peak代表峰值测试。report首先跑base,再跑peak
-n N
每个测试项目运行的次数。如果需要自动计算分数,需要指定运行次数大于等于3。
–reportable
产生报告。
–noreportable
不产生报告。
–nobuild
不进行编译。
–action=ACTION
指定action。ACTION有:build、buildstep、clean、clobber、configpp、scrub、report、run,setup,trash、validate。
-o FORMAT[,…]
指定输出格式。FORMAT有:all、cfg、check、csv、flags、html、mail、pdf、ps、raw、screen、text
-r [N]
–rate [N]
Do a throughput (rate) run of [N] copies (if [N] is specified)
–parallel_setup=N
For rate runs, do per-benchmark run directory setup in parallel (N jobs at a time)
–parallel_setup_type=X
For parallel setup, set the job creation method. (X may be one of ‘fork’, ‘submit’, or ‘none’)
–parallel_test=N
For the mandatory test and train portion of a reportable run, run N jobs at a time.
举几个常用的命令的例子。
1 | # 只编译base int用例 |
RISCV
build RISCV environment
参考之前的文章。
build toolset
参考下面转载的文章。
install
1 | $ ./install.sh -d /home/francis.zheng/spec2006_installed_riscv -u linux-riscv64 |
build
需要编译base和peak两种。
1 | $ runspec -c linux64-riscv64.cfg --action=build -T base int |
run
见上面runspec的使用。
以下为转载。
移植SPEC2006
(samin.guo, 2019.10, sifive-china chengdu.)
spec运行的流程install -> build-> run
其中,在install阶段,需要使用arch相关的tools,这部分需要自己使用编译器自己编译出来;
buidl阶段就是对各个测试集进行编译,这个阶段可以通过配置文件指定各种优化选项;
run阶段进行测试题的运行,并得到分数。
由于spec使用的语法比较老,而我们的编译器比较新,有些老的语法在新的编译器中已经默认不支持了,需要使用某些特定的编译选型打开,或者其他相关的工作,使编译器能够正常编译。
编译spec tools
spec tools会使用到__alloca宏, 但是新的glibc中已经没有提供,需要手动添加。
1、编辑 /usr/include/alloca.h,新增__alloca的宏定义。
1 | #ifdef GUNC |
2、手动创建和处理一些缺少的文件。
1 | $cd /usr/bin && ln -s gcc cc |
3、编辑 /usr/include/stdio.h,屏蔽__getdelim ,getdelim, getline三个函数的声明,否则会报函数冲突。
注意,tools编译完成之后,请将屏蔽去掉,恢复文件。
1 | +#if 0 |
3、安装dld库
源码编译dld库,该库比较老,软件仓库不提供下载。不安装此库会导致perl不会开启动态加载功能。
1 | $ tar -xvf dld-3.3.tar.gz && cd dld-3.3 |
4、编辑配置文件,加上对libm.a和libdl.a的的链接,否则会检测不到dlopen导致perl动态链接功能失效。
vim SPEC2006/tools/src/perl-5.8.7/Configure
1 | xlibpth='' |
vim SPEC2006/tools/src/perl-5.8.7/Makefile.SH
1 | ext = \$(dynamic_ext) \$(static_ext) \$(nonxs_ext) |
5、屏蔽libwww-perl,打开该模块会导致编译不过,并且后面不会使用到此功能
vim SPEC2006/tools/src/perl-5.8.7/Configure
1 | for i in \ |
6、替换src内的config.guess config.sub
将支持riscv的config.guess、config.sub替换到源码中(可以从gcc源码中获取)
1 | $cp config.{guess,sub} tools/src/expat-1.95.8/conftools/ |
7、编译
1 | $ cd SPEC2006/tools/src/ |
8、buildtools运行成功后,将之前在 /usr/include/stdio.h文件中对__getdelim ,getdelim, getline三个函数的声明的屏蔽解开,恢复文件。
1 | - #if 0 |
9、进入spec根目录,运行下面命令 ,打包工具。
1 | $ cd SPEC2006 |
在spec根目录就会生成linux-riscv64-XX.tar的一个压缩包,包含所有的工具。
检测校验压缩包内的文件是否能够正常工作,确保没有问题,将该压缩包用spectar解压。
1 | $cd SPEC2006 |
spectar会将压缩包内新的tools解压到tools/bin/${os}-${arch} 目录下。
10、安装spec tools
1 | $ ./install.sh |
运行SPEC
1 | $ . ./shrc |
tips:
1、上面命令只会运行一遍,如想得到分数,需要自己手动计算(题目总分/题目个数)。如想得到有分数的报告文件,可以将–noreportable去掉,这样会运行三遍,得到分数。
2、运行如果报找不到specxxx命令的问题,手动运行下 ./bin/relocate,重新设置下顶层路径即可。
3、更详细的命令请参考Docs/runspec.html
编译运行问题记录
1、400.perlbench在开启编译优化后,编译时报库函数无法找到的问题:
修改配置文件,增加-std=gnu89选项
1 | 400.perlbench=default=default=default: |
2、464.h264ref在运行时报错。
编译器默认将char配置成unsigned类型,需要将char配置成sigend类型。
修改配置文件,新增下列内容:
1 | + 464.h264ref=default=default=default: |
3、483.xalancbmk编译时报文件未定义
链接时缺少头文件,修改配置文件,新增下列内容:
1 | + 483.xalancbmk=default=default=default: |
4、416.gamess编译报错
spec的416.gamess使用,fortran在编译时不能解析老的语法格式。
修改配置文件,新增下列内容:
1 | + 416.gamess=default=default=default: |
5、447.dealII编译报错
缺少头文件包含,语法书写不严谨,用-fpermissive忽略。
修改配置文件,新增下列内容:
1 | + 447.dealII=default=default=default: |
6、450.sopex编译报错
老的c++语法,新编译器需要加入兼容选项。
修改配置文件,新增下列内容:
1 | + 450.soplex=default=default=default: |
7、416.games 运行报浮点异常
优化导致触发了IEEE_UNDERFLOW_FLAG。这是spec的一个bug,bug编号:69368
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=69368
-fno-aggressive-loop-optimizations
8、481.wrf运行包下列错误:
Runtime: At line 6744 of file module_ra_rrtm.fppized.f90 (unit = 10, file = ‘RRTM_DATA’)
去掉wrf_data_header_size = 8编译选项。
1 | 481.wrf=default=default=default: |
9、482.sphinx3运行时报错:
FATAL_ERROR: “mdef.c”, line 427: Duplicate base phone: +BREATH+ - - - filler 0 0 1 2 N
与464.h264ref原因一样,需要将char配置成signed
1 | +482.sphinx3=default=default=default: |
10、gcc 10下,481.wrf编译报错
添加编译选项:
1 | 481.wrf=default=default=default: |
附:配置文件
config/linux64-riscv64.cfg
1 | # This is a sample config file. It was tested with: |
tips
可以根据每个题目,添加特定的优化选项。