se.py と fs.py の使用方法
ここでは、se.py と fs.py の使用方法と共通オプションについて議論する。フルシステムシミュレーションに関するより詳細な実行方法は、フルシステムシミュレーションの章を参照すること。ここでは、2つのファイルに関する共通のオプションについて紹介する。
この章で議論する殆どの共通オプションについては、 Options.py
で登録されている。このためには addCommonOptions
が使用されている。このセクションではすべてのオプションの詳細については紹介しない。全てのオプションについて見るためには、—help
を使用するか、スクリプトのソースコードを参照すること。
何もオプションを渡さずに実行すると、以下のようになる:
./build/RISCV/gem5.opt configs/example/se.py --cmd=./tests/test-progs/hello/src/hello.bare.riscv 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 13 2023 10:10:10 gem5 started Jun 25 2023 22:55:16 gem5 executing on kimura-tower, pid 3097806 command line: ./build/RISCV/gem5.opt configs/example/se.py --cmd=./tests/test-progs/hello/src/hello.bare.riscv 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/RISCV/mem/dram_interface.cc:690: warn: DRAM device capacity (8192 Mbytes) does not match the address range assigned (512 Mbytes) build/RISCV/arch/riscv/linux/se_workload.cc:60: warn: Unknown operating system; assuming Linux. 0: system.remote_gdb: listening for remote gdb on port 7000 **** REAL SIMULATION **** build/RISCV/sim/simulate.cc:192: info: Entering event queue @ 0. Starting simulation... Hello world! Exiting @ tick 1371000 because exiting with last active thread context
これ自体は、全く面白いシミュレーションではない!デフォルトではgem5は atomic CPU モデルを使用し、すべてのアクセスが atomic memory access となる、したがって実際のタイミングデータは計測されない!これを確認するためには、 m5out/config.ini
を参照すればよい:
[system.cpu] type=BaseAtomicSimpleCPU children=decoder interrupts isa mmu power_state tracer workload branchPred=Null checker=Null clk_domain=system.cpu_clk_domain cpu_id=0 decoder=system.cpu.decoder do_checkpoint_insts=true do_statistics_insts=true eventq_index=0 function_trace=false function_trace_start=0
タイミングモードで実行するためには、CPUタイプを設定する必要がある。このとき、同時にL1キャッシュを指定する。
./build/RISCV/gem5.opt configs/example/se.py \ --cmd=./tests/test-progs/hello/src/hello.bare.riscv \ --cpu-type=TimingSimpleCPU \ --l1d_size=64kB --l1i_size=16kB
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 13 2023 10:10:10 gem5 started Jun 25 2023 23:00:06 gem5 executing on kimura-tower, pid 3098008 command line: ./build/RISCV/gem5.opt configs/example/se.py --cmd=./tests/test-progs/hello/src/hello.bare.riscv --cpu-type=TimingSimpleCPU --l1d_size=64kB --l1i_size=16kB 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/RISCV/mem/dram_interface.cc:690: warn: DRAM device capacity (8192 Mbytes) does not match the address range assigned (512 Mbytes) build/RISCV/arch/riscv/linux/se_workload.cc:60: warn: Unknown operating system; assuming Linux. 0: system.remote_gdb: listening for remote gdb on port 7000 **** REAL SIMULATION **** build/RISCV/sim/simulate.cc:192: info: Entering event queue @ 0. Starting simulation... Hello world! Exiting @ tick 171176000 because exiting with last active thread context
では、config.iniを使用してオプションが正しくシステムに伝わっているかを確認する。まずはconfig.ini
を”cache”
で検索すると、キャッシュのオプションが存在しないことが分かる!
grep cache m5out/config.ini
cache_line_size=64 dcache_port=system.membus.cpu_side_ports[2] icache_port=system.membus.cpu_side_ports[1] uncacheable= cpu_side_ports=system.system_port system.cpu.icache_port system.cpu.dcache_port system.cpu.mmu.itb.walker.port system.cpu.mmu.dtb.walker.port
つまり、—caches
オプションを追加する必要があるということだ。
./build/RISCV/gem5.opt configs/example/se.py \ --cmd=./tests/test-progs/hello/src/hello.bare.riscv \ --cpu-type=TimingSimpleCPU \ --l1d_size=64kB --l1i_size=16kB --caches
[system.cpu.dcache] type=Cache children=power_state replacement_policy tags addr_ranges=0:18446744073709551615 assoc=2 clk_domain=system.cpu_clk_domain clusivity=mostly_incl compressor=Null data_latency=2 demand_mshr_reserve=1 eventq_index=0 is_read_only=false max_miss_count=0 move_contractions=true mshrs=4 power_model= power_state=system.cpu.dcache.power_state prefetch_on_access=false prefetch_on_pf_hit=false prefetcher=Null replace_expansions=true replacement_policy=system.cpu.dcache.replacement_policy response_latency=2 sequential_access=false size=65536 system=system tag_latency=2 tags=system.cpu.dcache.tags tgts_per_mshr=20 warmup_percentage=0 write_allocator=Null write_buffers=8 writeback_clean=false cpu_side=system.cpu.dcache_port mem_side=system.membus.cpu_side_ports[2]
se.py と fs.py の共通オプション
-cpu-type=CPU_TYPE
- 実行させるCPUのタイプ。このパラメータは常に設定すべき重要なものである。デフォルトはatomicであり、タイミングシミュレーションを行わない。
-sys-clock=SYS_CLOCK
- システムが動作するクロック周波数を指定する。
-cpu-clock=CPU_CLOCK
- CPUが動作するクロック周波数を指定する。これは上記のシステムクロックとは別個で設定できる。
-mem-type=MEM_TYPE
-caches
- クラシックなキャッシュを使用してシミュレーションを行う。
-l2cache
- クラシックなキャッシュを使用する際、L2キャッシュを使用する。
-ruby
- キャッシュシステムのシミュレーション時に、クラシックなキャッシュではなくRubyを使用する。
m TICKS, --abs-max-tick=TICKS
- 実行するシミュレーションのクロック数を指定する。特定の時間のみシミュレーションしたいとき便利である。
I MAXINSTS, --maxinsts=MAXINSTS
- シミュレーションする全体の命令数を指定する(デフォルト:無限)。特定の命令数のみ実行したいときに便利である。
c CMD, --cmd=CMD
- syscallエミュレーションモードでのバイナリを指定する。
o OPTIONS, --options=OPTIONS
- バイナリに渡すオプションを指定する。 全体の文字列に対して “ “で囲んで使用する。これはシミュレーションするコマンドに対してオプションを渡すために便利である。
-output=OUTPUT
- stdoutをファイルにリダイレクトする。
-errout=ERROUT
- stderrをファイルにリダイレクトする。