# メモリ階層とキャッシュ
プロセッサと主記憶の**速度差(メモリウォール)**を埋めるために設けられた、速度・容量でトレードオフする多段記憶構造。現代プロセッサの性能を左右する最重要設計要素の一つ。
## なぜキャッシュが必要か
主記憶(DRAM)アクセスには **100 クロック以上**かかる。L1 キャッシュは 3〜5 クロックで応答でき、90% のヒット率を達成する。**90% のアクセスが数クロック**で完了することで、実効的なメモリレイテンシを桁違いに改善する。
局所性の原理:
- **時間的局所性**: 最近アクセスしたデータは近い将来また使われる確率が高い。
- **空間的局所性**: あるアドレス周辺のデータも使われる確率が高い → **キャッシュライン**(数十バイト単位)でまとめて転送。
## 典型的なメモリ階層(Zen 4 の例)
| レベル | 容量 | レイテンシ | 場所 |
|---|---|---|---|
| L1 キャッシュ | 32 KB(D) + 32 KB(I) | 4 クロック | 各コア内 |
| L2 キャッシュ | 1 MB | 14 クロック | 各コア横 |
| L3 キャッシュ(LLC) | 32 MB | ~49 クロック | 全コア共有 |
| 主記憶(RAM) | 4+ GB | 140+ クロック | マザーボード |
| スワップ | 100+ GB | 10,000+ クロック | HDD / SSD |
## L1 キャッシュのレイテンシは死活問題
L1 D-キャッシュのロードレイテンシは **3〜5 クロック**が主流だが、「1 クロック増える」だけで性能に大きな影響を与える。ポインタチェーシングの多いコード(コンパイラ・DB・一般的な OOP コード)では、このレイテンシが実際の IPC を制限する主要因になる。
注目すべき L1 D-キャッシュサイズ:
- Apple M1〜M5: **128 KB**(I キャッシュは 192 KB)
- Snapdragon X: 96 KB
- Sunny/Golden Cove、Zen 5: 48 KB
- 多くの主流プロセッサ: 32 KB
## キャッシュの連想度(Associativity)
キャッシュをどのようにインデックス化するかによる分類。
### ダイレクトマップキャッシュ
各メモリアドレスがキャッシュ内の 1 箇所に対応。最速だが**スラッシング**(同一ライン競合によるキャッシュミス連発)が起きやすい。
### セット連想キャッシュ
各アドレスが n 箇所(n-way)のいずれかに置ける。並列タグ比較で実現。
| 連想度 | プロセッサ例 |
|---|---|
| 2-way | Athlon、Athlon 64、PowerPC G5、Cortex-A15/A57 |
| 4-way | 多くの主流プロセッサ(デファクト標準) |
| 8-way | Haswell〜、Zen 1〜4 |
| 12-way | Sunny/Golden Cove、Zen 5 |
連想度が高いほどスラッシングを回避できるが、タグ比較が増えてレイテンシが伸びる。L1 D-キャッシュは 4〜8-way が黄金比、L1 I-キャッシュと LLC はより高連想度を許容できる(レイテンシ隠蔽が効きやすいため)。
### フルアソシアティブ
OS のページングは仮想メモリを管理する「フルアソシアティブキャッシュ」とみなせる。
## LLC(最終レベルキャッシュ)の重要性
LLC のサイズ効果はアプリのワーキングセットに強く依存:
- 4 MB vs 32 MB で「ほぼ無差別」な場合もあれば、「劇的な差」になる場合もある。
- チップ面積の **半分程度**を LLC が占めることも珍しくない。
AMD 3D V-Cache はシリコンを積層して LLC を大幅拡大(96 MB 超)し、ゲーミング性能を向上。→ [[チップレット]]
## 仮想アドレスと物理アドレスのトレードオフ
- 仮想アドレスでインデックス → TLB が不要で高速だが、コンテキストスイッチ時にキャッシュをフラッシュする必要がある。
- 物理アドレスでインデックス → TLB 変換が必要で遅い。
- **VIPT(Virtually Indexed, Physically Tagged)**: 仮想アドレスでインデックス・物理アドレスでタグ比較。TLB 変換とキャッシュインデックスを並列実行できる現実的な折衷案。
## SMT とキャッシュ共有
SMT の欠点の一つはキャッシュが複数スレッドで共有されること。ワーキングセットが大きいアプリ(仮想マシン・ビデオエンコーダ)では互いにキャッシュを追い出し合い、SMT の恩恵が消える場合がある。→ [[同時マルチスレッディング]]
## 横断的知見
- 今後の取り込みで、複数ソース間の関係を追記する。
## 未解決の問い
- この概念をどのソース群で継続的に検証するか。
## 関連
- 主記憶との速度差の全体像 → [[メモリウォール]]
- 先進パッケージングによる LLC 拡大 → [[チップレット]]