SimPoint解析パイプラインにおいて、SIFTファイルの生成とSniperシミュレーションを実行する際に、同時並行で実行するとディスク容量不足になって落ちてしまう。 これは、SIFTファイルを全ベンチマーク分生成したうえでSniperの実行に移るのでSniperの実行には全部のSIFTファイルの用意が必要になっていた。
見てみると一つのSIFTファイルで100GB~になっている。これでは簡単にディスクを食いつくしてしまう。
そこで、各SimPointごとにSIFT生成→Sniper実行→SIFT削除を順次実行する方式に変更した。
1. 個別SimPoint実行用スクリプトの作成
これまではベンチマーク単位で一気にSimPoint毎にSIFTを生成するスクリプトを用意していたが、これを変更して、指定されたベンチマークのinput/SimPointを指定してピンポイントで実行できる。 このスクリプトを用いて、実際の実行手順は以下の通りになる:
- SIFTファイルの生成
- Sniperシミュレーションの実行
- SQLite結果のJSON/YAMLへの変換(オプション)
- SIFTファイルの削除
スクリプトの主な処理フローは以下の通りである。
# SimPointファイルから重みを取得 weight=$(paste -d " " "$simpoint_files" "$weights_files" | awk -v sp="$simpoint" '$1 == sp {print $2; exit}') # SIFT生成 "${QEMU}" ${QEMU_FLAGS} -plugin "${QEMU_FRONTEND_PLUGIN}",...,fast_forward_target=${fast_forward_target},... ${cmd_suffix_noL} # Sniper実行 "${RUN_SNIPER}" -v -c "${CONFIG_BASE}" --roi-script ... --traces="${sift_file}" # SIFTファイル削除 rm -f "${output_base}.app0.th0.sift" "${output_base}_response.app0.th0.sift" "${output_base}.log" rm -rf "${simpoint_run_dir}"
2. Makefileへの新しいターゲット追加
Makefileにrun_sift_<benchmark>_<subcmd>_<simpoint>という形式のターゲットを追加した。
パターンマッチングルールを使用して、ターゲット名からbenchmark、subcmd、simpointを抽出する。
# Generate SIFT, run Sniper, and cleanup for a specific SimPoint
# Format: run_sift_<benchmark>_<subcmd>_<simpoint>
# Example: run_sift_429.mcf_1_17
run_sift_%:
$(eval benchmark := $(word 1,$(subst _, ,$(subst run_sift_,,$@))))
$(eval subcmd := $(word 2,$(subst _, ,$(subst run_sift_,,$@))))
$(eval simpoint := $(word 3,$(subst _, ,$(subst run_sift_,,$@))))
@SPEC_ROOT=$(SPEC_ROOT) \
... \
./scripts/run_sift_single_simpoint.sh $(benchmark) $(subcmd) $(simpoint) $(SIMPOINT_INTERVAL)
こんな感じで使用する。
make run_sift_429.mcf_1_17
これを用いてGitHub Actionsを再構築する。
.github/workflows/simpoint.ymlを変更し、各SimPointを順次処理するようにした。ワークフローは以下の3つのステップに分割された。
1. BBV収集とSimPoint解析
既存の処理と同様に、BBV収集、SimPoint解析、Sniperビルドまでを実行する。
2. 各SimPointの順次処理
すべてのSimPointを事前に列挙し、各SimPointに対してmake run_sift_<benchmark>_<subcmd>_<simpoint>を順次実行する。
# すべてのSimPointを列挙 for benchmark in ${BENCHMARKS}; do echo "${subcmds}" | nl -nln -w1 -s$'\t' | while IFS=$'\t' read -r cmd_num cmd_raw; do paste -d " " "${simpoint_files}" "${weights_files}" | while IFS=" " read -r simpoint dummy1 weight dummy2; do echo "${benchmark} ${cmd_num} ${simpoint} ${weight}" >> ${TASK_FILE} done done done # 各SimPointを順次処理 while IFS=" " read -r benchmark subcmd simpoint weight; do make run_sift_${benchmark}_${subcmd}_${simpoint} done < ${TASK_FILE}
