Gem5、Mcpat和Hotspot的联合仿真

版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/caoyahong114/article/details/50955732

一、Gem5

1、Gem5的安装

对于gem5的安装在下面这篇文章中已经有了描述,这里不再赘述。
gem5的安装

2、使用Gem5运行benchmark,得到相应的输出文件

这里我们选用全系统模式进行仿真,整篇文章中均以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,提取其中的信息。

二、gem5tomcpat

注意一:对于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

从官网上下载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文件。

四、mcpat2hotspot

在/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

从官网上下载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!

展开阅读全文

没有更多推荐了,返回首页