# メモリ階層とキャッシュ プロセッサと主記憶の**速度差(メモリウォール)**を埋めるために設けられた、速度・容量でトレードオフする多段記憶構造。現代プロセッサの性能を左右する最重要設計要素の一つ。 ## なぜキャッシュが必要か 主記憶(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 のページングは仮想メモリを管理する「フルアソシアティブキャッシュ」とみなせる。 ## 『詳解 システム・パフォーマンス 第2版』によるレイテンシ・連想度の裏付け 6章は、レベル1キャッシュのアクセス時間が一般に数CPUクロックサイクル、レベル2キャッシュ(それより大きい)が10クロックサイクル前後、メインメモリアクセスが60n秒(4GHzプロセッサで約240サイクル、MMUによるアドレス変換でさらにレイテンシが加わる)という実測に基づく目安を示す。Intel Xeon E5620(2.4GHz)でLMbenchを使いメモリ範囲を広げながらアクセスレイテンシを測定すると、範囲がキャッシュレベルを越えるたびにレイテンシが次の(より遅い)キャッシュレベルの水準へ段階的に上昇するグラフが得られる(対数-対数プロット)(Source: [[@2023__OReillyJapan__詳解 システム・パフォーマンス 第2版 - Chapter 6 CPU]] §6.4.1.3.1)。 連想度についても、完全連想(フルアソシアティブ、キャッシュ全体を対象にLRU等を実行しコスト高)・直接マップ(ダイレクトマップ、位置が一意に決まり比較的新しいエントリを問答無用で弾き出すためヒット率が低い)・セット連想(ハッシングで位置のサブセットを確定し、そのなかからLRU等で1つ選ぶ。nウェイセット連想ではnが候補数)の3方式を定義し、CPUキャッシュは完全連想と直接マッピングのバランスを取るセット連想方式を採用することが多いと説明する。これは本ページの既存記述(§キャッシュの連想度)と同じ分類だが、書籍はさらにキャッシュラインサイズ(x86で典型64バイト)とキャッシュコヒーレンシのコストを定量化している。Intel Levinthal(2009)由来の目安として、LLCヒットでラインが非共有なら40サイクル以下、他コアとライン共有なら65サイクル以下、他コアでライン書き換え済みなら75サイクル以下とされる(Source: [[@2023__OReillyJapan__詳解 システム・パフォーマンス 第2版 - Chapter 6 CPU]] §6.4.1.3.2〜§6.4.1.3.4)。 1978年のIntel 8086(トランジスタ数29K、キャッシュなし)から2019年のIntel Xeon Platinum 9282(56コア/112スレッド、トランジスタ数8.0B、L3キャッシュ77MB)までの世代比較では、L1・L2・L3キャッシュのサイズと数が一貫して増加してきたことが示される。Intel Xeon 7460(2008年)以降のプロセッサは一般にコアごとにL1・L2キャッシュを複数持つ(表のサイズはコアあたり)(Source: [[@2023__OReillyJapan__詳解 システム・パフォーマンス 第2版 - Chapter 6 CPU]] §6.4.1.3)。 ### MMU とTLB MMU(memory management unit)は仮想アドレスから物理アドレスへの変換を行い、オンチップTLB(translation lookaside buffer)でアドレス変換をキャッシュする。TLBミス時はカーネルが管理するページテーブル(メインメモリ内)を参照する。古いプロセッサの一部はTLBミス時にTSB(translation storage buffer)というソフトウェア管理の大きいインメモリキャッシュを使うが、新しいプロセッサはTLBミスをハードウェア内で処理しコストを大幅に削減する(Source: [[@2023__OReillyJapan__詳解 システム・パフォーマンス 第2版 - Chapter 6 CPU]] §6.4.1.4)。tlbstat(8)ツールは、KPTI(Meltdown対策)パッチの最悪条件下でTLBウォークにCPU時間の半分が費やされIPCが0.10まで落ちる例を示しており、TLBミスコストがキャッシュ階層のなかでも実運用上のインパクトが大きいことを裏付ける(Source: [[@2023__OReillyJapan__詳解 システム・パフォーマンス 第2版 - Chapter 6 CPU]] §6.6.12)。 ## 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 の恩恵が消える場合がある。→ [[同時マルチスレッディング]] ## GPU のメモリ階層(Blackwell の例) CPU のキャッシュ階層とは別に、GPU も独自の多段メモリ階層を持つ。Blackwell世代のNVIDIA GPUでは以下の6段構成になる(Source: [[@2025__OReilly__AI Systems Performance Engineering - Chapter 6 GPU Architecture, CUDA Programming, and Maximizing Occupancy]] §Understanding GPU Memory Hierarchy)。 | レベル | スコープ | 容量 | レイテンシ | 帯域幅目安 | |---|---|---|---|---| | レジスタ | スレッド単位(SM上) | SMあたり64K個の32ビットレジスタ(スレッドあたり最大255) | 単一サイクル(ほぼゼロ) | SMあたり数十TB/s | | 共有メモリ/L1 | SM単位 | 228 KB(使用可能227 KB) | 約20〜30サイクル | SMあたりTB/s級 | | TMEM(Tensor Memory) | SM単位 | 256 KB(Tensor Core専用) | 約10サイクル | Tensor CoreとTB/s級で通信 | | 定数メモリキャッシュ | SM単位 | 約8 KB(64 KBの`__constant__`空間をキャッシュ) | 約1サイクル(ブロードキャスト時) | ブロードキャストTB/s級 | | L2キャッシュ | GPU全体 | 126 MB | 約200サイクル | 集約で数十TB/s | | グローバルメモリ(HBM) | デバイス全体 | B200で最大180 GB(B300で最大約288 GB) | 数百〜1,000サイクル超 | 約8 TB/s(HBM3e) | TMEM(Tensor Memory)はCPU側の階層に対応物がない、Tensor Core専用の第5世代機構(Blackwellの`tcgen05.*`命令)であり、CUDA C++から直接ポインタアドレス指定できず、Tensor Memory Accelerator(TMA)によるデータ移動が前提となる点がCPUのキャッシュ階層と大きく異なる。レジスタ超過時はローカルメモリ(実体はグローバルメモリ)へのスピルが発生し、数百〜1,000サイクル超のレイテンシを払う。 ## 横断的知見 - **CPUとGPUのメモリ階層は「レイテンシ隠蔽の主体」が異なる**: CPUの階層(§典型的なメモリ階層)はキャッシュのヒット率と局所性を頼りにレイテンシを隠蔽するのに対し、GPUの階層(§GPUのメモリ階層)は多数のワープを同時に走らせて「あるワープが待っている間に別のワープを実行する」という[[GPU占有率(Occupancy)]]によるレイテンシ隠蔽を主軸に据える。GPUでもL1/L2キャッシュは存在するが、CPUほどヒット率に依存せず、占有率という並列性の指標が階層設計の中心にある。(Source: [[Modern-Microprocessors-A-90-Minute-Guide|Modern Microprocessors: A 90-Minute Guide]], [[@2025__OReilly__AI Systems Performance Engineering - Chapter 6 GPU Architecture, CUDA Programming, and Maximizing Occupancy]] §Understanding GPU Memory Hierarchy) - **GPUのL2はCPUのLLCと役割は類似するが規模の桁が違う**: CPUのLLC(L3)は数十MB(例: AMD 3D V-Cacheで96MB超)だが、Blackwell GPUのL2は126MBとGPU全体で共有される点で近い規模感である一方、GPU全体のスレッド数(数十万規模)に対して共有されるため実効的なヒット率の設計思想はCPUのLLCとは異なる。(Source: [[Modern-Microprocessors-A-90-Minute-Guide|Modern Microprocessors: A 90-Minute Guide]], [[@2025__OReilly__AI Systems Performance Engineering - Chapter 6 GPU Architecture, CUDA Programming, and Maximizing Occupancy]] §Understanding GPU Memory Hierarchy) - **キャッシュコヒーレンシのコストは定量化されて初めて「並列化の壁」として意識される**: 本ページの既存記述(§キャッシュの連想度、§LLCの重要性)はキャッシュサイズ・連想度というアクセス頻度に関わる特性を扱うが、『詳解 システム・パフォーマンス 第2版』6章はキャッシュコヒーレンシ(他コアとのライン共有・書き換え)のコストを40〜75サイクルという具体値で示す。これはGPU側でスレッドブロック間の同期・グローバルメモリの一貫性コストと同様の「マルチプロセッサ間でのデータ共有に伴う不可避なオーバーヘッド」であり、CPUのキャッシュコヒーレンシプロトコルとGPUのメモリ一貫性モデルは、規模・実装は異なるが「スケーラブルなマルチプロセッサ設計の最大の課題の1つ」という位置づけを共有する。(Source: [[@2023__OReillyJapan__詳解 システム・パフォーマンス 第2版 - Chapter 6 CPU]] §6.4.1.3.4, [[@2025__OReilly__AI Systems Performance Engineering - Chapter 6 GPU Architecture, CUDA Programming, and Maximizing Occupancy]]) ## 未解決の問い - GPUのL2キャッシュ(126MB、GPU全体共有)は、CPUのLLCと同様の連想度・スラッシング特性を持つか。GPUワークロードの特性上、CPUのようなセット連想キャッシュの設計原理(§キャッシュの連想度)がそのまま適用できるかは書籍から確認できていない。 - TMEM(Tensor Memory)のような専用アドレス空間は、今後のCPUアーキテクチャにも汎化されうるか、それともTensor Core特有の設計に留まるか。 - GPUの占有率によるレイテンシ隠蔽とCPUのSMT(§SMTとキャッシュ共有)によるレイテンシ隠蔽は、キャッシュ資源の奪い合いという点で類似の課題(ワーキングセット競合)を抱えるはずだが、両者を統一的に扱う枠組みは存在するか。 - キャッシュコヒーレンシのコスト(40〜75サイクル)は、コア数・ソケット数が増えるほど悪化するはずだが、書籍はマルチソケット構成での定量的なスケーリング傾向を示していない。何コア/何ソケットからコヒーレンシコストが支配的になるか。 ## 関連 - 主記憶との速度差の全体像 → [[メモリウォール]] - 先進パッケージングによる LLC 拡大 → [[チップレット]] - GPUの並列実行によるレイテンシ隠蔽 → [[GPU占有率(Occupancy)]] / [[CUDA]] - CPU側のPMCによるキャッシュミス計測 → [[ハードウェアカウンタ]] - ソース: [[@2025__OReilly__AI Systems Performance Engineering - Chapter 6 GPU Architecture, CUDA Programming, and Maximizing Occupancy]] / [[@2023__OReillyJapan__詳解 システム・パフォーマンス 第2版 - Chapter 6 CPU]] ## 出典 - [[@2023__OReillyJapan__詳解 システム・パフォーマンス 第2版 - Chapter 6 CPU]](§6.4.1.3 CPUキャッシュ・§6.4.1.3.1 レイテンシ実測・§6.4.1.3.2〜4 連想度/キャッシュライン/コヒーレンシ・§6.4.1.4 MMU/TLB・§6.6.12 tlbstat)