gem5を構成するSimObjectを追加するためのチュートリアルをやってみる。
Step.3 SimObject と C++ ファイルの登録
C++ ファイルをコンパイルし、Python ファイルを解析するためには、ビルドシステムにこれらのファイルについて知らせる必要がある。gem5はビルドシステムとしてSConsを使用するので、SimObject
のコードがあるディレクトリにSConscriptファイルを作成するだけです。そのディレクトリにすでにSConscriptファイルがある場合は、そのファイルに以下の宣言を追加するだけでよい。
このファイルは単に通常のPythonファイルなので、このファイルに好きなPythonコードを書くことができる。gem5はこれを利用してSimObjects用のコードを自動的に作成し、SLICCやISA言語のようなドメイン固有言語をコンパイルする。
SConscriptファイルには、インポート後に自動的に定義される関数がいくつかある。新しいSimObjectをコンパイルするためには、src/learning_gem5/part2ディレクトリに "SConscript "という名前で新しいファイルを作成する必要がある。このファイルでSimObjectと.ccファイルを宣言する。以下は必要なコードである。
# src/learning_gem5/part2/SConscript Import('*') SimObject('HelloObject.py', sim_objects=['HelloObject']) Source('hello_object.cc')
Step 4. gem5の(再)ビルド
新しいファイルをコンパイルしてリンクするには、gem5を再コンパイルする必要がある。以下の例では x86 ISA を使っていると仮定しているが、このオブジェクトには ISA を必要とするものはないので、gem5 のどの ISA でも動作する。
$ scons build/RISCV/gem5.opt
Step 5: 新しいSimObjectを使用するための設定スクリプトを作成する
SimObjectを実装し、gem5にコンパイルしたので、オブジェクトをインスタンス化するためにconfigs/learning_gem5/part2
にPython設定ファイルrun_hello.py
を作成または修正する必要がある。このオブジェクトはとてもシンプルなので、システムオブジェクトは必要ない!CPUもキャッシュも何も必要ない。すべてのgem5インスタンスはRootオブジェクトを必要とする。
非常にシンプルなコンフィギュレーションスクリプトを作成する手順を説明すると、まず、m5とコンパイルしたすべてのオブジェクトをインポートする。
# configs/learning_gem5/part2/run_hello.py import m5 from m5.objects import *
次に、すべてのgem5インスタンスに必要なRootオブジェクトをインスタンス化する。
# configs/learning_gem5/part2/run_hello.py root = Root(full_system = False)
これで、作成したHelloObjectをインスタンス化できる。あとはPythonの「コンストラクタ」を呼び出すだけだ。後ほど、Pythonのコンストラクタでパラメータを指定する方法について説明する。オブジェクトのインスタンスを作成することに加えて、そのオブジェクトがルートオブジェクトの子であることを確認する必要がある。C++では、ルートオブジェクトの子であるSimObjectのみがインスタンス化される。
# configs/learning_gem5/part2/run_hello.py
root.hello = HelloObject()
最後に、m5モジュールのinstantiateを呼び出して、シミュレーションを実行する!
# configs/learning_gem5/part2/run_hello.py m5.instantiate() print("Beginning simulation!") exit_event = m5.simulate() print('Exiting @ tick {} because {}' .format(m5.curTick(), exit_event.getCause()))
src/ディレクトリのファイルを変更した後は、gem5をリビルドすることを忘れないこと。設定ファイルを実行するコマンドラインは、以下の出力の'command line:'の後にある。出力は以下のようになるはずだ:
Note: goodbye_objectのコードがsrc/learning_gem5/part2
ディレクトリにある場合、run_hello.py
はエラーを起こす。これらのファイルを削除するか、gem5ディレクトリの外に移動すると、run_hello.pyは以下のように出力する。
gem5 Simulator System. http://gem5.org gem5 is copyrighted software; use the --copyright option for details. gem5 compiled May 4 2016 11:37:41 gem5 started May 4 2016 11:44:28 gem5 executing on mustardseed.cs.wisc.edu, pid 22480 command line: build/X86/gem5.opt configs/learning_gem5/part2/run_hello.py ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ <-- これが実行コマンド Global frequency set at 1000000000000 ticks per second Hello World! From a SimObject! Beginning simulation! info: Entering event queue @ 0. Starting simulation... Exiting @ tick 18446744073709551615 because simulate() limit reached
自分もやってみた。
$ ./build/RISCV/gem5.opt configs/learning_gem5/part2/run_hello.py
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 Jun 28 2023 22:34:46 gem5 started Jun 28 2023 22:40:25 gem5 executing on kimura-tower, pid 39801 command line: ./build/RISCV/gem5.opt configs/learning_gem5/part2/run_hello.py Global frequency set at 1000000000000 ticks per second warn: No dot file generated. Please install pydot to generate the dot file and pdf. Hello World! From a SimObject! Beginning simulation! build/RISCV/sim/simulate.cc:192: info: Entering event queue @ 0. Starting simulation... Exiting @ tick 18446744073709551615 because simulate() limit reached