Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

ボトルネック分析

このページは、2026-06-05の勉強会でチームが共有したボトルネック分析の基礎をまとめたものです。 担当: 渡邉。

これは何か

ボトルネック分析とは、プログラム全体の実行時間のうち、どこが最も時間を使っているかを切り分ける作業です。 最適化の前に必ず行い、「速くすべき場所」を事実で決めます。

なぜ重要か

HPCでは、「CPUが遅いからCPUを速くする」という発想は的外れになりやすいです。 実際には、次の場所がボトルネックになることが多いです。

  • メモリアクセス(帯域待ち)
  • ノード間通信(MPI)
  • 同期待ち(待機・idle)

つまり、計算そのものより「待ち時間」が支配的になりやすい、という認識が出発点です。

基本フロー

最初に、全体時間を次の観点で分解します。

見るもの何が分かるか
計算・通信・I/Oの時間割合どのカテゴリが支配的か
関数・プロセス・スレッドごとの時間どの処理が重いか(hotspot)
CPU使用率計算で忙しいのか、待っているのか
MPI通信時間ノード間通信が律速か

マクロからミクロへ:最適化の定石

いきなりソースコードの行を見てはいけません。 ボトルネックの「種別」を大局から絞り込みます。

フェーズ粒度やること代表ツール例
Phase 1マクロ(低負荷)CPU/GPU/メモリ/通信のどこが遅いか切り分けLinaro MAP、Nsight Systems、perfmpiP、IPM
Phase 2ミドル(中負荷)関数特定、並列インバランス・待機状態の定量化Score-P、TAU、HPCToolkit
Phase 3ミクロ(高負荷)行レベルの原因(cache miss、依存関係)解明Scalasca、Nsight Compute、Callgrind、ftrace

合言葉は「推測するな、計測せよ」。低負荷ツールで「当たり」をつけ、高負荷ツールで「原因」を特定します。

ツールの詳細はプロファイリングツール実践ガイドにまとめています。

注意点

  • 計測ツール自体にオーバーヘッドがあります。マクロ→ミクロの順で、必要なときだけ重いツールを使います。
  • 1回の実験で変える条件は1つにします。
  • 「速くなった」だけでなく、なぜ速くなったかを記録します。

関連ページ

参考文献