SPEC 2006编译及运行教程 
该目录下的spec 2006为spec程序的源码。需要编译生成二进制可执行文件,之后运行该可执行文件。运行过程中,不同的程序,需要不同的输入参数和文件。
一、安装编译
首先,需要进行安装。
切换到spec2006目录下,在命令行下输入:
# ./install.sh    (如果出错,可能是权限问题 sudo chmod 777 -R spec2006/*),输入后会提示输入yes或no,输入yes或y即可进行安装,如果没有错误,会提示安装成功。
# . ./shrc(注意是两个.,中间有一个空格。如果不执行该命令,则不识别runspec命令)
之后就可以编译或运行测试程序了。
不管是编译还是运行,都需要使用spec2006/config目录下的一个.cfg文件(配置文件,比如使用什么编译器等等)。因此需要先设置好.cfg文件,在编译和运行。
将config目录下A.cfg 复制一份,并修改为test.cfg(# cd config # cp A.cfg test.cfg)。打开test.cfg进行相应的修改。此处需要注意选择适合的A.cfg,比如操作系统是32位的就选择Example-linux32-i386-gcc42.cfg等,为64位的就选择Example-linux64-amd64-gcc43.cfg等。一般需要考虑硬件是32位还是64位,操作系统是32位还是64位(GEM5尽量在64位linux下运行!!)。下面介绍如何修改test.cfg。
test.cfg文件中指定了编译spec所使用的编译器及其路径,如果spec2006需要在x86架构下运行(如x86的机器或gem5中x86架构),则需要将编译器指定为gcc等(默认为gcc),如下所示:
CC          = /usr/bin/gcc -static
CXX          = /usr/bin/g++ -static
gnu编译器FC          = /usr/bin/gfortran -static
如果需要在alpha架构下运行,则需要将编译器指定为alpha交叉编译器(自己下载一个),如下所示:
CC          = /home/feng/alphaev67-unknown-linux-gnu/bin/alphaev67-unknown-linux-gnu-gcc
CXX          = /home/feng/alphaev67-unknown-linux-gnu/bin/alphaev67-unknown-linux-gnu-g++
FC          = /home/feng/alphaev67-unknown-linux-gnu/bin/alphaev67-unknown-linux-gnu-gfortran
同时,很重要的一点是,spec必须要静态编译,对于x86,需要在CC、CXX、FC后面加-static,如上所示。对于alpha,修改位置如下(可能是这样):
COPTIMIZE    = -O2 -static
CXXOPTIMIZE  = -O2 -static
FOPTIMIZE    = -O2 -static
完成上面的操作后就可以进行编译或运行了。(一直用的X86架构的,不推荐使用ALPHA)
如果只进行编译,则在每个测试程序文件下生成一个exe文件,里面为该测试程序的二进制可执行程序,如果选择运行,则会生成run文件夹,里面会有二进制可执行程序,和所需的各种文件,同时会生成d文件,该文件为运行该测试程序的命令,即如何运行该测试程序。测试程序的运行,首先是进行编译,之后生成run文件夹,之后才是真正的运行,因为我们的目的是生成run文件夹,因此当出现running benchmark xxxx时,即可停止运行。为了方便,尽量运行,而不是编译。(此处编译和运行其实都一样,只不过编译后需要自己制定命令的输入参数等;而运行后,会生成d文件,里面有该测试程序运行的命令,比较方便。)
    编译:
编译一个测试程序bzip:runspec --config=test.cfg --action=build --tune=base 401
编译所有fp/int测试程序:runspec --action=build --config=gcc43.cfg --tune=base fp/int
运行:
运行一个程序bzip:runspec --config=test.cfg --size=ref --tune=base --noreportable --iterations=3 401
运行所有fp/int测试程序:runspec --config=test.cfg --size=ref --tune=base --noreportable --iterations=3 int/fp。
运行时,虽然可以直接使用int、fp来运行,但存在一个缺点:前一个程序完全运行完后,才会生成下一个程序的run文件夹,因此不推荐使用int或fp,而是一个程序一个程序运行,如400、401……,在400运行到running benchmark xxx时,中止400,接着运行401,以此来生成所有的run。
如果使用的是Example-linux64-amd64-gcc43.cfg,则在每个测试程序下会生成run/run_base_ref_amd64-m64-gcc43-nn.0000文件夹,里面包含d,可以打开查看,里面包含了
-c :二进制可执行程序。
-o :可执行程序运行结果的输出文件。
-i :可执行程序需要的输入文件。
-e:如果发生错误,输出到该文件。
在run/run_base_ref_amd64-m64-gcc43-nn.0000下,输入specinvoke -n就可以得到如何运行测试程序的命令,specinvoke -n就是对d进行了解析。
以bzip2为例,在执行runspec --config=test.cfg --size=ref --tune=base --noreportable --iterations=3 401后(此处--size=ref表示使用的数据集,可以使用test),查看d:
-C /home/feng/spec2006-12.04/benchspec/CPU2006/401.bzip2/run/run_base_ref_amd64-m64-gcc43-nn.0001
-o input.source.out -e ../run_base_ref_amd64-m64-gcc43-nn.0001/bzip2_base.amd64-m64-gcc43-nn input.source 280
-o chicken.jpg.out -e ../run_base_ref_amd64-m64-gcc43-nn.0001/bzip2_base.amd64-m64-gcc43-nn chicken.jpg 30
-o liberty.jpg.out -e ../run_base_ref_amd64-m64-gcc43-nn.0001/bzip2_base.amd64-m64-gcc43-nn liberty.jpg 30
-o input.program.out -e ../run_base_ref_amd64-m64-gcc43-nn.0001/bzip2_base.amd64-m64-gcc43-nn input.program 280
-o text.html.out -e ../run_base_ref_amd64-m64-gcc43-nn.0001/bzip2_base.amd64-m64-gcc43-nn text.html 280
-o inputbined.out - ../run_base_ref_amd64-m64-gcc43-nn.0001/bzip2_base.amd64-m64-gcc43-nn inputbined 200
其中-C表示二进制所在文件,-o表示将程序结果输出到input.source.out文件中,-e表示将错误输出到文件。
如果想在实际机器中运行bzip2,可以使用下面命令(注意改为自己的路径):
/home/feng/spec2006-12.04/benchspec/CPU2006/401.bzip2/run/run_base_ref_amd64-m
64-gcc43-nn.0000/bzip2_base.amd64-m64-gcc43-nn /home/feng/spec2006-12.04/benchspec/CPU2006/401.bzip2/run/run_base_ref_amd64-m64-gcc43-nn.0000/input.source 280 -o input.source.out -e
上面的命令可以运行,但是-o -e并没有起作用,可改为:
bzip2 input.source 280 > f.source.out 2> 的形式(因为路径问题,该命令不能执行,但需要知道该命令各个值的意义),其中bzip2表示要执行的二进制文件,input.source表示输入的文件,280表示输入的参数,>表示将输出重定向到f.source.out文件,2>表示将错误信息重定向到文件中。具体如下:
/home/feng/spec2006-12.04/benchspec/CPU2006/401.bzip2/run/run_base_ref_amd64-m64-gcc43-nn.0000/bzip2_base.amd64-m64-gcc43-nn /home/feng/spec2006-12.04/benchspec/CPU2006/401.bzip2/run/run_base_ref_amd64-m64-gcc43-nn.0000/input.source 280 > input.source.out 2>