spec2006_work/Makefile では、GNU parallel を使用してベンチマークの実行を並列化している。
ベンチマークの並列実行
ベンチマーク実行時、specinvoke コマンドを使用してサブコマンドを抽出し、それらを parallel で並列実行する:
$(RUN_BENCH_TARGETS): benchmark=$(subst run_,,$@)
$(RUN_BENCH_TARGETS): run_dir=$(SPEC_ROOT)/benchspec/CPU2006/$(benchmark)/run/run_base_ref_gcc.0000
$(RUN_BENCH_TARGETS):
@subcmds=$$(cd $(run_dir) && $(SPECINVOKE) -n 2>&1 | grep -v "^#" | grep -v "^timer" | grep -v "^$$"); \
num_subcmds=$$(echo "$$subcmds" | wc -l); \
echo "=== Subcommands for $(benchmark) ($$num_subcmds commands)"; \
echo "$$subcmds" | sed "s|^|cd $(run_dir) \&\& |" | \
parallel --line-buffer -j $$num_subcmds \
"{}; echo '[$(benchmark)] Completed {#}/$$num_subcmds'"; \
echo "=== Completed all $(benchmark) subcommands"
- 複数のベンチマークを並列実行
make -j4 run_429.mcf run_401.bzip2 run_456.hmmer run_458.sjeng
BBV(Basic Block Vector)の収集
BBV(Basic Block Vector)は、プログラムの実行特性を分析するための情報であり、SimPointでの計算に利用する。 QEMUのBBVプラグインを使用してBBVデータを収集する。
BBVプラグインの設定
Makefileでは、QEMUのBBVプラグインを使用するための設定が定義されている:
QEMU := ${HOME}/work/bench_trace_env/qemu-10.0.6/build/qemu-riscv64
BBV_PLUGIN := $(QEMU_BUILD_DIR)/contrib/plugins/libbbv.so
BBV_DIR := bbv_results
BBV収集の実行
BBVを収集する場合は、run_bbv_<benchmark> ターゲットを使用する:
make run_bbv_429.mcf
このターゲットは、以下の処理を行う:
- BBV出力ディレクトリを作成(
bbv_results/<benchmark>/) - ベンチマークのサブコマンドを抽出
- 各サブコマンドに対して、QEMUの
-pluginオプションでBBVプラグインを適用 - 各サブコマンドごとに個別のBBVファイルを生成(
bbv_1.out.0.bbなど)
$(RUN_BBV_TARGETS): benchmark=$(subst run_bbv_,,$@)
$(RUN_BBV_TARGETS): run_dir=$(SPEC_ROOT)/benchspec/CPU2006/$(benchmark)/run/run_base_ref_gcc.0000
$(RUN_BBV_TARGETS): bbv_output_dir=$(BBV_DIR)/$(benchmark)
$(RUN_BBV_TARGETS):
@mkdir -p $(bbv_output_dir)
@subcmds=$$(cd $(run_dir) && $(SPECINVOKE) -n 2>&1 | grep -v "^#" | grep -v "^timer" | grep -v "^$$"); \
num_subcmds=$$(echo "$$subcmds" | wc -l); \
echo "$$subcmds" | sed "s/^'//; s/'$$//" | nl -nln | \
parallel --line-buffer --colsep '\t' -j $$num_subcmds \
'bbv_file="$$bbv_dir_abs/bbv_{1}.out"; \
cmd_with_bbv=$$(echo {2} | sed "s|$(QEMU)|$(QEMU) -plugin $(BBV_PLUGIN),outfile=$$bbv_file|"); \
(cd $(run_dir) && eval $$cmd_with_bbv) && \
echo "[$(benchmark) BBV {1}/$$num_subcmds] Completed - BBV saved to $$bbv_file"'
BBVファイルは、bbv_results/<benchmark>/ ディレクトリに保存される:
bbv_results/ ├── 400.perlbench/ │ ├── bbv_1.out.0.bb │ ├── bbv_2.out.0.bb │ └── bbv_3.out.0.bb ├── 401.bzip2/ │ ├── bbv_1.out.0.bb │ └── bbv_2.out.0.bb └── ...