gem5和NVM的搭建(完整版)
搭建gem5和NVM
搭建環境
操作系統 Ubuntu Server 16.04.1 LTS 64位 CPU 1核 內存 2GB 公網帶寬 1Mbps主要參考資料
主要參考的博客
資源下載
由于hg掛了,而且我用的是云機,很多國內的流量無法clone,只好下好了上傳,這里整理了過程中用到的所有資源
步驟流程
路徑說明
+-- nvmain | +-- gem5 | +-- fs-image | +-- benchmark它們是同一路徑!!!正式開始
安裝nvm
wget https://bitbucket.org/mrp5060/nvmain/get/9c0e87b164bc.zip -O nvmain.zip unzip nvmain.zip mv mrp5060-nvmain-9c0e87b164bc nvmain安裝scon
安裝編譯工具scons sudo apt-get install scons編譯NVMain
編譯NVMain,其中編譯的類型可以選擇fast|debug|prof三種的任意一種,這里我們選用fast
scons --build-type=fast這里編譯是一定會報錯的,但是要編譯了才有build文件,別直接到下面去找文件改
如果在編譯的過程中,報了如下的錯誤,無須緊張,這只是個小問題,是因為我們暫時還沒有用到gem5,所以只需將這個報錯的那一行代碼注釋即可.
scons: Reading SConscript files ... ImportError: No module named gem5_scons:File "/home/greek/master/experiment/nvmain/SConstruct", line 253:SConscript(joinpath(root, 'SConscript'), variant_dir=build_dir)File "/usr/lib/scons/SCons/Script/SConscript.py", line 614:return method(*args, **kw)File "/usr/lib/scons/SCons/Script/SConscript.py", line 551:return _SConscript(self.fs, *files, **subst_kw)File "/usr/lib/scons/SCons/Script/SConscript.py", line 256:call_stack[-1].globals)File "/home/greek/master/experiment/nvmain/build/SConscript", line 36:from gem5_scons import Transform具體的解決辦法是將nvmain/build/SConscript中的第36行注釋
# from gem5_scons import Transform # 這行注釋注意!我們后面還要修改回來,后面會講,這里只是為了讓你心里有譜
解決錯誤之后,再重新編譯
nvm測試
指定配置文件,指定測試文件,周期, 命令的格式為: ./nvmain CONFIG_FILE TRACE_FILE [Cycles [PARAM=value]]
我們這里的測試命令如下
測試結果
i0.defaultMemory.channel0.FRFCFS-WQF.maximum_reads_during_drain 0 i0.defaultMemory.channel0.FRFCFS-WQF.starvation_precharges 4704 i0.defaultMemory.channel0.FRFCFS-WQF.averageLatency 86.4423 i0.defaultMemory.channel0.FRFCFS-WQF.averageQueueLatency 2088.42 i0.defaultMemory.channel0.FRFCFS-WQF.averageTotalLatency 2174.86 i0.defaultMemory.channel0.FRFCFS-WQF.measuredLatencies 26485 i0.defaultMemory.channel0.FRFCFS-WQF.measuredQueueLatencies 26485 i0.defaultMemory.channel0.FRFCFS-WQF.measuredTotalLatencies 26485 i0.defaultMemory.channel0.FRFCFS-WQF.simulation_cycles 1000000 i0.defaultMemory.channel0.FRFCFS-WQF.wakeupCount 54116 i0.defaultMemory.totalReadRequests 13933 i0.defaultMemory.totalWriteRequests 12608 i0.defaultMemory.successfulPrefetches 0 i0.defaultMemory.unsuccessfulPrefetches 0 Exiting at cycle 5000000 because simCycles 5000000 reached. Note: 57 requests still in-flight.安裝gem5
在Ubuntu上,您可以使用以下命令安裝所有必需的依賴項。要求詳細說明如下。
官網說明
安裝依賴(若干)
sudo apt install build-essential git m4 scons zlib1g zlib1g-dev libprotobuf-dev protobuf-compiler libprotoc-dev libgoogle-perftools-dev python-dev python正常情況下這些東西不是全都做了鏡像的(我只測試了阿里和騰訊云),但是保證基礎的c++等(詳情見文檔)是必要的boost裝了會好很多systemc可以用了
安裝依賴庫protobuf-compiler
sudo apt-get install protobuf-compiler提前做好措施 (因為內存不足 使用交換分區來解決)
原因其實也很簡單:學生機只有1G,必定是不夠的,編譯過程中常常會自動kill
解決方法描述
sudo dd if=/dev/zero of=/swapfile bs=64M count=16 #count的大小就是增加的swap空間的大小,64M是塊大小,所以空間大小是bs*count=1024MB sudo mkswap /swapfile #把剛才空間格式化成swap格式 sudo swapon /swapfile #使用剛才創建的swap空間按理來說是應該還回去的,但是考慮到后面經常掛,就不還了
解壓并重命名
sudo unzip gem5-master.zip ubuntu@VM-0-5-ubuntu:~/skywf$ ls config-x86.tar.bz2 gem5-master.zip mrp5060-nvmain-7be1ae0275cb.zip nvmain.zip zlib-1.2.11.tar.gz gem5-master m5_system_2.0b3.tar.bz2 nvmain x86-system.tar.bz2 ubuntu@VM-0-5-ubuntu:~/skywf$ mv gem5-master gem5 ubuntu@VM-0-5-ubuntu:~/skywf$ ls config-x86.tar.bz2 gem5-master.zip mrp5060-nvmain-7be1ae0275cb.zip nvmain.zip zlib-1.2.11.tar.gz gem5 m5_system_2.0b3.tar.bz2 nvmain x86-system.tar.bz2開始編譯
漫長的等待,大概1個小時吧
$<2> [ CXX] X86/cpu/kvm/x86_cpu$<2>.cc$<2> -> $<2>.o$<2> $<2> [ LINK] $<2>$<2> -> $<2>X86/cpu/kvm/lib.o.partial$<2> $<2> [ CXX] X86/base/date$<2>.cc$<2> -> $<2>.o$<2> $<2> [ LINK] $<2>$<2> -> $<2>X86/gem5.opt$<2> scons: done building targets.說明編譯好了
Gem5的SE測試
Gem5的FS測試
FS測試
能夠啟動完整的操作系統 建模硬件設備 中斷,異常,故障處理函數參考下載的網址
若沒有使用我提供的包,需要自己下載
下載X86全系統對應的文件,一定要下載自己編譯架構的對應文件
部分架構存在不可知的bug,沒事兒別去探險
wget http://www.m5sim.org/dist/current/x86/x86-system.tar.bz2解壓文件,同時將解壓后的文件夾放入同一目錄fs-image
tar vxfj x86-system.tar.bz2 mkdir fs-image mv binaries fs-image mv disks fs-image下載alpha對應的全系統文件,里面包含linux-bigswap2.img,這個是運行的一個必須文件.下載之后,解壓文件,同時將文件拷貝到fs-image/disks目錄下,可以理解為專門存放鏡像文件的目錄
wget http://www.m5sim.org/dist/current/m5_system_2.0b3.tar.bz2 tar vxfj m5_system_2.0b3.tar.bz2 cp m5_system_2.0b3/disks/linux-bigswap2.img fs-image/disks若使用了我提供的包,直接解壓即可
sudo tar vxfj x86-system.tar.bz2 mkdir fs-image sudo mv binaries fs-image sudo mv disks fs-image sudo tar vxfj m5_system_2.0b3.tar.bz2 sudo cp m5_system_2.0b3/disks/linux-bigswap2.img fs-image/disks運行FS模擬
./build/X86/gem5.opt configs/example/fs.py報了如下的錯誤,這里因為腳本代碼中默認了鏡像為x86root.img
Traceback (most recent call last):File "<string>", line 1, in <module>File "build/X86/python/m5/main.py", line 457, in mainexec(filecode, scope)File "configs/example/fs.py", line 342, in <module>test_sys = build_test_system(np)File "configs/example/fs.py", line 93, in build_test_systemcmdline=cmdline)File "/home/ubuntu/skywf/gem5/configs/common/FSConfig.py", line 622, in makeLinuxX86SystemmakeX86System(mem_mode, numCPUs, mdesc, self, Ruby)File "/home/ubuntu/skywf/gem5/configs/common/FSConfig.py", line 548, in makeX86Systemdisks = makeCowDisks(mdesc.disks())File "/home/ubuntu/skywf/gem5/configs/common/Benchmarks.py", line 63, in disksreturn [env.get('LINUX_IMAGE', disk('x86root.img'))]File "/home/ubuntu/skywf/gem5/configs/common/SysPaths.py", line 69, in __call__.format(self.environment_variable)) IOError: Can't find system files directory, check your M5_PATH environment variable解決辦法
這里有兩種解決辦法,推薦使用第二種:
注意此處需要指定M5_PATH
注意此處x86有大寫有小寫
其中指定M5_PATH我提供了兩種方式,推薦使用第二種
注意這里的路徑有ubuntu,和centos不太一樣
直接在運行命令中動態添加環境變量
M5_PATH=/home/skywf/fs-image ./build/X86/gem5.opt configs/example/fs.py --disk-image linux-x86.img --kernel x86_64-vmlinux-2.6.22.9注意上面的skywf換成自己的用戶名
linux-x86.img為fs-image/disks/目錄下文件, x86_64-vmlinux-2.6.22.9為fs-image/binaries/目錄下文件,我看網上很多教程將x86_64-vmlinux-2.6.22.9改名為vmlinux,這步的話其實意義不是特別大,不過改了也方便,我這里暫不做修改
可能遇到的問題
原因是你沒有文件操作的權限,可以通過sudo改變777或者直接sudo命令解決
問題解析
M5_PATH路徑設置還是有問題,這里有點玄學我還沒弄懂,不過用指定動態變量可以解決暫時按下不表。
連接模擬系統
利用gem5系統自帶的一個連接程序,在gem5/util/term/目錄中,先進行make,生成可執行文件
cd util/term/ make./m5term localhost 3456[推薦使用] 直接利用telnet連接系統
telnet localhost 3456騰訊云默認沒有放開這個端口,請到安全組里面自己打開
出現下面這個代表成功連上了
退出
這里我依舊使用兩種方法,推薦使用第一種方法
在連接的命令行中輸入 m5 exit
在連接的命令行中輸入 ~.
NVMain和Gem5的集成環境
為啥打補丁
Gem5補丁
首先為了消除NVMain和Gem5版本之間的差異,所以首先需要給Gem5打上補丁.(別聽到補丁就覺得畏懼,一開始我有這種感覺,其實后面發現真的沒啥).
開打補丁
手動補丁,直接查看補丁的內容,手動修改文件,如下所示為補丁的內容
補丁文件已經在nvmain/patches/gem5目錄中給出,nvmain2-gem5-11688+這個是補丁文件的名字,在nvmain/patches/gem5中,以后可能是其他的版本,換成自己的版本補丁名字即可.
ubuntu@VM-0-5-ubuntu:~/skywf/nvmain/patches/gem5$ ls nvmain2-gem5-11688+ # HG changeset patch # Parent 78ef8daecd81de0c392034809b3bc155396bf983 gem5: Updated for gem5 revisions 10789+diff --git a/configs/common/Options.py b/configs/common/Options.py --- a/configs/common/Options.py +++ b/configs/common/Options.py @@ -63,6 +63,12 @@# being used, and consequently no CPUs, but rather various types of# testers and traffic generators.def addNoISAOptions(parser): + # Check for extra nvmain configuration override options + for arg in sys.argv: + if arg[:9] == "--nvmain-": + parser.add_option(arg, type="string", default="NULL", + help="Set NVMain configuration value for a parameter") +parser.add_option("-n", "--num-cpus", type="int", default=1)parser.add_option("--sys-voltage", action="store", type="string",default='1.0V',其實說白了就是增加了三行,咱們手動加上就可以了
只需在gem5/configs/common/Options.py的第82行之后,加入如下三行(有可能是89行,取決于編輯器為vim or nano)
反正只要是在addnoisaoptions下就可以了
NVMain和Gem5混合編譯
在gem5文件夾下(搞到半夜頭昏昏在nvmain下弄了半天氣死了)
scons EXTRAS=../nvmain build/X86/gem5.opt發現報錯
NameError: global name 'Transform' is not defined:File "/home/ubuntu/skywf/gem5/SConstruct", line 1269:SConscript('src/SConscript', variant_dir = variant_path, exports = 'env')File "/usr/lib/scons/SCons/Script/SConscript.py", line 614:return method(*args, **kw)File "/usr/lib/scons/SCons/Script/SConscript.py", line 551:return _SConscript(self.fs, *files, **subst_kw)File "/usr/lib/scons/SCons/Script/SConscript.py", line 260:exec _file_ in call_stack[-1].globalsFile "/home/ubuntu/skywf/gem5/build/X86/SConscript", line 618:SConscript(joinpath(root, 'SConscript'), variant_dir=build_dir)File "/usr/lib/scons/SCons/Script/SConscript.py", line 614:return method(*args, **kw)File "/usr/lib/scons/SCons/Script/SConscript.py", line 551:return _SConscript(self.fs, *files, **subst_kw)File "/usr/lib/scons/SCons/Script/SConscript.py", line 260:exec _file_ in call_stack[-1].globalsFile "/home/ubuntu/skywf/gem5/build/X86/nvmain/SConscript", line 88:MakeInclude('SimInterface/Gem5Interface/Gem5Interface.h')File "/home/ubuntu/skywf/gem5/build/X86/nvmain/SConscript", line 85:include_action = MakeAction(MakeIncludeAction, Transform("MAKE INC", 1))這是因為之前我們刪除了一行,現在還原
sudo nano nvmain/build/SConscript好了接下來又是等待
收獲檢驗
測試,其中混合編譯成功的一個重要標志是可以使用–mem-type=NVMainMemory參數來指定主存為NVM
M5_PATH=/home/hsc/fs-image ./build/X86/gem5.opt configs/example/se.py -c tests/test-progs/hello/bin/x86/linux/hello --caches --l2cache --mem-type=NVMainMemory --nvmain-config=../nvmain/Config/PCM_ISSCC_2012_4GB.config只要你出現這個,就證明你自己的工作ok了
i0.defaultMemory.channel0.FRFCFS-WQF.maximum_read_spacing 0 i0.defaultMemory.channel0.FRFCFS-WQF.total_readqueue_size 0 i0.defaultMemory.channel0.FRFCFS-WQF.average_predrain_readqueue_size 0 i0.defaultMemory.channel0.FRFCFS-WQF.minimum_predrain_readqueue_size 10000000000 i0.defaultMemory.channel0.FRFCFS-WQF.maximum_predrain_readqueue_size 0 i0.defaultMemory.channel0.FRFCFS-WQF.total_reads_during_drain 0 i0.defaultMemory.channel0.FRFCFS-WQF.average_reads_during_drain 0 i0.defaultMemory.channel0.FRFCFS-WQF.minimum_reads_during_drain 10000000000 i0.defaultMemory.channel0.FRFCFS-WQF.maximum_reads_during_drain 0 i0.defaultMemory.channel0.FRFCFS-WQF.starvation_precharges 0 i0.defaultMemory.channel0.FRFCFS-WQF.averageLatency 0 i0.defaultMemory.channel0.FRFCFS-WQF.averageQueueLatency 0 i0.defaultMemory.channel0.FRFCFS-WQF.averageTotalLatency 0 i0.defaultMemory.channel0.FRFCFS-WQF.measuredLatencies 0 i0.defaultMemory.channel0.FRFCFS-WQF.measuredQueueLatencies 0 i0.defaultMemory.channel0.FRFCFS-WQF.measuredTotalLatencies 0 i0.defaultMemory.channel0.FRFCFS-WQF.simulation_cycles 1188 i0.defaultMemory.channel0.FRFCFS-WQF.wakeupCount 0 i0.defaultMemory.totalReadRequests 0 i0.defaultMemory.totalWriteRequests 0 i0.defaultMemory.successfulPrefetches 0 i0.defaultMemory.unsuccessfulPrefetches 0來來回回折騰了十幾次,趕緊買個臺式機安裝吧
總結
以上是生活随笔為你收集整理的gem5和NVM的搭建(完整版)的全部內容,希望文章能夠幫你解決所遇到的問題。