对于gem5的安装在下面这篇文章中已经有了描述,这里不再赘述。
gem5的安装
这里我们选用全系统模式进行仿真,整篇文章中均以fft为例。
(1)修改gem5的配置文件
修改/cyh/gem5/gem5-stable/configs/common目录下的SysPaths.py文件,将dist的路径修改为我自己的,例如:
path = [ ‘/dist/m5/system’, ‘/home/cyh/cyh/gem5/gem5-stable/dist’ ]
(2)将benchmark和相应的输入文件mount到/mnt下
cd /home/cyh/cyh/gem5/gem5-stable
sudo mount -o,loop,offset=32256 ./dist/disks/x86root.img /mnt
cd /mnt
sudo cp /home/cyh/cyh/gem5/gem5-stable/benchmark/fft ./mybench
(3)将benchmark装载进磁盘后,一定要解除挂载
cd /home/cyh/cyh/gem5/gem5-stable
sudo umount /mnt
(4)在目录/home/cyh/cyh/gem5/gem5-stable/configs/boot下,添加每个benchmark的rcS文件。例如:mybench_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.28.4-smp --caches -b mybench_fft
注意:这里的输出文件的目录是m5out/,我们是可以指定这个输出目录的。
(6)程序运行完以后,在目录/home/cyh/cyh/gem5/gem5-stable/m5out下查看相应的输出文件。文件夹中有文件:config.ini 、 config.json 、 simout 、 stats.txt 、 system.pc.com_1.terminal,我们主要关注的是stats.txt,提取其中的信息。
注意一:对于gem5生成的stats.txt文件不能直接作为mcpat的输入文件,所以我们需要一些脚本进行中间转换,转变为mcpat可以识别的格式。
注意二:我们通过设置dump可以得到多段stats的数值,但是gem5tomcpat只能处理一段,所以我们可以将stats.txt进行分段。
下面是使用python语言写的可以进行分段的文件,代码如下:
# 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()
通过上述脚本的处理,我们可以得到多个txt文件,将这些文件打包拷贝到gem5tomcpat文件夹中。
至此,我们需要gem5tomcpat进行转换,将txt文件转变为xml文件(xml文件即是mcpat可以识别的文件格式),下面使用shell脚本进行转换,例如fft.sh的内容如下:
#!/bin/bash
i=1
for i in {1..102}
do
python GEM5ToMcPAT.py /home/cyh/cyh/gem5tomcpat/gem5tomcpat/fft/$i.txt config.json Z.xml
mv mcpat-out.xml /home/cyh/cyh/gem5tomcpat/gem5tomcpat/fft-results/fft_$i.xml
let i=i+1
done
注意:这里的Z.xml是我们自己写的xml模板文件,用于提取stats中的信息。
这样我们就可以得到所有的xml文件,将这些文件打包拷贝到mcpat中。
从官网上下载mcpat,我下载的是mcpat0.8_r274.tar.gz,解压到自己的目录下,在make的时候可能会报错,这时我们需要安装以下的东西:
sudo apt-get install gcc-multilib和
sudo apt-get install g++-multilib
然后make就可以通过了。接下来我们就可以使用mcpat进行实验了。
将上述得到的xml文件作为输入文件,通过mcpat可执行文件就可以生成我们需要的功耗文件,即xxx.log文件。
将所有的xml文件转换为log文件的fft.sh的内容如下:
#!/bin/bash
i=1
for i in {1..102}
do
./mcpat -infile /home/cyh/cyh/mcpat/fft/fft_$i.xml -print_level 5 > /home/cyh/cyh/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
i=1
for i in {1..102}
do
./mcpat -infile /home/cyh/cyh/mcpat/fft/fft_$i.xml -print_level 5 > /home/cyh/cyh/mcpat/fft-results/fft_$i.log
let i=i+1
done
至此,我们就得到了fft.log文件。
在/home/cyh/cyh目录下建立新的文件夹,命名为:mcpat2hotspot,将上述fft.log文件拷贝到该文件夹下。这里我们主要提取fft.log文件中的动态功耗,所以使用下面的脚本进行提取,其内容如下:
#! /bin/bash
cat /home/cyh/cyh/mcpat3hotspot/fft.log | grep "Runtime Dynamic" > /home/cyh/cyh/mcpat3hotspot/fft.txt
readf="/home/cyh/cyh/mcpat3hotspot/fft.txt"
#printf="/home/cyh/cyh/fft04.txt"
printf="/home/cyh/cyh/mcpat3hotspot/fft_num.txt"
for (( i=1;i<=102;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
# mv temp.txt $readf
cat temp.txt > $readf
done
rm -rf /home/cyh/cyh/mcpat3hotspot/fft.txt
rm -rf /home/cyh/cyh/mcpat3hotspot/temp.txt
这样我们可以得到fft_num.txt文件,然后将数据拷贝到excel中进行计算,就可以得到各个部件的功耗值。
从官网上下载HotSpot-6.0.tar.gz,解压到自己的目录下。
以上述得到的动态功耗文件作为输入文件,通过hotspot可执行文件,我们就可以得到各个部件温度的值。
在hotspot中默认的模型是block模型,我们可以指定模型,比如grid模型。
block模型:
./hotspot -c hotspot.config -f Z.flp -p fft.ptrace -o fft.ttrace
./hotspot -c hotspot.config -f Z.flp -p fft.ptrace -steady_file fft.steady
注意一:上述命令的Z.flp指的是版图文件,在hotspot中有默认的ev6.flp,但是我们需要自己的版图文件,所以我们可以根据fft.log文件中的各个部件的面积来计算每个部件的长、宽和坐标。
注意二:fft.ptrace文件是我们从mcpat2hotspot得到的功耗文件,fft.ttrace是瞬态时的温度文件,fft.steady 是稳态时的温度文件。
grid模型:
./hotspot -c hotspot.config -f Z.flp -p fft.ptrace -o fft.ttrace -steady_file fft.steady -model_type grid -grid_steady_file fft.grid.steady
./grid_thermal_map.pl Z.flp fft.grid.steady > fft.svg
convert -font Helvetica svg:fft.svg fft.pdf
注意一:Z.flp是版图文件, fft.ptrace是功耗文件, fft.ttrace 是瞬态温度,fft.steady是稳态温度。
注意二:通过第二条语句我们可以生成一个gcc.svg文件,这是一个中间文件。
注意三:通过第三条语句我们可以生成fft.pdf文件,该文件是一个彩色的温度分布图。
至此,Gem5、Mcpat和Hotspot的联合仿真就结束了。
Good Luck Fern!