1. 程式人生 > >gem5、McPAT和HotSpot的聯合模擬實驗教程

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可能會遇到依賴錯誤的問題,解決方法可以參考這個連結:
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 編譯Gem5http://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的聯合模擬就結束了。 參考: http://blog.csdn.net/caoyahong114/article/details/50955732