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

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可能会遇到依赖错误的问题,解决方法可以参考这个链接: 解决Ubuntu12.04安装python-dev时依赖出错的问题_孙强 Jimmy 的博客-CSDN博客
(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/或者 gem5-stable.tar.gz_gem5下载-Linux工具类资源-CSDN下载下载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。
The PARSEC Benchmark Suite下载PARSEC3.0,fft benchmark在parsec\ext\splash2\kernels\fft这个目录下。编译的过程参考: PARSEC benchmark 编译_傻红就是不爱跑步的博客-CSDN博客
注意: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的使用方法可以参见 Bitbucket
再在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
从官网 HP Labs : 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
从官网 HotSpot 6.0 Temperature Modeling Tool下载 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的联合仿真就结束了。
gem5学习基础完整版,介绍了gem5环境的安装,以及一些基本概念。 gem5仿真器是用于计算机系统体系结构研究的模块化平台,涵盖系统级体系结构以及处理器微体系结构。1、多个可互换的CPU型号。 gem5提供了四种基于解释的CPU模型:简单的单CPI CPU; 有序CPU的详细模型无序CPU的详细模型。 这些CPU模型使用通用的高级ISA描述。 此外,gem5具有基于KVM的CPU,该CPU使用虚拟化来加速仿真。 2、完全集成的GPU模型,可以执行真实计算机ISA,并支持与主机CPU共享的虚拟内存。 3、NoMali GPU模型。 gem5带有集成的NoMali GPU模型,该模型与LinuxAndroid GPU驱动程序堆栈兼容,因此无需进行软件渲染。 NoMali GPU不产生任何输出,但可以确保以CPU为中心的实验产生代表性的结果。 4、事件驱动的内存系统。 gem5具有详细的,事件驱动的内存系统,包括高速缓存,交叉开关,探听过滤器以及快速而准确的DRAM控制器模型,用于捕获当前新兴内存的影响,例如内存。 LPDDR3 / 4/5,DDR3 / 4,GDDR5,HBM1 / 2/3,HMC,WideIO1 / 2。 可以灵活地布置组件,例如,以具有异构存储器的复杂的多级非均匀高速缓存层次结构来建模。 5、基于跟踪的CPU模型,可播放弹性跟踪,这些跟踪是由附着到乱序CPU模型的探针生成的依赖项定时注释的跟踪。 跟踪CPU模型的重点是以快速,合理的方式而不是使用详细的CPU模型来实现内存系统(高速缓存层次结构,互连主内存)的性能探索。 6、异构异构多核。 可以将CPU模型缓存组合到任意拓扑中,从而创建同构异构的多核系统。 MOESI侦听缓存一致性协议可保持缓存一致性。 7、多种ISA支持。 gem5将ISA语义与其CPU模型解耦,从而实现对多个ISA的有效支持。 目前gem5支持Alpha,ARM,SPARC,MIPS,POWER,RISC-Vx86 ISA。 有关更多信息,请参见支持的体系结构。
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

孙强 Jimmy

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值