プロファイリングツール実践ガイド
このページは、2026-06-05の勉強会でチームが整理した「用途別プロファイラ・トレースツールの全体像」をまとめたものです。 個々のツールの公式情報は参考文献を参照してください。
これは何か
性能解析ツールは、何をどの粒度で測りたいかによって使い分けます。 ここでは、抽象度(マクロ/ミドル/ミクロ)と対象レイヤ(CPU/MPI/OpenMP/GPU/メモリ)で整理します。
大局から局所へ:3つの抽象度
| 抽象度 | 計測オーバーヘッド | 手法 | 用途 | ツール例 |
|---|---|---|---|---|
| 高(マクロ) | 低 | サンプリング、全体傾向の俯瞰 | CPU/GPU/通信の「どこ」が遅いか切り分け | Linaro MAP、Nsight Systems、mpiP、IPM |
| 中(ミドル) | 中 | 関数単位のコールグラフ、MPI待機時間、メモリ推移 | 関数特定、並列インバランスの発見 | Score-P、TAU、HPCToolkit、Massif |
| 低(ミクロ) | 高 | インストルメンテーション、詳細トレース、HWイベント | 行レベルの原因解明(cache miss、依存関係) | Scalasca(trace)、Nsight Compute、Valgrind、ftrace |
レイヤ別の代表ツール
CPU(計算密度・メモリアクセス)
| アプローチ | ツール | 特徴 |
|---|---|---|
| サンプリング(低負荷・推奨) | perf | Linux標準。HWカウンタ(PMU)を読む。perf c2cでfalse sharing(偽共有)も検出 |
| サンプリング | Intel VTune Profiler | EBSでcache missをソース行へ直接マッピング |
| サンプリング | Linux ftrace | カーネルレベルの挙動(スケジューリング遅延・割り込み)を追跡 |
| インストルメンテーション(高負荷) | Callgrind(Valgrind) | 正確な命令数とコールグラフを生成。Cachegrindでcacheも模擬 |
gprofは関数プローブのオーバーヘッドが大きく、現代のHPCでは非推奨とされています。
MPI(通信・同期のオーバーヘッド)
アプリが「計算」しているのか「待機」しているのかを切り分けます。
| ツール | 特徴 |
|---|---|
mpiP | 極めて軽量。関数ごとの時間・通信量をテキストサマリで出力。最初の一手 |
| IPM | メッセージサイズごとの通信量・通信トポロジを低負荷で把握 |
| Score-P | HPC標準の計測インフラ。CUBE4形式で出力し後続解析へ繋ぐハブ |
| Scalasca | 待機状態(wait states)を定量化し、通信ボトルネックを特定 |
| TAU | MPI + OpenMP + GPUのハイブリッド環境を統合プロファイル |
| HPCToolkit | MPIとCPU HWカウンタを紐づけた統計プロファイル |
MPIトレース・タイムライン可視化
「なぜ・いつ・誰のせいで待機したか」を時系列で追います。
| ツール | 特徴 |
|---|---|
| Vampir | Score-PのOTF2トレースを読み、大規模ノードのタイムラインを可視化 |
| Cube | メトリクス・コールツリー・システムの3軸で階層的にボトルネック特定 |
| Intel Trace Analyzer (ITAC) | 「理想化(無限に速いネットワーク)」機能で通信オーバーヘッドを分離 |
| Paraver / Jumpshot | Extraeベース/レガシーMPICH向けのトレース可視化 |
GPU(ホスト連携→カーネル深掘り)
最大の罠は「いきなりGPUカーネル内部を見ること」。まずCPU-GPU間のデータ転送(PCIe)を疑います。
| 視点 | ツール | 特徴 |
|---|---|---|
| マクロ(システム全体) | Nsight Systems | CPUスレッド、GPUへのデータ転送、kernel dispatchの非効率を特定 |
| ミクロ(カーネル内部) | Nsight Compute | レジスタ使用量、メモリ帯域、命令レベルのstall原因を解析 |
| AMD ROCm環境 | rocprof (v3) | Roofline分析でHW理論限界に対する位置を可視化 |
OpenMP(並列インバランスと同期)
「CPU使用率が100%か」ではなく「有意義な計算をしているか」を問います。
| ツール | 特徴 |
|---|---|
| Intel VTune (OpenMP Wait Analysis) | アクティブ時間と待機/アイドル時間を厳密に分離 |
| Linaro MAP | 適応型サンプリングで極小ファイルサイズ。ソース改変なしで行レベルの待機を特定 |
| TAU (OMPT) | ハイブリッド実行時のタイムラインを可視化 |
メモリ(安全性検証とヒープ最適化)
| 目的 | ツール | 特徴 |
|---|---|---|
| エラー検出(安全性) | AddressSanitizer (ASan) | コンパイラベース。低負荷でCI/CDに組み込める |
| エラー検出(深掘り) | Valgrind Memcheck | 再コンパイル不要だが負荷は数十倍 |
| 使用量・ヒープ最適化 | Heaptrack | 低負荷でヒープ確保/解放をトレース。リークや無駄を特定 |
| 使用量・ヒープ最適化 | Massif (Valgrind) | メモリ使用量の推移をスナップショットで記録 |
富岳・HPCコンテストでよく使う組み合わせ
チームの調査では、富岳環境で次のツールが定番として挙がりました(実機・利用可否は要確認)。
- 必須:
mpiP/ Score-P / Cube /perf/nsys(GPU使用時) - 発展: Scalasca / Vampir / HPCToolkit / VTune
OpenFOAMのMPI最適化なら、次の流れが強力とされています。
mpiP → Score-P → Cube → Scalasca
まず何から使うか(チームの結論)
- 最初の一手は
perf+mpiP。低負荷で「当たり」をつけられる。 - 必要に応じてScore-P/Cube/Scalascaへ深掘りする。
perf の実践的な使い方(チーム調査メモ)
2026-06-19の勉強会で田中が共有した内容。perfは日本語情報が少なく、man、Archwiki、ライブコーディング動画(impl Rust: One Billion Row Challenge)が学習に役立った。
よく使うコマンド
| コマンド | 用途 |
|---|---|
perf stat -r <n> -d -d -d <cmd> | 詳細イベントを取得し、n回実行の平均±標準偏差まで出す。まず全体像を掴むのに良い |
perf record → perf report | プロファイルをperf.dataに記録し、call graph・アセンブリレベルで分析。最も使いやすい |
perf stat -a -A -I <msecs> -e <event> <cmd> | インターバルごとに全CPUの情報を出力。用途は限定的 |
注意点
perf recordはイベント数が多すぎると問題になる(長時間実行・並列実行)。perf report等で解析できなくなり、ストレージも圧迫する。- 対策として、実行中のプロセスへ短時間だけアタッチする:
perf record -F 999 -g --call-graph fp -p <PID> -- sleep 30。 - 可視化の補助ツールとして
flamegraphが便利。 - 今後の課題: MPI環境での
perf等の使い方を実際に動かして確認する。
ビルドオプション(分析しやすさ vs 速度)
分析しやすさと高速化はトレードオフ。用途別(Debug / Profile / Release / Optimize など)に切り替えられるよう環境を整備する。
- 性能に影響しない:
-g(デバッグ情報。無いとソース対応・シンボルが分からず、アセンブリ/ポインタ表示になる) - 性能に影響する(最適化を抑制して分析しやすくする):
-fno-omit-frame-pointer… call graphが見やすくなる-fno-inline… 関数ごとの性能が見やすくなる-foptimize-sibling-calls(を無効化)… 末尾呼び出しのジャンプ化を抑え、関数ごとの性能が見やすくなる
注意点
- 富岳前提のツール構成です。2026年大会の実機は未確定なので、利用可能なツールは要確認です(調査ステータス)。
- ツールはオーバーヘッドが大きいものほど後段で使います。
関連ページ
参考文献
- Linux perf tools documentation
- Intel VTune Profiler Documentation
- NVIDIA Nsight Systems User Guide
- NVIDIA Nsight Compute Documentation
- Score-P Documentation
- Scalasca
- Vampir
- mpiP: Lightweight, Scalable MPI Profiling
- Linaro Forge (MAP)
- Arch Wiki: デバッグ/プロファイリング
- Arch Wiki: パフォーマンスの向上
- One Billion Row Challenge
- impl Rust: One Billion Row Challenge (YouTube)
- flamegraph-rs/flamegraph