系列文章 : [gem5] 從零開始的 gem5 學習筆記
在有 AI 的年代,像我一樣對英文苦手的人,或許可以考慮直接把文檔丟給 Gemini進行翻譯。
例如說,可以把對於 gem5 的介紹 的網頁連結,直接丟給 Gemini進行翻譯。
幫我翻譯 https://www.gem5.org/documentation/learning_gem5/introduction/
Gemini 就吐出該網頁翻譯過後的內容。
AI 真是太強大了!希望有生之年不要被 AI 搶走所有工作...
回歸正題,什麼是 gem5 呢 ?
下面依照我的理解,來閱讀一下文件。
gem5 is a modular computer system simulator platform.
gem5 是一個模組化的模擬器。意思是每個 model 盡量都不要有太高的相依性,這讓我們可以很輕便的抽換一個平台上的 model。
例如我現在想要把一顆 CPU 從 RISC-V 的換成 ARM 的,理論上我們在平台內直接把 RISC-V CPU 物件 ( e.g. RiscvAtomicSimpleCPU ) 換成 ARM CPU 物件 ( e.g. ArmAtomicSimpleCPU ),而不需要更改其他的程式碼。( 雖然實際上可能還需要把 interrupt controller 一併換掉, e.g. PLIC 抽換成 gic )
gem5’s components can be rearranged, parameterized, extended or replaced easily to suit your needs
許多 gem5 裡的物件都有可以調整的參數,以 UART 來說
class Uart8250(Uart):
...
pio_size = Param.Addr(0x8, "Size of address range")
Param.Addr 表示這個參數是可以選擇的,我們可以選擇這個 Uart 座落於 bus 的哪一個位址上。
gem5 最有趣的是
並不需要重新編譯!!!
只需要調整設定檔 ( gem5 使用 python 作為設定檔,設定一個 virtual platform 該有什麼 IP, 以及設定該 IP 的參數 ),然後就能開始運行了。
It simulates the passing of time as a series of discrete events.
gem5 是一個可以模擬時間推進的模擬器,
這類模擬時間的技術通常被稱為 Discrete Event Simulation (DES)。
It’s more than just a simulator; it’s a simulator platform that lets you use as many of its premade components as you want to build up your own simulation system.
在 gem5 裡面有各式各樣,前輩們已經做好的 models ( e.g. Uart ) 可以使用,我們可以很輕易使用這些 models 去組件屬於我們的 virtual platform ( e.g. fs_linux.py )。
gem5 is written primarily in C++ and python
gem5 使用 pybind11 來讓 C++ 與 python 可以很好的組合在一起。
It can simulate a complete system with devices and an operating system in full system mode (FS mode), or user space only programs where system services are provided directly by the simulator in syscall emulation mode (SE mode).
gem5 提供了兩種模擬模式。
我猜是類似於 QEMU 的 User Mode Emulation。
當發生系統呼叫 (syscall) 的時候,模擬器不對一道道指令在模擬器內進行模擬,而是直接轉交給 host machine ( 運行模擬器的機器 ) 去執行這個系統呼叫。
假如我們使用的是 RiscvAtomicSimpleCPU,指令原本都會在這個模擬出來的 CPU 上執行,但假如遇到系統呼叫的話,就不會用這個模擬出來的 CPU 來執行指令。
我猜,有時候在設計 CPU 的時候,會比較不看重作業系統核心中 ( kernel mode ) 的執行時間,而是把主要的心力放在運行於 user-mode 的 benchmark。
此外 SE mode 也可以跳過作業系統 ( e.g. linux kernel ) 的開機時間。假如 gem5 model 的時間推進做的很逼真的話,通常開機都會很慢很久。假如我們沒有想要專注在開機所消耗的時間,能跳過開機的話,就能專注於真正感興趣的程式碼區塊了。
我猜是類似於 QEMU 的 full system emulation。
簡單來說,就是每一道指令都交給模擬出來的 CPU ( e.g. RiscvAtomicSimpleCPU ) 來執行。模擬的最完整,但也最慢。
最後總結一下
一種可以模擬時間推進的模擬器。
( 這種模擬時間的技術,通常被稱為 discrete event simulation, DES )
這種模擬器可以模擬不同的 ISA ( instruction set architecture, e.g. X86, RISC-V, ARM ), 並且有許多已經被前人實作好的 device models ( e.g. Uart device model )
我們可以用已經實作好的 model, 很快速的組成一個 virtual platform, 我們可以在這個模擬平台上運行 bare-metal progrogram, 或甚至是一些作業系統核心 ( e.g. linux kernel )。當然,需要的話,我們也可以自己實作需要的 models。
另外 gem5 最標誌性的就是模擬時間的能力,講求模擬速度的 QEMU 就比較沒有這樣的能力。
雖然因為要模擬時間的推進,而導致模擬的效能會比較差。例如說,使用同樣的 linux kernel binary,並且開機到 shell,通常 QEMU 會開得比較快。
簡單舉一個例子,假如實作得當的話,可以利用 gem5 去模擬一顆 CPU 的 pipeline ( e.g. gem5 minor CPU model, gem5 O3 CPU model ),利用 gem5 模擬時間的能力,在硬體實作前去評估這樣的 pipeline 設計可以帶來怎樣的效能。或是在 gem5 裡面去實驗新的 pipeline 設計,得出實驗數據後,評估新的 pipeline 的設計是否更加優秀,並且再來用 Verilog ( 或其他 RTL language ) 實作真正的硬體。
同樣的例子也可以搬到 bus 的實作,或是 GPU 的實作上,使用軟體來評估硬體實作的效能。
或許也可以把真的實作出的硬體的效能,去與當初在 gem5 上的模擬進行比對,評估一下 gem5 的模擬數據是否與真正實作出來的硬體相符合 ( 這步驟似乎被稱為 correlation )。
另一種用法是,像 gem5 這樣可以模擬時間推進的模擬器,可以用來回覆 假如 (what if) 問題。
以下假設一種情景。
現在我們有一個 CPU,他的乘法器會需要 3 個 cycle 才能完成一個乘法。
那假如... 假如我們有一個只需要 1 個 cycle 的就能完成乘法的乘法器,對某個 workload ( e.g. benchmark ) 會有多少的效能提升呢 ?
假如 gem5 上的實驗數據佐證,假如我們有能力實作出一個 1 cycle 乘法器,對於重要的 workload 可以一口氣提升 10 % 以上,那我們就該投入成本,去想想該怎麼研發一個只需要 1 個 cycle 的乘法器。
假如其實對效能沒什麼影響,那我們就不該投入成本去思考,該怎麼研發這樣的乘法器。
這個範例有點不同,當我們根本不知道怎麼去實作這種硬體的時候,就可以提前評估說,這樣的硬體值不值得我們去思考,值不值得我們花時間去進行改進。
應該還有許多 gem5 的使用場景,只是我暫時還想像不出來。
說了那麼多,但其實我根本沒有走過完整的流程,甚至我也根本不知道怎麼設計與實作硬體...
希望之後能體驗到了。