TL

性能の定量化 ─ CPIスタックとボトルネック分析

なぜ遅いのかを当て推量で潰す前に。実効CPIを供給・分岐・キャッシュ・演算へ分解するCPIスタックとTop-Down解析を原理から押さえ、真のボトルネックを数字で特定できます。

応用CPIスタックTop-Down解析性能カウンタPMUボトルネック分析IPC最終更新: 2026-06-21
TL;DR要点だけ先に
  • 1.実行時間はサイクル数×クロック周期で、サイクル数は命令数×CPIに分解できる。CPIスタックは実効CPIをフロントエンド供給・分岐ミス・キャッシュミス・演算停止の積み上げに分け、どの要因が何サイクル食っているかを可視化する。
  • 2.Top-Down解析は各サイクルのパイプラインスロットをRetiring/Bad Speculation/Front-End Bound/Back-End Boundの4つに必ず分類し、上位ノードから階層的に掘り下げて律速要因へ最短で到達する。
  • 3.数値はPMU(性能カウンタ)がハードウェアで実測する。投機実行のため誤帰属が起きやすく、ロスト・サイクルの足し算ではなく発行スロット基準で割り当てるのがTop-Downの肝。

「速い/遅い」をサイクルで語る

性能を改善するには、まず時間を分解できる形で表す必要があります。プログラムの実行時間は次の積に分かれます。

実行時間 = 命令数 × CPI × クロック周期
        = 命令数 × CPI / クロック周波数

CPI(Cycles Per Instruction)は1命令あたりの平均サイクル数で、その逆数がIPC(Instructions Per Cycle)です。命令数はISAとコンパイラ、周波数はプロセスと電力で決まり、マイクロアーキテクチャの良し悪しが最も色濃く出るのがCPIです。理想的にN命令を毎サイクル退役させれば CPI は 1/N に近づきますが、現実には供給の詰まりや待ちで膨らみます。問題は「どこで膨らんだのか」を数字で突き止めることです。

CPIスタック ─ 停止要因を積み上げる

CPIスタックは、実効CPIを理想CPIと各種ストール要因の和として表すモデルです。

CPI_effective = CPI_base
              + 命令供給による停止
              + 分岐予測ミスによる停止
              + キャッシュ/メモリ待ちによる停止
              + 演算(実行・依存)による停止

CPI_base はストールが一切ない理想状態の下限(発行幅の逆数)で、その上に各要因が追加サイクルを積み上げます。たとえばL2ミスが1000回あり1回あたり12サイクル止まるなら、その寄与は 12000 / 命令数 サイクルです。各要因の高さを棒グラフで重ねると、削るべき層が一目で分かる――これがスタックという名前の由来です。

単純な足し算が成り立たない理由

CPIスタックの素朴な加算は、停止要因が互いに独立で直列に積み上がると仮定しています。しかしアウトオブオーダ実行では、キャッシュミスの待ち時間の裏で別の独立命令が進み、停止が重なって隠れる(オーバーラップ)ことがあります。逆に複数のミスが同時進行して1回分の遅延に圧縮される場合もあります。だから各層の高さは「その要因を完全に消したら何サイクル戻るか」の近似であり、足し合わせが実効CPIに厳密一致するとは限りません。この重なりを正しく扱うのが次のTop-Downです。

Top-Down解析 ─ スロットを4つに分類する

インオーダ機なら停止サイクルを直接数えられますが、順不同機では「いま止まっている原因」が一意に決まりません。Intelが提唱したTop-Down Microarchitecture Analysis Method(TMAM)は、停止サイクルではなくパイプラインの発行スロットを基準に据えてこの曖昧さを回避します。

発行幅Wのコアは1サイクルにW個の発行スロットを持ちます。各スロットは「有用な命令(μオペ)を退役へ送り込めたか」で4つに排他分類されます。

分類スロットの状態代表的な原因
Retiringμオペを供給し、最終的に退役した有用な仕事(理想はここを最大化)
Bad Speculationμオペを供給したが投機ミスで破棄された分岐予測ミス、機械クリア
Front-End Bound供給側が空でμオペを出せなかった命令フェッチ・デコード・iキャッシュ/iTLBミス
Back-End Bound供給はあるが受け側が詰まって受け取れない実行ユニット飽和、データ依存、dキャッシュ・メモリ待ち

肝は、すべてのスロットが必ずこの4つのどれか1つに入り、合計が100パーセントになる点です。停止サイクルの足し算と違って重複や漏れが原理的に生じないため、順不同機でも比率が一意に定まります。

全発行スロット = Retiring + Bad Speculation
             + Front-End Bound + Back-End Bound   (合計 100%)

判定はパイプラインの「くびれ」(割り当て=アロケーション段)で行います。そのサイクルにμオペが下流へ渡ったかを見て、渡せなかったなら原因が前段(供給)か後段(受け側)かで Front/Back を切り分け、渡せたなら退役したか破棄されたかで Retiring/Bad Speculation を切り分けます。

階層的に掘り下げる

TMAMは木構造です。まず最上位の4分類で最大の枝を見つけ、その枝だけを次の階層へ展開します。たとえばBack-End Boundが支配的なら、その下を Memory Bound と Core Bound に分け、Memory Bound をさらに L1/L2/L3/DRAM Bound へ降りていきます。Front-End Bound なら Fetch Latency と Fetch Bandwidth に分かれます。支配的でない枝は掘らない――これが「Top(上)からDown(下)へ」の意味で、最小の計測回数で律速要因へ到達できます。

PMU ─ カウンタが数字を作る

これらの比率を生むのはPMU(Performance Monitoring Unit)、CPUに内蔵されたハードウェアの計数器群です。PMUは限られた数のパフォーマンスカウンタレジスタを持ち、各カウンタに「数えたいイベント」を割り当てます。代表的なイベントは次のとおりです。

  • 退役した命令数・μオペ数、経過コアサイクル数(CPI/IPCの分子分母)
  • 分岐実行数と分岐予測ミス数(Bad Speculationの根拠)
  • 各階層のキャッシュミス数とアクセス数(Memory Boundの内訳)
  • 発行スロットの空き・停止要因別サイクル数(Top-Downの一次データ)
IPC = 退役命令数 / コアサイクル数
分岐予測ミス率 = 分岐予測ミス数 / 分岐実行数
L2ミス率 = L2ミス数 / L2アクセス数

物理カウンタの本数(多くの実装で汎用4〜8本)が同時計測できるイベント数の上限です。これを超えるイベントを採りたいときはマルチプレクシング、すなわち時分割で計測対象を切り替えて結果を外挿します。標本数が減るぶん誤差が乗るため、TMAMが少数のイベントで上位層を判定できるよう設計されているのは、この制約への合理的な対応でもあります。

投機実行はカウントを歪める

カウンタが数えるのは投機的に実行されたμオペも含むのか、退役した命令だけなのかでイベント定義が分かれます。投機ミスで破棄された命令のキャッシュミスやTLBミスまで数えると、実際には無駄になった作業が「メモリ律速」に化けて見えます。さらに割り込みのスキッドにより、サンプリング時に記録されるアドレスが原因命令から数命令ずれることがあります(PEBSなどの精密サンプリングはこのずれを抑える機構です)。カウンタの生値を鵜呑みにせず、退役基準か投機込みかを必ず確認するのが鉄則です。

解析から対策へ ─ どの層を削るか

支配層が分かれば打ち手が決まります。Front-End Boundが大きければ命令フットプリント削減やコードレイアウト最適化、Bad Speculationが大きければ分岐予測を当てやすいコード(分岐の単純化やデータ駆動化)への書き換え、Memory Boundが大きければキャッシュの原理に沿ったデータ局所性の改善やプリフェッチが効きます。Core Bound(実行ポート飽和や依存連鎖)なら命令選択や依存の組み替えが対象です。

試験のポイント

「実行時間=命令数×CPI×クロック周期」「IPCはCPIの逆数」の関係式は頻出です。CPIスタックが停止要因の積み上げである点、Top-Downが発行スロットを Retiring/Bad Speculation/Front-End Bound/Back-End Bound の4つに排他分類して合計100パーセントになる点、PMUが同時計測できるイベント数は物理カウンタ本数で制限される点を押さえましょう。停止サイクルの足し算では順不同機の重なりを正しく扱えない、という対比が論点です。

まとめ

  • 性能は「命令数×CPI×クロック周期」に分解でき、マイクロアーキの良否はCPI(=1/IPC)に最も表れる。
  • CPIスタックは実効CPIを供給・分岐ミス・キャッシュ待ち・演算停止の積み上げで見せるが、順不同実行の重なりにより素朴な加算は近似にとどまる。
  • Top-Down解析は発行スロットを Retiring/Bad Speculation/Front-End Bound/Back-End Bound に排他分類し、合計100パーセントの枠内で上位から階層的に掘り下げて律速要因へ最短で到達する。
  • 数値はPMUのカウンタが実測するが、本数制限・マルチプレクシング誤差・投機実行による誤帰属に注意が必要で、退役基準と精密サンプリングが信頼性の鍵になる。スーパースカラの発行幅が決める理想CPIを起点に、各層を削って実効性能へ近づけるのが定量化の目的だ。

CPU/メモリ/ディスク Article

性能の定量化 ─ CPIスタックとボトルネック分析を実務で読む

TL;DRは入口です。実際に選ぶ・使う段階では、何を解決するか、何と比較するか、導入後にどこで詰まるかまで見る必要があります。

解決すること

CPIスタック

比較で見る軸

難易度: advanced / カテゴリ: CPU/メモリ/ディスク / タグ数: 6

導入後に効く点

Top-Down解析は各サイクルのパイプラインスロットをRetiring/Bad Speculation/Front-End Bound/Back-End Boundの4つに必ず分類し、上位ノードから階層的に掘り下げて律速要因へ最短で到達する。

先に潰すリスク

用語だけ覚えても、設計・実装・運用でどこに効くかを確認しないと判断を誤る。

数字・仕様の読み方
難易度
advanced
カテゴリ
CPU/メモリ/ディスク
タグ数
6

判断チェックリスト

  • 自社の用途が「CPIスタック / Top-Down解析」に近いか確認する。
  • 強みである「実行時間はサイクル数×クロック周期で、サイクル数は命令数×CPIに分解できる。CPIスタックは実効CPIをフロントエンド供給・分岐ミス・キャッシュミス・演算停止の積み上げに分け、どの要因が何サイクル食っているかを可視化する。」が本当に評価軸になるか確認する。
  • 注意点の「用語だけ覚えても、設計・実装・運用でどこに効くかを確認しないと判断を誤る。」を運用で吸収できるか確認する。
  • 公開値や仕様値は、対象プラン・対象機種・対象リージョンまで確認する。
  • 既存システム、ID、ネットワーク、監視、バックアップとの接続方法を先に洗い出す。
  • 小さく試してから、本番移行、権限設計、障害時手順、コスト監視を決める。

次に確認する観点

CPIスタックTop-Down解析性能カウンタPMUボトルネック分析CPIスタックTop-Down解析性能カウンタ
参考: 公式情報