背景
gem5は現在のコンピュータアーキテクチャ研究分野で広く使用されているオープンソースシミュレータであり、システムレベルからマイクロアーキテクチャレベルに至るまでのモデリングと検証機能を提供します。gem5を利用すること、メモリ階層と実行可能コードを持つCPUのシステムレベルシミュレーションフレームワークを迅速に構築し、ベンチマークと指標に一面的な問題がある現状の課題を解決するためのシステムレベル評価を行うことができます。
インストール方法
https://www.gem5.org/documentation/learning_gem5/part1/building/
https://www.gem5.org/documentation/general_docs/building
上記リンクはgem5の公式インストールチュートリアルです。gem5はGitHubからソースコードをダウンロードしてローカルでコンパイルインストールする方法と、Dockerを使用してインストールする方法があります。ここではmacOS上でのローカルソースコードによるインストール方法を採用します。
インストール手順
まず、チュートリアルに従ってgem5のソースコードをダウンロードします: git clone https://github.com/gem5/gem5
次に、依存関係のインストールが必要です。主な依存関係はscons(gem5が使用する先進的なビルド管理ツールで、CMakeに似ていますがいくつかの優れた機能を提供します)、zlib、およびm4です(その他の一般的な依存関係であるpython、gcc、clangなどは、要件を満たしているかバージョンを確認してください)。これらの依存関係はhomebrewを使用してインストールできます。まだhomebrewパッケージマネージャーをインストールしていない場合は、事前にインストールする必要があります。UbuntuのようなLinuxシステムでは、aptを使用して関連する依存関係を直接インストールできます。
brew install scons
brew install zlib
brew install m4
上記の依存関係のインストールが完了したら、インストールを開始できます。gem5インストールディレクトリにcdで移動し、以下のコマンドを実行します:
scons build/{ISA}/gem5.{variant} -j {cpus}
ここで、{ISA}は対象命令セットアーキテクチャ、{variant}はビルド設定を指定します。ほとんどの場合、optは良いビルド対象です。-jフラグはオプションで、ビルドプロセスの並列化を可能にし、{cpus}は使用するスレッド数を指定します。シングルスレッドでの最初のビルドは、一部のシステムで最大2時間かかることがあります。そのため、可能な限り多くのスレッドを割り当てることを強くお勧めします。
有効なISA(命令セットアーキテクチャ)には以下のものがあります:
- ARM
- NULL
- MIPS
- POWER
- RISCV
- SPARC
- X86
有効なビルド設定には以下のものがあります:
- debug:最適化を無効にします。これにより、変数が最適化で削除されたり、関数が意図せずインライン化されたり、制御フローが意図しない動作をしたりすることがありません。このバージョンはgdbなどのツールと併用するのに適していますが、最適化がないため、他のバージョンよりはるかに遅くなります。gdb、valgrindなどのツールを使用し、詳細が隠されてほしくない場合は、このバージョンを選択してください。それ以外の場合は、最適化されたバージョンの使用をお勧めします。
- opt:最適化を有効にし、デバッグ機能(アサーションやDPRINTFなど)を保持します。これはシミュレーション速度とデバッグ情報の間に良好なバランスを提供します。これはほとんどの場合のデフォルト選択です。
- fast:最適化を有効にし、デバッグ機能を削除します。これはパフォーマンス面で最大限の効果を発揮しますが、ランタイムエラーチェックとデバッグ出力機能を犠牲にします。すべてが正常に動作することを非常に確信しており、シミュレータの最高パフォーマンスを得たい場合は、このバージョンをお勧めします。
プロジェクトの実際の要件に基づき、対象命令セットアーキテクチャとしてRISCV、ビルド設定としてoptを選択し、8スレッドを使用してコンパイルしました:
scons build/RISCV/gem5.opt -j 8
このコンパイルインストールプロセスは時間がかかり、並列スレッド数に応じて数十分から数時間かかることがあります。インストールが成功すれば、/build/RISCVパスにgem5.opt実行ファイルが生成されるはずです。
コンパイルの最終結果は以下のようになります:
[SO Param] m5.objects.Sequencer, RubySequencer -> RISCV/python/_m5/param_RubySequencer.cc
[SO Param] m5.objects.Sequencer, RubyHTMSequencer -> RISCV/python/_m5/param_RubyHTMSequencer.cc
[SO Param] m5.objects.Sequencer, DMASequencer -> RISCV/python/_m5/param_DMASequencer.cc
[SO Param] m5.objects.Sequencer, RubyPortProxy -> RISCV/params/RubyPortProxy.hh
[SO Param] m5.objects.Controller, RubyController -> RISCV/python/_m5/param_RubyController.cc
[ LINK] -> RISCV/gem5.opt
ld: warning: ignoring duplicate libraries: '-lc++'
ld: warning: search path 'build/RISCV/ext/googletest' not found
scons: done building targets.
インストールが完了したら、gem5に付属するスクリプトを使用して基本機能をテストできます。gem5は単一コアシステムを提供しており、その上でhelloworldプログラムを実行してインストールの正確性を検証できます。コマンドは以下の通りです:
./build/RISCV/gem5.opt configs/learning_gem5/part1/simple-riscv.py
実行結果は以下のようになります:
gem5 Simulator System. https://www.gem5.org./build/RISCV/gem5.opt configs/learning_gem5/part1/simple-riscv.py
gem5 is copyrighted software; use the --copyright option for details.
gem5 version 24.1.0.3
gem5 compiled May 22 2025 22:50:28
gem5 started May 23 2025 14:47:16
gem5 executing on J6JK212CLJ, pid 22348
command line: build/RISCV/gem5.opt configs/deprecated/example/se.py -c tests/test-progs/hello/bin/riscv/linux/hello
warn: The se.py script is deprecated. It will be removed in future releases of gem5.
Global frequency set at 1000000000000 ticks per second
warn: No dot file generated. Please install pydot to generate the dot file and pdf.
src/mem/dram_interface.cc:692: warn: DRAM device capacity (8192 Mbytes) does not match the address range assigned (512 Mbytes)
src/arch/riscv/isa.cc:280: info: RVV enabled, VLEN = 256 bits, ELEN = 64 bits
src/base/statistics.hh:279: warn: One of the stats is a legacy stat. Legacy stat is a stat that does not belong to any statistics::Group. Legacy stat is deprecated.
system.remote_gdb: Listening for connections on port 7002
**** REAL SIMULATION ****
src/sim/simulate.cc:199: info: Entering event queue @ 0. Starting simulation...
src/sim/mem_state.cc:448: info: Increasing stack size by one page.
Hello world!
Exiting @ tick 3306500 because exiting with last active thread context
これでインストールプロセスは完了です。
インストール時の問題点
実際のインストールプロセスでは、いくつかの主要な問題が発生しました:
- sconsコンパイル時にzlibの検索に失敗し、コンパイルが進まない。エラーメッセージは以下の通りです:
Error: did not find needed zlib compression library and/or zlib.h header file.
Please install zlib and try again.
システム変数を設定してパスを追加するなどの通常の方法を試みましたが効果がなかったため、プロジェクトのSConstructスクリプトを修正してこの問題を解決しました。具体的には、gem5の元のSConstructスクリプトの790行目に以下の修正を加えます:
env.Append(CPPPATH=['/opt/homebrew/opt/zlib/include'])
env.Append(LIBPATH=['/opt/homebrew/opt/zlib/lib'])
env.Append(LIBS=['z'])
with gem5_scons.Configure(env) as conf:
# On Solaris you need to use libsocket for socket ops
if not conf.CheckLibWithHeader(
[None, 'socket'], 'sys/socket.h', 'C++', 'accept(0,0,0);'):
error("Can't find library with socket calls (e.g. accept()).")
# if not conf.CheckLibWithHeader('z', 'zlib.h', 'C++','zlibVersion();'):
# error('Did not find needed zlib compression library '
# 'and/or zlib.h header file.\n'
# 'Please install zlib and try again.')
以下の3行を追加することで、sconsがzlibを検索し、コンパイル時にリンクできるようにします:
env.Append(CPPPATH=['/opt/homebrew/opt/zlib/include'])
env.Append(LIBPATH=['/opt/homebrew/opt/zlib/lib'])
env.Append(LIBS=['z'])
このリンクが成功しても、sconsチェック文の機能の問題により、スクリプト実行時には依然としてエラーが発生してスローされるため、検索部分をコメントアウトします:
# if not conf.CheckLibWithHeader('z', 'zlib.h', 'C++','zlibVersion();'):
# error('Did not find needed zlib compression library '
# 'and/or zlib.h header file.\n'
# 'Please install zlib and try again.')
その後、正常にコンパイルを進めることができます。
- sconsコンパイルインストール時にISAをALLに選択した場合、テストプログラムの実行に問題が発生。最初にALL設定(サポートされているすべての命令セットをコンパイルインストール)を使用していました。コンパイルコマンドは以下の通りです:
scons build/ALL/gem5.opt -j 8
se.pyテストプログラムの実行時に、実行結果が一貸せず、成功したり失敗したりする問題が発生しました。例えば:
gem5.opt configs/deprecated/example/se.py -c tests/test-progs/hello/bin/x86/linux/hello
warn: The se.py script is deprecated. It will be removed in future releases of gem5.
Global frequency set at 1000000000000 ticks per second
warn: No dot file generated. Please install pydot to generate the dot file and pdf.
src/mem/dram_interface.cc:692: warn: DRAM device capacity (8192 Mbytes) does not match the address range assigned (512 Mbytes)
src/arch/riscv/isa.cc:280: info: RVV enabled, VLEN = 256 bits, ELEN = 64 bits
src/base/statistics.hh:279: warn: One of the stats is a legacy stat. Legacy stat is a stat that does not belong to any statistics::Group. Legacy stat is deprecated.
system.remote_gdb: Listening for connections on port 7002
src/arch/riscv/isa.cc:644: panic: panic condition idx > NUM_PHYS_MISCREGS occurred: Illegal CSR index 0xb2
Memory Usage: 405328048 KBytes
Program aborted at tick 0
--- BEGIN LIBC BACKTRACE ---
0 gem5.opt 0x00000001030adfe0 _ZN4gem515print_backtraceEv + 44
1 gem5.opt 0x00000001030c35d8 _ZN4gem512abortHandlerEi + 132
2 libsystem_platform.dylib 0x000000018400ede4 _sigtramp + 56
3 libsystem_pthread.dylib 0x0000000183fd7f70 pthread_kill + 288
4 libsystem_c.dylib 0x0000000183ee4908 abort + 128
5 gem5.opt 0x0000000100ba64cc _ZN4gem55linux8onUDelayEPNS_13ThreadContextEyyy + 0
6 gem5.opt 0x00000001025509e8 _ZN4gem58RiscvISA3ISA18setMiscRegNoEffectEty + 164
7 gem5.opt 0x0000000101106e10 _ZN4gem56X86ISA13X86_64Process9initStateEv + 504
8 gem5.opt 0x0000000100c3fd64 ZZN8pybind1112cpp_function10initializeIZNS0_C1IvN4gem59SimObjectEJEJNS_4nameENS_9is_methodENS_7siblingEEEEMT0_FT_DpT1_EDpRKT2_EUlPS4_E_vJSI_EJS5_S6_S7_EEEvOS9_PFS8_SB_ESH_ENUlRNS_6detail13function_callEE_8__invokeESP + 108
9 gem5.opt 0x0000000100bcb874 ZN8pybind1112cpp_function10dispatcherEP7_objectS2_S2 + 5212
10 Python 0x0000000108aa12fc cfunction_call + 76
11 Python 0x0000000108a43664 _PyObject_MakeTpCall + 124
12 Python 0x0000000108b6c7d0 _PyEval_EvalFrameDefault + 6876
13 Python 0x0000000108b6aa78 PyEval_EvalCode + 200
14 Python 0x0000000108b65cd0 builtin_exec + 440
15 Python 0x0000000108aa0a10 cfunction_vectorcall_FASTCALL_KEYWORDS + 88
16 Python 0x0000000108a443a0 PyObject_Vectorcall + 92
17 Python 0x0000000108b6c7d0 _PyEval_EvalFrameDefault + 6876
18 gem5.opt 0x0000000100c16aa0 ZNK8pybind116detail10object_apiINS0_8accessorINS0_17accessor_policies8str_attrEEEEclILNS_19return_value_policyE1EJEEENS_6objectEDpOT0 + 76
19 gem5.opt 0x00000001030c40c8 main + 344
20 dyld 0x0000000183c58274 start + 2840
--- END LIBC BACKTRACE ---
For more info on how to address this issue, please visit https://www.gem5.org/documentation/general_docs/common-errors/
後で、ALL設定でコンパイルしたgem5.optを実行すると、se.pyテストプログラムの実行時に命令セットアーキテクチャがランダムに呼び出されることが判明しました。アーキテクチャとプログラムが一致すれば成功し、そうでなければエラーが発生します。解決策として、buildフォルダを削除して再インストールし、実際の状況に応じて必要な命令セットを選択してコンパイルする必要があります。