以下の内容はhttps://msyksphinz.hatenablog.com/entry/2026/01/02/040000より取得しました。


GitHub ActionsでSPEC CPU2006の実行を自動化する (5. SIFT生成とSniper実行の順次処理)

SimPoint解析パイプラインにおいて、SIFTファイルの生成とSniperシミュレーションを実行する際に、同時並行で実行するとディスク容量不足になって落ちてしまう。 これは、SIFTファイルを全ベンチマーク分生成したうえでSniperの実行に移るのでSniperの実行には全部のSIFTファイルの用意が必要になっていた。

見てみると一つのSIFTファイルで100GB~になっている。これでは簡単にディスクを食いつくしてしまう。

そこで、各SimPointごとにSIFT生成→Sniper実行→SIFT削除を順次実行する方式に変更した。

1. 個別SimPoint実行用スクリプトの作成

これまではベンチマーク単位で一気にSimPoint毎にSIFTを生成するスクリプトを用意していたが、これを変更して、指定されたベンチマークのinput/SimPointを指定してピンポイントで実行できる。 このスクリプトを用いて、実際の実行手順は以下の通りになる:

  1. SIFTファイルの生成
  2. Sniperシミュレーションの実行
  3. SQLite結果のJSON/YAMLへの変換(オプション)
  4. 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}



以上の内容はhttps://msyksphinz.hatenablog.com/entry/2026/01/02/040000より取得しました。
このページはhttp://font.textar.tv/のウェブフォントを使用してます

不具合報告/要望等はこちらへお願いします。
モバイルやる夫Viewer Ver0.14