Gem5 使ってみる
SimulatorGem5
2023-2-20 23:14 JST

Gem5 を使ってみた。Gem5 は AMD の GCN3 にも対応しているようだがそれはうまくいかなかった。


まずは build

Introductionから読み進めればいい。Building gem5を読むとだいだい出来る。build には SCons というシステムを使っているようだ。どうも、一部、Python を使ってソースの自動生成をしている。例えば、--debug-flags で指定されるフラグは自動生成。

SCons を使ったことがないから、すごく不安になる。make 一発! じゃない。この記事がガイドになってくれたのでだいぶ助かった。scons というコマンドに対し build/X86/gem5.opt をつけて実行すればいいみたいだ。まぁ、本家のページにもそう書いてあるんだけどね。わたしはびびって opt じゃなくてdebug にしてしまいました。scons build/X86/gem5.debug -j 7ビルドは結構時間がかかる。


そして実行

build の下に X86/gem5.debug が出来ているのでプレビルドの hello プログラムを実行

$ ./build/X86/gem5.debug ./configs/example/se.py -c ./tests/test-progs/hello/bin/x86/linux/hello
gem5 Simulator System.  https://www.gem5.org
gem5 is copyrighted software; use the --copyright option for details.

gem5 version 22.1.0.0
gem5 compiled Feb 19 2023 07:19:14
gem5 started Feb 21 2023 01:53:53
gem5 executing on tiafoe, pid 1153219
command line: ./build/X86/gem5.debug ./configs/example/se.py -c ./tests/test-progs/hello/bin/x86/linux/hello

warn: The `get_runtime_isa` function is deprecated. Please migrate away from using this function.
warn: The `get_runtime_isa` function is deprecated. Please migrate away from using this function.
Global frequency set at 1000000000000 ticks per second
warn: No dot file generated. Please install pydot to generate the dot file and pdf.
build/X86/mem/dram_interface.cc:690: warn: DRAM device capacity (8192 Mbytes) does not match the address range assigned (512 Mbytes)
0: system.remote_gdb: listening for remote gdb on port 7000
**** REAL SIMULATION ****
build/X86/sim/simulate.cc:192: info: Entering event queue @ 0.  Starting simulation...
build/X86/arch/x86/cpuid.cc:180: warn: x86 cpuid family 0x0000: unimplemented function 13
build/X86/sim/mem_state.cc:443: info: Increasing stack size by one page.
build/X86/sim/syscall_emul.cc:74: warn: ignoring syscall mprotect(...)
My first gem5
Exiting @ tick 33782000 because exiting with last active thread context

どういう仕組みで動いているのかわからないけど、Qemu より細かいハードよりな動きをするみたい。OS も動かせるみたいだけど、どれくらいのスピードでいけるのだろうか?実用を考えているわけではなさそう。


自分のプログラムも実行

qiita の記事をなぞっているので同じことをする。test-gem5.c を -static でコンパイルする。名前だけがオリジナリティ。(/usr/bin/test と同じ名前の実行ファイルが出来るのを避けるためね)

test-gem5.c
#include 

int main(){
  printf("My first gem5\n");
  return 0;
}

パイプラインをみる

う〜ん。qiita の記事そのものになっていて、質の悪いコピーブログになっているが、気にせず先に行く。qiita の記事通り、__asm__("CLC");を入れておく。

./build/X86/gem5.debug --debug-flags=O3PipeView --debug-file=trace.out configs/example/se.py --cpu-type=DerivO3CPU --caches -c ~1/test-gem5

今実行してみると、すんなり動く。最初実行したときは --cachesがなくエラーになっていた。


OoO も試した

実はこの後 OoO なるものも試して実行してみた。Konata というツールで視覚化出来る。qiita の記事そのものなので、後はそれをみてね、、、みたいなカンジだ。

後、参考になったのは FPGA 開発日誌かな。


Gem5 GCN3 も試す(失敗)

ここから、この記事のオリジナル。Gem5 GCN3 を実行したのだが、だが、実はうまくいかなかった。

gem5-resourcesなるものが公開されており、GCN3 のテストがある程度出来るはず(なのだが、出来なかった)。最初、普通に(環境は Ubuntu 20.04) build/GCN_X86/gem5.opt を作ったのだが(ここまではうまくいく)、その先 square を動かすことが出来なかった。というのも square が HIP 等々、AMD の環境に依存しており、それをインストールできなかったから。

squareの資料通り docker を使うことに。ちゃんと build/GCN3_X86/gem5.out もbuild できて、square も make 出来た。で、docker 経由で run して待つこと1晩。top でみると動いているみたいではあるが、どこまで動いているのか?それとも無限ループを回っているのか。終了せず。エラーも出ているようだったので、Ctrl-C であえなく終了。

ついでに gem5 どうやって情報を出力しているのか、、、簡単に調べた。単純に DPRINTF(とその亜種) で出しているみたい。./cpu/o3/dyn_inst.ccを読むと、その瞬間の情報を出しているような感じ。

ついでに gem5-gpu。試してはいない。こちらは NVIDIA が提供しているみたい。gem5 は EXTRAS という形で追加の ISA を扱えるようになっている(みたい)。ビジュアライザとか揃っているから見やすいかもね(やってないよ)。ただ、2017 で開発が止まっているように見える。

gem5-gpuはどうやら終わっているらしい。start ページも壊れている。この壊れたページを解読すると、、、「fork gem5 and GPGPU-Sim」とのこと。そして、これによると CUDA も 3.2 ベースなので(2023.2時点で CUDA は 12)古すぎ。

一方gpgpu-simをみると CUDA の 11 までカバーしているのでこちらを使うべきなのでしょう。そのうちやる。

その後 gem5-gpu トライしてみた(失敗)

その後少し gem5-gpu トライしてみた。2つの情報があって、どちらが本当かわからないがちょっと試すと、、、

scons build/X86_VI_hammer_GPU/gem5.opt --default=X86 EXTRAS=../gem5-gpu/src:../gpgpu-sim/ PROTOCOL=VI_hammer GPGPU_SIM=True 
scons build/X86_VI_hammer_GPU/gem5.opt --default=../../../gem5-gpu/build_opts/X86_VI_hammer_GPU EXTRAS=../gem5-gpu/src:../gpgpu-sim/ 

gem5-gpu は scons がそもそも python2.5 ベースだった。本体の gem5 はすでに scons は python3 ベースに移行しているのでここで取り残されて残骸として残っている、ということがわかった。

リンク集