基本的なmemcpyの動作をシミュレートしてみる。RISC-Vのスカラ命令を使って以下のようなmemcpyのベンチマークを作ってみた。
void copy_data_scalar(int8_t *dest_data, int8_t *source_data, const int data_num) { memcpy (dest_data, source_data, data_num); } int test_0() { format_array(); const int data_num = DATA_NUM * sizeof(int32_t) / sizeof(int8_t); copy_data_scalar((int8_t *)scalar_data, (int8_t *)source_data, data_num); copy_data_scalar((int8_t *)scalar_data, (int8_t *)source_data, data_num); }
copy_data_scalarを2回呼んでいるのは、キャッシュが温まっている場合とそうでないかを確認するために使用している。
このプログラムをコンパイルして、Gem5で実行してみた。
$ make run ../../gem5/build/RISCV/gem5.debug \ --debug-flags=O3PipeView \ --debug-file=memcpy.out \ ../../gem5/configs/example/se.py \ --cpu-type=DerivO3CPU \ --caches -c \ memcpy
gem5 Simulator System. https://www.gem5.org gem5 is copyrighted software; use the --copyright option for details. gem5 version 22.0.0.2 gem5 compiled Aug 12 2022 22:42:22 gem5 started Aug 16 2022 23:53:33 gem5 executing on ms-x1carbon, pid 9614 command line: ../../gem5/build/RISCV/gem5.debug --debug-flags=O3PipeView --debug-file=memcpy.out ../../gem5/configs/example/se.py --cpu-type=DerivO3CPU --caches -c memcpy 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) 0: system.remote_gdb: listening for remote gdb on port 7000 **** REAL SIMULATION **** build/RISCV/sim/simulate.cc:194: info: Entering event queue @ 0. Starting simulation... build/RISCV/sim/mem_state.cc:443: info: Increasing stack size by one page. build/RISCV/sim/syscall_emul.cc:74: warn: ignoring syscall mprotect(...) Exiting @ tick 13276000 because exiting with last active thread context Simulated exit code not 0! Exit code is 10
$ mv ../../gem5/m5out/memcpy.out memcpy.out
Konataで確認してみる。キャッシュが温まっていない場合のパイプライン。
キャッシュが温まった場合のパイプライン。いい感じに再現できていそうだ。