gem5安装
在使用GEM5过程中,为了与DRAMSim进行连接,使用了较多的版本,最终可行的版本有两个:
1、gem5-stable版(GEM5-stable-549b72de8f72),与DRAMSim的连接使用了xiang yudong的patch,网址:http://www.cse.psu.edu/~xydong/software.html。前期使用的为该版本,但当时在模拟多核时,遇到了问题,现在想想stable版模拟多核应该也是可行的。同时,stable在安装、运行时会碰到很多错误,而下面的repo版而轻松很多。
2、gem5-repo版(gem5-44ef5ed3aee0即成熟版),该版本可能用的人比较少,但是挺好用。其作者为Andreas Hansson,并提供了对应该版本的patch来连接DRAMSim,即rb2087.patch。网址为http://reviews.gem5.org/r/2087/
下面以stable版为例,说明其安装过程,repo版的安装类似,推荐使用repo版的。网上有很多安装教程,安装过程中可能会因为gcc g++等其他软件版本的原因导致错误,下面列出我使用的个软件版本(仅供参考):
gcc 4.4.3
g++ 4.4.3
gfortran 4.6
m4-1.4.16
scons-2.0.1
swig-1.3.34
zlib-1.2.8
GEM5安装:
解压gem5源文件:
bzip2 -d gem5-stable-1.tar.bz2(使用的GEM5-stable-549b72de8f72)
假设将gem5解压后的文件夹重命名为:gem5
GEM5需要其他软件的支持,(在GEM5工具文件夹下)
%-------------------------------------------------------------------------------%
安装zlib:
解压下载的压缩包:
tar -xzvf zlib-1.2.7.tar.gz
进入解压之后的文件夹 zlib-1.2.7
cd zlib-1.2.7
执行命令:
./configure
sudo make install
%-------------------------------------------------------------------------------%
安装SWIG:(注意版本!)
解压下载的压缩包:
tar -xzvf swig-1.3.34.tar.gz
进入解压后的文件夹:
cd swig-1.3.34
执行命令:
./configure
make
sudo make install
%-------------------------------------------------------------------------------%
安装M4:
解压下载的压缩包:
tar -xzvf m4-latest.tar.gz
进入解压之后的文件夹 m4-1.4.16
cd m4-1.4.16
执行命令:
./configure
make
sudo make install
%-------------------------------------------------------------------------------%
安装scons:
Scons的安装很简单,只需要将scons-local-2.2.0.tar.gz解压
tar -xzvf scons-local-2.2.0.tar.gz
将解压后的文件全部拷贝到gem5-stable中
(此处使用的是scons-local,但是使用起来比较费劲,如编译时需要输入python scons.py。可以直接安装scons,编译时直接使用scons即可)
%-------------------------------------------------------------------------------%
编译前需要先修改内核版本号:(只有stable需要修改版本号,repo版的无需修改。)
src/arch/x86/linux syscalls.cc
src/arch/alpha/linux process.cc 修改对应架构中的内核版本号
编译:
进入gem5文件夹:
cd gem5
执行:
python scons.pybuild/<arch>/m5.<binary>(使用scons-local时)
scons build/<arch>/m5.<binary>(使用scons时)
指定编译的选项,及目标文件,例如:
scons build/X86_SE/gem5.opt(其中X86_SE表示目标架构为X86,运行在SE模式下,repo版本中,SE和FS合在了一起,只需运行scons build/X86/gem5.opt)
如果出现如下错误:
错误:can't find Python.h header in ['/usr/include/python2.7']
解决方法:sudo apt-get install python-dev
重新执行命令,没有错误则说明编译成功。
%-------------------------------------------------------------------------------%
测试:
se模式下执行hello测试程序。
执行命令:
./build/ARM/m5.opt ./configs/example/se.py-c tests/test-progs/hello/bin/arm/linux/hello
部分输出:
**** REAL SIMULATION ****
info: Entering event queue @0. Starting simulation...
Hello world!
%-------------------------------------------------------------------------------%
到此,安装测试成功!!
%------------------------------------------------------------------------------------------------------%
GEM5与DRAMSim的连接
下面介绍gem5-repo版(gem5-44ef5ed3aee0)与DRAMSim的连接方法,及如何运行spec2006。
要连接DRAMSim,打上补丁rb2087.patch,之后切换到ext/dramsim2目录下,查看readme文件,在ext/dramsim2下加入DRAMSim2,或者直接将自己修改过的DRAMSim2放入该目录下。
操作完成后,GEM5就和DRAMSim2连接起来了。通过build/X86/gem5.optconfigs/example/se.py --mem-type=dramsim2就可以使用dramsim2了。
DRAMSim单独使用时,可以输出各种信息,如power、带宽、延迟、地址解析等等信息,但是与GEM5连接后,默认不输出,为了输出这些信息,需要进行修改,共有两种方法,大同小异:
方法1、将DRAMSim2目录下代码中,将与LOG_OUTPUT相关的注释掉(如#ifdef LOG_OUTPUT等)。
方法2、直接在PrintMacros.h中定义LOG_OUTPUT,即:#define LOG_OUTPUT
经过上面的操作,即完成两者的连接,运行测试程序时,如果使用了dramsim2(即--mem-type=dramsim2),则在GEM5目录下会生成dramsim.log文件,其输出内容可通过ext/dramsim/DRAMSim2下的system.ini.example来控制。
<了解>注意:默认情况下,如果gem5运行两个程序,并且一个所需时间长,一个所需时间短,比如(hello程序和bzip2程序),当hello运行完时,整个程序都结束(包括bzip2)。为了避免这种情况,让所有程序都运行完,可修改src/sim/syscall_emul.cc文件中的exitGroupFunc函数。如何修改,可参考exitgroup.diff文件。我对2(成熟版)下的补丁rb2087.patch做了修改,加入了对该问题的解决补丁。
repo版GEM5如何运行spec2006
假设使用的是x86架构,GEM5有两种运行模式SE和FS。
尝试过在FS下运行spec2006,使用的X86架构,需要注意FS中使用的kernel版本可能比较老,是2.多的,如果spec 2006是在比较新的linux下编译,可能就不能在FS下运行,需要注意。FS下使用DRAMSim时,无法输出dramsim.log(生成了该文件,但没有重要信息输出)。(还是SE模式好用)
SE模式简单方便,build/X86/gem5.opt configs/example/se.py -h可以输出所有的参数信息,重要的参数如下:
--list-cpu-types List available CPU types
--cpu-type=CPU_TYPE type of cpu to run with
-n NUM_CPUS, --num-cpus=NUM_CPUS(CPU的数量)
--list-mem-types List available memory types
--mem-type=MEM_TYPE typeof memory to use
--mem-channels=MEM_CHANNELS number of memory channels
--mem-size=MEM_SIZE Specifythe physical memory size (single memory)
下面是与所运行程序相关的参数:
-c CMD, --cmd=CMD,即所运行的二进制可执行文件,用“ ”括起来
-o OPTIONS,--options=OPTIONS 程序运行时所需的选项,用“ ”括起来
-i INPUT, --input=INPUT 程序所需的输入,用“ ”括起来
--output=OUTPUT Redirect stdout to a file.用“ ”括起来
--errout=ERROUT Redirect stderr to a file.用“ ”括起来
下面介绍如何运行spec 2006:
方法1(较繁琐):在编译运行spec 2006时,每一个测试程序下都有run/runxxxxxxx文件夹,里面有sepcsmds.cmd文件,该文件为该程序运行时的参数如,-c、-o、-i、--output、--errout、等信息。下面以401.bzip为例进行说明,其运行命令为:
build/X86/gem5.optconfigs/example/se.py --mem-type=dramsim2--caches --l2cache --l1d_size=32kB --l1i_size=32kB --l2_size=1024kB--l1d_assoc=1 --l1i_assoc=1 --l2_assoc=4 --cpu-type=timing -n 1 --mem-size=4096MB -c "/home/feng/spec2006-12.04/benchspec/CPU2006/401.bzip2/run/run_base_ref_amd64-m64-gcc43-nn.0000/bzip2_base.amd64-m64-gcc43-nn"-o "/home/feng/spec2006-12.04/benchspec/CPU2006/401.bzip2/run/run_base_ref_amd64-m64-gcc43-nn.0000/input.source280" --output="input.source.out" --errout="input.source.err"
上面运行了一个程序,cpu数量为1。如果需要运行两个程序A,B,则将-n 1改成-n 2,同时修改-c、-o、等信息,具体为将A和B的-c 放在一块,以“;”隔开,其他-o、--output、--errout、--input类似,如果某一个程序选项为空,也需要隔开,保证二进制文件与选项、输出、输入的对应关系。
一个2个程序的例子如下,只显示重要部分:
-c "/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/403.gcc/run/run_base_ref_amd64-m64-gcc43-nn.0000/gcc_base.amd64-m64-gcc43-nn"
-o "/home/feng/spec2006-12.04/benchspec/CPU2006/401.bzip2/run/run_base_ref_amd64-m64-gcc43-nn.0000/input.source280;/home/feng/spec2006-12.04/benchspec/CPU2006/403.gcc/run/run_base_ref_amd64-m64-gcc43-nn.0000/166.i-o 166.s"
--output="input.source.out;166.out"
--errout="input.source.err;166.err"
为了方便,可以在GEM5目录下,创建文件shellRunMultipleSpecsh,将命令写入该文件,之后运行#sh shellRunMultipleSpec.sh,即可运行shellRunMultipleSpec.sh中的命令。
在运行spec2006的某些程序时,可能会出现错误,一般是路径的问题,即程序找不到某个文件,可以将文件从SPEC 2006中直接复制到GEM5目录下。当出现错误时,可以查看对应输出文件中的错误类型,进行处理。
方法2(简单):为了避免运行程序时,修过过多的参数,可以修改se.py 加入一个-b的参数,来接收spec2006中测试程序的名字,让se.py通过解析名字,来补全对应的命令。比如修改后的se-spec2006.py,只需-bbzip2或-b 401即可运行bzip2程序,如果运行多个程序,只需-b bzip2-gcc或-b 401-403即可。注意此时se-spec2006.py需要cpu2006.py文件。针对不同的测试数据集(test/ref),包含不同的cpu2006.py文件,其中se-spec2006.py一样。文件可在2(成熟版)文件夹下的test-cpu2006文件夹和ref-cpu2006文件夹中找到。
此时运行两个测试程序,只需执行:
build/X86/gem5.optconfigs/example/se-spec2006.py --mem-type=dramsim2 --caches --l2cache--l1d_size=32kB --l1i_size=32kB --l2_size=1024kB --l1d_assoc=1 --l1i_assoc=1--l2_assoc=4 --cpu-type=timing -n 2 --mem-size=4096MB -b 401-403
注意需要将se-spec2006.py和cpu2006.py放入configs/example/文件夹下。注意有两个cpu2006.py(分别在ref-cpu2006和test-spec2006文件夹下),区别是所使用的输入参数和输入文件不同。
(重要)后来经过实验发现,通过上面的方法2运行多个相同的测试程序时,比如8个cpu,8个bzip2,试验结果中,只有CPU0运行了程序,其他CPU均没有运行程序(8个不同测试程序时,无此问题)。因此对se-spec2006.py进行了修改,删除了cpu2006.py,将cpu2006.py的内容加入se-spec2006.py文件中,形成se-spec2006.py文件。
总结,如何使用GEM5+DRAMSim2 运行spec2006(ref数据集)
1、参考GEM5成熟版的安装方法
2、参考GEM5+DRAMSim2的连接方法
3、GEM5成熟版运行spec2006测试程序:首先,将se-spec-good.py文件放入gem5目录下的configs/example目录下,将spec2006.sh放入GEM5目录下,在命令行下直接运行sh spec2006.sh即可。