GEM5使用总结

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//m5.(使用scons-local时

scons build//m5.(使用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.out166.out"

--errout="input.source.err166.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.pycpu2006.py放入configs/example/文件夹下。注意有两个cpu2006.py(分别在ref-cpu2006test-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即可。

 


你可能感兴趣的:(GEM5使用总结)