112-02 CE3001 : Computer Organization Final Project
📘 NOTE |
---|
模擬結果放在 project/result 目錄 |
詳細 commit 在 dev 分支 |
▶️ Outline
⬆️ Setting up the Project
-
Environment
Ubuntu 18.04 LTS
-
Toolkits
sudo apt install build-essential git m4 scons zlib1g zlib1g-dev \ libprotobuf-dev protobuf-compiler libprotoc-dev libgoogle-perftools-dev \ python3-dev python3-six python libboost-all-dev pkg-config
-
Install gem5
-
Unzip and compile gem5
scons build/X86/gem5.opt -j 4
–j
選項是 multithread 加速 (Optional) (arg: int)🚨 CAUTION 在 gen5 目錄下 🚨 CAUTION 編譯之後位置就不能動 (編譯過程有使用到絕對路徑) -
Clone NVmain
git clone https://github.com/SEAL-UCSB/NVmain
或者使用
git submodule
也可以🚨 CAUTION 把 NVmain 跟 gem5 放到同一個目錄下 -
Comment
NVmain/SConscript
把 36 行的
from gem5_scons import Transform
註解掉並存檔 -
Compile NVmain
scons --build-type=fast
🚨 CAUTION : 在 NVmain 目錄下 -
Modify
gem5/configs/common/Options.py
第 133 行加入以下程式並存檔
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")
-
Uncomment
NVmain/SConscript
還原前面註解掉的
from gem5_scons import Transform
-
Compile Together
scons EXTRAS=../NVmain build/X86/gem5.opt
🚨 CAUTION : 在 gen5 目錄下
⬆️ Q2. Enable L3 cache
-
修改檔案
-
gem5/configs/common/Options.py
-
gem5/configs/common/Caches.py
-
gem5/configs/common/CacheConfig.py
-
gem5/src/mem/Xbar.py
-
gem5/src/cpu/BaseCPU.py
-
-
注意
📘 NOTE 前面四個檔案只是增加 L3 cache 的 parameter,
照著 L2 cache 的設定去做模仿就可以。📘 NOTE CacheConfig.py
需要讓 L3 cache 連接整個 Gem5 系統,
這邊要注意 L2 跟 L3 這兩個 cache 的關係,
要讓系統在已使用 L2 cache 的情況下才能使用 L3 cache,
所以要注意修改的時候有沒有滿足這個條件。📘 NOTE 細節 code 的部分,
同學可以上網找資源關鍵字 Gem5 L3 cache 之類的。
⬆️ Grading Criteria
-
Q1. GEM5 + NVMAIN BUILD-UP (40%)
- Answer : 按照 PowerPoint 做
-
Q2. Enable L3 last level cache in GEM5 + NVMAIN (15%)
- Answer : Modify these files
- Goal : 看到 config.ini 裡面有 L3 cache 的資訊
-
Q3. Config last level cache to 2-way and full-way associative cache and test performance (15%)
- Answer : Option
--l3_assoc
. Set to 1 indicates full-way associativity (search "set to 1") - Goal : 可用 miss rate 判斷是否成功
- Submit : the log files for running the quicksort.out using 2-way and full-way.
- Answer : Option
-
Q4. Modify last level cache policy based on frequency based replacement policy (15%)
- Answer : Modify
gem5/configs/common/Caches.py
- Submit : the log files for running the quicksort.out or multiply.out using original (LRU) & frequency based (LFU).
- Demo : running the quicksort.out
- Answer : Modify
-
Q5. Test the performance of write back and write through policy based on 4-way associative cache with isscc_pcm (15%)
🔮 IMPORTANT : gem5 預設使用 write back,write through 要自己實作 - Answer : Modify
gem5/src/mem/cache/base.cc
(maybe?) - Goal : 可用 write request 的數量判斷 write through 是否成功
- Submit : the log files for running the multiply.out using write through & write back.
- Answer : Modify
-
Bonus (10%)
Design last level cache policy to reduce the energy consumption of pcm_based main memory
- Answer : ?
- Goal : ?
- Submit : the log files for running the hello.out using baseline (LRU) & modified method.
⬆️ Common Options
build/X86/gem5.opt # 可能是某種能執行 Python 的可執行檔
--help # 幫助
--debug-help # 有哪些 SimObject 可以開啟 DEBUG
--debug-flags=FLAG[,FLAG] # 指定哪些 SimObject 要開啟 DEBUG (開啟 DPRINTF 輸出)
configs/example/se.py # Python 腳本
--help # 幫助
--cpu-type=TimingSimpleCPU # CPU 類型 (TimingSimpleCPU: Base CPI 為 1 的簡單 CPU)
--sys-clock=SYS_CLOCK # 系統 clock
--cpu-clock=CPU_CLOCK # CPU clock
--mem-type=NVMainMemory # 記憶體類型 (NVMainMemory: 使用 NVMain 模擬)
--caches # 使用 L1 快取
--l2cache # 使用 L2 快取
--l3cache # 使用 L3 快取 (自訂)
--l1d_size='128kB' # L1D 大小
--l1i_size='128kB' # L1I 大小
--l2_size='1MB' # L2 大小
--l3_size='1MB' # L3 大小
--l1d_assoc=L1D_ASSOC # L1D set
--l1i_assoc=L1I_ASSOC # L1I set
--l2_assoc=L2_ASSOC # L2 set
--l3_assoc=L3_ASSOC # L3 set
--ruby # ...
--abs-max-tick=TICKS # 限制模擬跑多少個 tick 就中止 (1 tick 預設 1 ps)
--maxinsts=MAXINSTS # 限制模擬的 CPU 跑多少個指令就中止
--options=OPTIONS # 如果 binary file 有 cmd args,在這裡餵給它 (要用雙引號刮起來)
--nvmain-config=../NVmain/Config/PCM_ISSCC_2012_4GB.config # 記憶體配置 (自訂)
--cmd tests/test-progs/hello/bin/x86/linux/hello # 讓模擬執行指定 binary file
--output=FILE # 將執行 binary file 產生的標準輸出導向某檔案
--errout=ERROUT # 將執行 binary file 產生的標準錯誤導向某檔案
⬆️ Diagram
%%{init:{"flowchart":{"defaultRenderer":"elk"}}}%%
flowchart LR
subgraph system
subgraph cpu
direction TB
icache_port
dcache_port
subgraph l1icache
l1i_cpu_side["cpu_side"]
l1i_mem_side["mem_side"]
end
subgraph l1dcache
l1d_cpu_side["cpu_side"]
l1d_mem_side["mem_side"]
end
end
subgraph l2bus
l2bus_slave["slave"]
l2bus_master["master"]
end
subgraph l2cache
l2_cpu_side["cpu_side"]
l2_mem_side["mem_side"]
end
subgraph l3bus
l3bus_slave["slave"]
l3bus_master["master"]
end
subgraph l3cache
l3_cpu_side["cpu_side"]
l3_mem_side["mem_side"]
end
subgraph membus
slave_membus["slave"]
master_membus["master"]
end
end
icache_port --- l1i_cpu_side
dcache_port --- l1d_cpu_side
l1i_mem_side --- l2bus_slave
l1d_mem_side --- l2bus_slave
l2bus_master --- l2_cpu_side
l2_mem_side --- l3bus_slave
l3bus_master --- l3_cpu_side
l3_mem_side --- slave_membus