AutoCheck: Automatically Identifying Variables for Checkpointing by Data Dependency Analysis

arXiv:2408.06082(2024) · 論文 · fu2024autocheck

📅 この論文を見た日

初回 2026-09-22 / 最終 2026-09-22 / 計 1 回更新

AI解説

実装: https://github.com/zRollman/Autocheck.git 情報源: arXiv v3(2024-11-05)の全文(arXiv HTML 版)を精読して記述。本文に書かれていない事項は書いていない。arXiv 単独公開で、学会や論文誌への掲載は確認できていない。

一言で

HPC アプリケーションの実行トレースを解析して、チェックポイントすべき変数を自動で特定するツール。人手による変数選定が持つ「専門知識が要る」「巨大なコードのネストした依存関係を追うのは試行錯誤で誤りやすい」という問題に対し、動的命令トレースからデータ依存グラフ(DDG)を構築・縮約し、ヒューリスティックで臨界変数を絞り込む。14個の HPC ベンチマークすべてで正しく再開でき、システムレベルの BLCR と比べてチェックポイントサイズを最大7桁削減する。

背景・問題

Checkpoint/Restart(C/R)は HPC で最も広く使われる耐障害技術で、ほぼすべての本番 HPC システムや商用データセンターに標準搭載されている。FTI や VeloC のようなアプリケーションレベルの C/R ライブラリは強力だが、どの変数をチェックポイントすべきかはプログラマ自身が判断しなければならない

この判断には二重の困難がある。プログラマは耐障害性の専門知識を持たないことが多く、逆にドメイン知識を持つ科学者側は耐障害性の専門知識を欠くことが多い。加えて実世界の HPC アプリケーションは、ネストした関数呼び出し、複雑なデータ構造、込み入ったデータ依存から成り立っており、変数選びは専門家にとってさえ試行錯誤にならざるを得ず、誤りや一貫性の欠如、主観的な解釈のばらつきを生みやすい。AutoCheck はこの「臨界変数の特定」を自動化することで問題を解こうとする、著者らの言葉では「この種として初めての」試みである。

提案手法

AutoCheck は動的命令実行トレースを入力とし、前処理データ依存解析臨界変数の特定という3つのモジュールから成る。

AutoCheckの3モジュール構成:前処理、データ依存解析、臨界変数の特定

Fig. 2: AutoCheck design overview(3モジュールの全体構成)。

前処理 — Main-Loop’s Input(MLI)変数の特定

チェックポイント候補となる変数は、MLI 変数(main-loop’s input:主計算ループに入る前に定義され、ループ内で使われる変数)と、ループの帰納変数(induction variable)に限られる。ループ内だけで定義・使用されるローカル変数は毎回のイテレーションで再初期化されるためチェックポイント不要と判断される。

MLI 変数の特定は、主計算ループの前後それぞれで使われる算術変数(算術演算に関わる変数)を集め、両者を突き合わせることで行う。ポインタ代入が起きた場合は、代入先ではなく代入元の変数を再帰的にたどって収集する。

主計算ループの前(Part A)・内部(Part B)・後(Part C)で算術変数を集め、A/B間でマッチした変数がMLI変数になる

Fig. 3: Pre-processing workflow(算術変数の収集とマッチングの流れ)。

例えば次のようなコード(ab を主計算ループ前に定義し、ループ内で sumsr を更新する)では、absumsr が MLI 変数として特定される。

主計算ループを含む例示コード。ループ前(a)・ループ内(b)・ループ後(c)の3領域に分けられる

Fig. 4: Example code(本ノート中の説明で参照する主計算ループの例)。

データ依存解析 — 完全DDGの構築と縮約

主計算ループの実行では、変数の値は一時レジスタに読み込まれてから演算に使われ、結果が変数へ書き戻される。そのためレジスタと変数の対応を追わないと DDG を作れない。AutoCheck は動的命令列から次の2つの表を維持する。

これらの表を Store 命令のたびに DDG へ反映することで、MLI 変数だけでなくローカル変数や一時レジスタまで含む完全 DDG が得られる。次に、目的である MLI 変数だけの 縮約 DDG を得るため、各 MLI 変数の親が MLI 変数でない限り、親を祖父母(親の親)へ置き換える操作を繰り返す縮約アルゴリズムを適用する。

完全DDG(reg-var map / reg-reg map から構築)を、MLI変数だけが残るまで再帰的に縮約する例

Fig. 5: Data dependency analysis(reg-var map、reg-reg map、完全DDG、縮約DDG、実行時系列順のread/write依存の一連の流れ)。

2種類のCall命令(単純呼び出しと関数本体を伴う呼び出し)と、ローカル変数の判別に使うAlloca命令の例

Fig. 6: Critical instructions(2種類の Call 命令と Alloca 命令の扱い)。

臨界変数の特定 — 4種類のヒューリスティック

縮約 DDG を実行時系列順の read/write 依存列に変換したうえで、次の4パターンのいずれかに該当する変数を臨界変数と判定する。

WAR・Outcome・RAPO・Indexの4種類のヒューリスティックによる臨界変数の分類

Fig. 7: Identifying critical variables for checkpointing(4種類のヒューリスティックの整理)。

ケーススタディ:共役勾配法(CG)

論文は具体例として CG の疑似コードを示し、main 関数のループ内で x(Line 3 で読み、Line 19 で書く)が Write-After-Read パターンに該当するためチェックポイントが必要と判定し、zpqrA にはチェックポイントを要する依存が見つからなかったと報告する。加えて帰納変数 iter もチェックポイント対象になる。

数式・アルゴリズム

DDG 縮約アルゴリズムは次の疑似コードで与えられる(論文 Algorithm 1)。

Function ContractedDDG(complete_DDG):
    for n in main_loop_input_variables:
        NP = 親頂点の集合(n)
        for np in NP:
            if np が main_loop_input_variable でない:
                Contract(np)
        NP = 更新後の親頂点の集合(n)
        for np in NP:
            if np が main_loop_input_variable でない:
                np を n との依存を保ったまま縮約
    return contracted_DDG

Function Contract(p):
    PP = p の親頂点の集合
    p を自分の親頂点群で置き換える
    if PP が全て main_loop_input_variable であるか空:
        終了
    else:
        for pp in PP:
            if pp が main_loop_input_variable でない:
                Contract(pp)   // 各親頂点を再帰的に縮約

実験・結果

評価環境は Intel Xeon E5-2678 V3 CPU2基(合計24物理コア)、32GB RAM の Linux サーバ。トレース生成は LLVM-Tracer 1.2 / LLVM-Clang 3.4.2、依存解析部分は gcc-7.5 + OpenMP-4.5(-O3)でコンパイル。

関連研究との関係(メモ)

Q&A

(自分がAIに実際に質問したことだけをQ/A形式で残す。まだなし。)

自分のコメント

(ここは自分で都度書く欄。)