# Instructions Per Cycle(IPC)
> [!note] 名称の混同に注意
> このページの **IPC = "Instructions Per Cycle"**(サイクルあたり命令数)はコンピュータアーキテクチャの指標である。wiki 内の [[IPCメトリクス]] は "Inter-Process Communication Metrics"(プロセス間通信メトリクス)であり、全く異なる概念。
## 定義
IPC(Instructions Per Cycle)とは、CPU が 1 クロックサイクルあたりに平均何命令を実行(retire)できるかを示すハードウェア性能指標である。ハードウェアカウンタの `instructions` / `cycles` として計測される。(Source: [[@2017__brendangregg.com__CPU Utilization is Wrong]])
### IPC による診断基準
| IPC 値 | ボトルネック種別 | 意味 | 対処 |
|--------|--------------|------|------|
| **< 1.0** | メモリバウンド | CPU がメモリ待機(ストール)に多くのサイクルを消費 | メモリ I/O 削減・キャッシュ改善・データ局所性最適化・プリフェッチ |
| **≥ 1.0** | 命令バウンド | CPU はほぼフル稼働。命令数が多い | アルゴリズム改善・命令数削減・SIMD 最適化 |
4-wide 設計(理論最大 IPC = 4)のプロセッサで IPC = 0.78 なら最高速度の 19.5% しか利用できていない。
### Linux での計測方法
```bash
# システム全体(10 秒間)
perf stat -a sleep 10
# プロセス単位
perf stat -e cycles,instructions,stalled-cycles-frontend,stalled-cycles-backend -p <PID>
```
`perf stat` の出力には `insns per cycle` として IPC が直接表示される。
## なぜ %CPU ではなく IPC が重要か
[[CPU利用率]](%CPU)は「非アイドル時間」を測るが、CPU が演算中かメモリ待機中かを区別しない。IPC はこの曖昧さを解消し、CPU が実際にどれだけの仕事をしているかを示す。Gregg(2017)は IPC こそが %CPU の正しい補完指標と主張する。(Source: [[@2017__brendangregg.com__CPU Utilization is Wrong]])
## 横断的知見
- **IPC はハードウェアカウンタで直接計測できる**: CPU 内蔵の PMC(Performance Monitoring Counter)が `cycles` と `instructions` を計数し、Linux `perf`・Intel VTune・AMD μProf 等のツールが IPC を計算・報告する。[[ハードウェアカウンタ]] ページの先行知見(演算子別 PMC による stall 定量化)は IPC 解釈と一致する。(Source: [[@2017__brendangregg.com__CPU Utilization is Wrong]], [[@2026__arXiv__ProfInfer - An eBPF-based Fine-Grained LLM Inference Profiler]])
## 未解決の問い
- ヘテロジニアスアーキテクチャ(big.LITTLE、P/E コア混在)では IPC をどのコア基準で正規化すべきか。
- マルチスレッド/SMT 環境では IPC がスレッド間でどう干渉するか。
- GPU における IPC の類比は何か(SIMD スループット、ワープ効率、メモリ帯域利用率など)。
## 関連
- ソース: [[@2017__brendangregg.com__CPU Utilization is Wrong]]
- 概念: [[CPU利用率]] / [[ハードウェアカウンタ]] / [[メモリバウンド]] / [[継続的プロファイリング]]
- エンティティ: [[Brendan Gregg]]
- 別概念(混同注意): [[IPCメトリクス]](Inter-Process Communication Metrics)
## 出典
- [[@2017__brendangregg.com__CPU Utilization is Wrong]](IPC の診断基準・Linux perf による計測法・%CPU との対比)