gem5、McPAT和HotSpot的联合仿真实验教程

版权声明:本文为博主原创文章,转载请注明:http://blog.csdn.net/u013541140 https://blog.csdn.net/u013541140/article/details/51955505
1. Gem5
Gem5由C++和 Python共同完成。可以在FS(full system)模式下模拟完整的系统,或是在SE(syscall emulation)模式下由模拟器提供系统调用模拟用户空间程序。
1.1 Gem5的安装
1.1.1 预装软件
(1)安装python
因为scons是用python写的,所以在使用scons之前,我们需要安装python。一般情况在你安装的系统中都已经有python,可以使用: python -V或者 python –version来查看你系统中的python的版本。
(2)在联网的情况下直接使用下列命令安装scons、g++、python-dev、libprotobuf-dev、libgoogle-perftools-dev。
sudo apt-get install scons
sudo apt-get install g++
sudo apt-get install python-dev
sudo apt-get install libprotobuf-dev
sudo apt-get install libgoogle-perftools-dev
在Ubuntu12.04安装python-dev可能会遇到依赖错误的问题,解决方法可以参考这个链接: http://blog.csdn.net/u013541140/article/details/51838485
(3)在网上下载以下安装包: protobuf-2.5.0.tar.gzpcre-8.38.tar.gzswig-2.0.7.tar.gzzlib-1.2.8.tar.gzm4-1.4.16.tar.gz,将这些安装包放到自己的目录下,例如:/home/jimmy/gem5/
解压缩以上的压缩包,并将文件夹重命名为:protobuf、pcre、swig、zlib、m4,按顺序依次进入每个文件夹内,按照一般软件的安装方法进行安装,即:
./configure
make
sudo make install
1.1.2 编译Gem5
http://repo.gem5.org/或者 http://download.csdn.net/detail/u013541140/9568720下载gem5-stable,解压到gem5里,重命名为gem5-stable,然后执行下列命令:
cd /home/jimmy/gem5/gem5-stable
mkdir build
scons build/X86/gem5.opt
1.1.3 运行例子程序
执行下列代码:
./build/X86/gem5.opt ./configs/example/se.py -c tests/test-progs/hello/bin/x86/linux/hello
当看到类似以下的输出内容时,证明Gem5已经安装成功。
info: Entering event queue @ 0.  Starting simulation...
info: Increasing stack size by one page.
Hello world!
hack: be nice to actually delete the event here
Exiting @ tick 3233000 because target called exit()
1.2 使用Gem5运行benchmark,得到相应的输出文件
这里我们选用全系统模式进行仿真,整篇文章中以fft为例。
http://gem5.org/Download下载Alpha和X86全系统文件的压缩包,然后在gem5-stable下新建dist文件夹,把这两个压缩包解压到dist文件夹里,然后把linux-x86.img修改为x86root.img。
http://parsec.cs.princeton.edu/下载PARSEC3.0,fft benchmark在parsec\ext\splash2\kernels\fft这个目录下。编译的过程参考: http://blog.csdn.net/caoyahong114/article/details/51654937
注意:fft benchmark必须在64位系统下编译,否则其在x86的全系统中模拟会报错。
(1)修改gem5的配置文件
修改gem5-stable/configs/common目录下的SysPaths.py文件,将dist的路径修改为自己的,例如: 
path = [ '/dist/m5/system', '/home/jimmy/gem5/gem5-stable/dist' ]
(2)将benchmark和相应的输入文件mount到/mnt下
cd /home/jimmy/gem5/gem5-stable
sudo mount -o,loop,offset=32256 ./dist/disks/x86root.img /mnt
sudo mkdir /mnt/mybench
sudo cp benchmark/fft /mnt/mybench/
(3)将benchmark装载进磁盘后,一定要解除挂载
sudo umount /mnt/
(4)在目录gem5-stable/configs/boot下,添加benchmark的rcS文件。例如:fft.rcS。内容如下
#!/bin/sh
cd mybench
/sbin/m5 dumpstats 0 300000
/sbin/m5 resetstats 0 300000

echo ">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>"
echo "Running benchmark fft now ..."
./fft -m10 -p1 -n65536 -l4 -o
echo "Finish benchmark fft :D"
echo ">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>"

/sbin/m5 exit
(5)运行benchmark,执行下列的命令,等待几分钟
./build/X86/gem5.opt -r -d m5out/ configs/example/fs.py --kernel=x86_64-vmlinux-2.6.22.9.smp --caches --script=./configs/boot/fft.rcS
注意:这里的输出文件的目录是m5out/,我们是可以指定这个输出目录的。
(6)程序运行完以后,在目录gem5-stable/m5out下查看相应的输出文件。文件夹中有文件:config.ini 、 config.json 、 simout 、 stats.txt 、 system.pc.com_1.terminal,我们主要关注的是stats.txt,提取其中的信息。
2. gem5toMcPAT
对于gem5生成的stats.txt文件不能直接作为McPAT的输入文件,所以我们需要一些脚本进行中间转换,转变为McPAT可以识别的格式。
新建gem5tomcpat文件夹,进入该文件夹中,使用如下命令获取GEM5ToMcPAT
git clone https://bitbucket.org/dskhudia/gem5tomcpat.git
关于GEM5ToMcPAT的使用方法可以参见 https://bitbucket.org/dskhudia/gem5tomcpat
再在gem5tomcpat文件夹中新建fft文件夹。
我们通过设置dump可以得到多段stats的数值,但是GEM5ToMcPAT.py只能处理一段,所以我们可以将stats.txt进行分段。
下面是使用 Python语言写的可以进行分段的文件partition.py,放在gem5-stable/m5out文件夹里,代码如下:
# import re
# map(lambda i: file('%d.txt' % i[0], 'w').write(i[1]), enumerate(re.findall(r'(@?Finish &)', file('test01.txt').read(), re.S)))

#coding=gbk
f1 = file("stats.txt")
ss = "---------- Begin Simulation Statistics ----------"
sr = f1.read().split(ss)                      
f1.close()
for i in range(len(sr)):
    f = file("%d.txt" % i, "w")
    f.write(sr[i] if i == 0 else ss + sr[i])
    f.close()
然后执行python partition.py,通过上述脚本的处理,我们可以得到多个txt文件,将这些文件移动到gem5tomcpat/fft文件夹中。
至此,我们需要GEM5ToMcPAT进行转换,将txt文件转变为xml文件(xml文件即是mcpat可以识别的文件格式),下面使用shell脚本进行转换,例如fft.sh的内容如下:
#!/bin/bash

i=1
for i in {1..102}
do
    python GEM5ToMcPAT.py /home/jimmy/gem5/gem5tomcpat/fft/$i.txt /home/jimmy/gem5/gem5-stable/m5out/config.json x86.xml
    mv mcpat-out.xml /home/jimmy/gem5/gem5tomcpat/fft/fft_$i.xml
    let i=i+1
done
注意一:for i in {1..102}中的102要修改为自己分出的多个txt文件中最后一个文件的文件名。
注意二:这里的x86.xml是我们自己写的xml模板文件,用于提取stats中的信息。该文件基于template-xeon.xml模版文件,根据stats.txt和config.json进行修改和删除,需要使用
python GEM5ToMcPAT.py /home/jimmy/gem5/gem5tomcpat/fft/1.txt /home/jimmy/gem5/gem5-stable/m5out/config.json x86.xml
一次一次去试,一次一次去改,这是一个非常麻烦的过程。
然后我们就可以得到所有的xml文件。
3. McPAT
从官网 http://www.hpl.hp.com/research/mcpat/下载 mcpat,解压到自己的目录下,在make的时候可能会报错,这时我们需要安装以下的东西:
sudo apt-get install gcc-multilib
sudo apt-get install g++-multilib
然后make就可以通过了。接下来我们就可以使用mcpat进行实验了。
在mcpat文件夹里新建fft-results文件夹,然后将上述得到的xml文件作为输入文件,通过mcpat可执行文件就可以生成我们需要的功耗文件,即xxx.log文件。
将所有的xml文件转换为log文件的fft.sh的内容如下:
#!/bin/bash

i=1
for i in {1..102}
do
    ./mcpat -infile /home/jimmy/gem5/gem5tomcpat/fft/fft_$i.xml -print_level 5 > /home/jimmy/gem5/mcpat/fft-results/fft_$i.log
    let i=i+1
done
注意:这里的102指的是我们拥有102个xml文件,通过上述脚本的执行,将会产生102个xxx.log文件,接下来我们需要将所有的xxx.log文件合并为一个log文件。所用的脚本merge-fft.sh的内容如下:
#!/bin/bash

j=1
for j in {1..102}
do
	cat /home/jimmy/gem5/mcpat/fft-results/fft_$j.log >> /home/jimmy/gem5/mcpat/fft-results/fft.log
	let j=j+1
done
至此,我们就得到了fft.log文件。
4. McPAT2HotSpot
建立新的文件夹,命名为:mcpat2hotspot,将上述fft.log文件拷贝到该文件夹下。这里我们主要提取fft.log文件中的动态功耗,所以使用下面的脚本进行提取,其内容如下:
#!/bin/bash

cat /home/jimmy/gem5/mcpat2hotspot/fft.log | grep "Runtime Dynamic" > /home/jimmy/gem5/mcpat2hotspot/fft.txt
readf="/home/jimmy/gem5/mcpat2hotspot/fft.txt"
printf="/home/jimmy/gem5/mcpat2hotspot/fft_num.txt"

for (( i=1;i<=106;i=i+1 ))
    do 
        exp=$( head -n 40 $readf )
        echo -n "$exp" | sed -n '4p' | awk '{printf $4 "\t"}' >> $printf
        echo -n "$exp" | sed -n '5p' | awk '{printf $4 "\t"}' >> $printf
        echo -n "$exp" | sed -n '6p' | awk '{printf $4 "\t"}' >> $printf
        echo -n "$exp" | sed -n '15p' | awk '{printf $4 "\t"}' >> $printf
        echo -n "$exp" | sed -n '16p' | awk '{printf $4 "\t"}' >> $printf
        echo -n "$exp" | sed -n '21p' | awk '{printf $4 "\t"}' >> $printf
        echo -n "$exp" | sed -n '22p' | awk '{printf $4 "\t"}' >> $printf
        echo -n "$exp" | sed -n '25p' | awk '{printf $4 "\t"}' >> $printf
        echo -n "$exp" | sed -n '28p' | awk '{printf $4 "\t"}' >> $printf
        echo -n "$exp" | sed -n '29p' | awk '{printf $4 "\t"}' >> $printf
        echo -n "$exp" | sed -n '36p' | awk '{printf $4 "\t"}' >> $printf
        echo -n "$exp" | sed -n '37p' | awk '{printf $4 "\n"}' >> $printf
        tail -n +41 $readf > temp.txt
        cat temp.txt > $readf 
    done

rm -rf /home/jimmy/gem5/mcpat2hotspot/fft.txt
rm -rf /home/jimmy/gem5/mcpat2hotspot/temp.txt
这样我们可以得到fft_num.txt文件,然后将数据拷贝到excel中进行计算,就可以得到各个部件的功耗值。
5. HotSpot
从官网 http://lava.cs.virginia.edu/HotSpot/index.htm下载 HotSpot-6.0.tar.gz,解压到自己的目录下。 
以上述得到的动态功耗文件作为输入文件,通过hotspot可执行文件,我们就可以得到各个部件温度的值。
在hotspot中默认的模型是block模型,我们可以指定模型,比如grid模型。
block模型:
./hotspot -c hotspot.config -f x86.flp -p fft.ptrace -o fft.ttrace

./hotspot -c hotspot.config -f x86.flp -p fft.ptrace -steady_file fft.steady
注意一:上述命令的x86.flp指的是版图文件,在hotspot中有默认的ev6.flp,但是我们需要自己的版图文件,所以我们可以根据fft.log文件中的各个部件的面积来计算每个部件的长、宽和坐标,自己规划版图。
注意二:fft.ptrace文件是我们从mcpat2hotspot得到的功耗文件在第一行加上部件名,fft.ttrace是瞬态时的温度文件,fft.steady 是稳态时的温度文件。
grid模型:
./hotspot -c hotspot.config -f x86.flp -p fft.ptrace -o fft.ttrace -steady_file fft.steady -model_type grid -grid_steady_file fft.grid.steady 
./grid_thermal_map.pl x86.flp fft.grid.steady > fft.svg
convert -font Helvetica svg:fft.svg fft.pdf
注意一:x86.flp是版图文件, fft.ptrace是功耗文件, fft.ttrace 是瞬态温度,fft.steady是稳态温度。
注意二:通过第二条语句我们可以生成一个fft.svg文件,这是一个中间文件。
注意三:通过第三条语句我们可以生成fft.pdf文件,该文件是一个彩色的温度分布图。

至此,gem5、McPAT和HotSpot的联合仿真就结束了。

猜你喜欢

转载自blog.csdn.net/u013541140/article/details/51955505