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
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 ベースに移行しているのでここで取り残されて残骸として残っている、ということがわかった。
リンク集
gem5 の使い方。インストールから、 簡単なプログラムを実行するまで。この通りにやれば出来る。
gem5 の使い方。プログラムをコンパクトにして、 実行している。その後、Konata というプログラムで 視覚化している。OoO に対応しているのがわかるという寸法。
上の qiita の記事で紹介されていた。 「x86のレイテンシやスループット」について表になっている。
上の qiita の記事で紹介されていた。 「命令ごとのμOPSの数がまとめられた表」
gem5 で GCN3 のエミュレーションが出来るみたい。
docker をつかって gem5 を build する。 この通りにやったが、、、GCN3 のエミュレーションはうまくいかず。
AMD による gem5 の GPU の説明資料。
MIOpen という ROCm の machine learning 関連のライブラリ(らしい)。
Heterogeneous devices のための C++ コンパイラ。 インストール出来なかった。
まだ試してないけど gem5-gpu の話。NVIDIA の SIMT とか をシミュレーションしている?
gpgpu-sim の github。でも gem5 とは関係ないかも(未確認)。
gem5-gpu。2017に開発が止まっている。gpgpu-sim を使うべきだろう(たぶん)。 でも gpgpu-sim は gem5 と関連がないのか、、、。
何だろうね? youtube の資料。Google Colab から使えるのだろうか?
もう開発は止まっているみたいだけど、もともと SipleScalar という 有名な simulator があったみたい。
ISIS-SimpleScalar の実装。SimpleScalar を元にシミュレータを開発していた (たぶん過去形)。2004 年の論文だ。
onikiri2 の github のソース。RISCV まで対応しているみたい。
gem2 の Visualize に使う。紳士服店の名前かと思った。Electron を使っているみたい。
どういうわけかレジスタファイルについて Wikipedia が詳しい。
レジスタファイル・命令・シーケンサについて書いてある。 「コンピュータアーキテクチャ (電子情報通信レクチャーシリーズ)」 の内容らしい。詳しく書いてある。
マルチポートレジスタ(1) の話。このシリーズは読んでおいて損がなさそう。
大規模システムを想定した Gem5 シミュレータの 階層的インターコネクションネットワーク拡張
RISC-V 命令セットの特性と研究への利用(2021)
Intel の Hyperflex。 Stratix 10 から導入された仕組み
1W2R と 1W1R の疑似デュアルポートメモリの特許
富岳でも Gem5 使ってたという話。 「性能チューニングなどのために理研で開発されたGem5シミュレータも利用した」 とあり、まるで gem5 全部を理研が開発したような印象を与える記事。 才覚には Gem5 simulator for the Post-K。
何だっけ? 「Pannotia は、並列グラフ アプリケーションとカーネルのスイートです。これは OpenCL™ で実装され、最短パス、グラフ分割、Web およびグラフ分析など、さまざまなグラフ ドメインのアプリケーションで構成されています。」
2023-2-21 18:55 JST