L2キャッシュ(二次キャッシュ)の基礎から設計・最適化まで徹底解説—階層構造・共用/包含戦略・最新動向

二次キャッシュ(L2キャッシュ)とは

二次キャッシュ(にじキャッシュ、通称 L2 キャッシュ)は、CPU のキャッシュメモリ階層における第二レベルの高速メモリです。一次キャッシュ(L1)が最も高速で小容量なのに対し、L2 は容量が大きく遅延はやや長い、CPU とメインメモリ(DRAM)との間に位置するキャッシュです。プロセッサが必要とするデータや命令をできるだけメインメモリアクセスなしで満たすことで、処理性能の向上とメモリ帯域の節約を図ります。

キャッシュ階層における役割

典型的なメモリ階層は次のようになります:

  • L1 キャッシュ:コアごとに最も近い(最速)キャッシュ。サイズは数十 KB 程度。
  • L2 キャッシュ:L1 と L3 の中間に位置。容量は数十 KB から数 MB、L1 より遅いが L3 より高速という位置づけ。
  • L3 キャッシュ(LLC):多くのコアで共有される大容量キャッシュ。数 MB〜数十 MB。
  • メインメモリ(DRAM):大容量だが遅い。

この階層構造は、局所性(時間的局所性・空間的局所性)を活用して平均メモリアクセス時間を低減します。L2 は L1 ミスを補う「セカンドチャンス」として重要な働きをします。

L2(二次キャッシュ)の主要設計要素

L2 キャッシュの性能は複数の設計パラメータで決まります。主な要素は以下の通りです。

  • 容量(Size):小さいとミス率が高く、大きいとヒット率は上がるがチップ面積と消費電力を消費します。設計上は用途に応じて数十 KB〜数 MB 範囲で決定されます。
  • ラインサイズ(Cache line / block size):通常 32B〜128B 程度。ラインサイズは空間的局所性を活かすが、大きすぎると不要データの転送コストが増えます。
  • アソシアティビティ(結合度):直接マップ、n-way set-associative(例:4-way, 8-way)など。高いアソシアティビティはコンフリクトミスを減らすが、ルックアップ回路の複雑化と消費電力上昇を招きます。
  • レイテンシ(アクセス遅延)と帯域(throughput):L1 より遅いが L3 より速い、というのが一般的。具体的なサイクル数はアーキテクチャや世代で変動します。
  • 書き込みポリシー:Write-through(書き込みはすぐ下位へ)か Write-back(まずキャッシュ内に書き戻し、後で下位へ)か。Write-back は帯域効率が良いが一貫性管理が難しい場合がある。
  • 置換アルゴリズム:LRU(最終最近使用)やその近似、ランダムなど。実装コストと性能の折衷で設計されます。
  • インクルーシブ/エクスクルーシブ/非インクルーシブ:L2 と L3 の関係。インクルーシブなら L1/L2 の内容は L3 にも含まれる、エクスクルーシブなら重複しない、といった方針が設計時に決定されます。

インクルーシブとエクスクルーシブの違い

キャッシュ階層間の「包含性(inclusivity)」は性能とコヒーレンシ処理に影響します。

  • インクルーシブ(包含): 上位キャッシュ(例:L3)が下位(L2, L1)のデータを必ず含む。あるコアの L2 行を L3 から調べれば存在確認ができるため、キャッシュ一貫性(coherence)管理が簡単になる。ただし L3 の容量効率は下がる。
  • エクスクルーシブ(排他的): 下位のデータは上位に複製されないため、総キャッシュが有効容量として増えるメリットがあるが、データの移動や一貫性処理が複雑になる。
  • 非インクルーシブ(non-inclusive): 部分的に重複するなど中間的な戦略を取る場合もあります。

書き込みポリシーとコヒーレンシ

L2 の書き込みポリシーは性能に直結します。Write-back と Write-through の選択は、帯域と一貫性(特に DMA やマルチデバイス環境)でトレードオフがあります。さらにマルチコア環境ではキャッシュコヒーレンシプロトコル(MESI や MOESI など)が不可欠で、コア間でのデータ更新や共有の追跡は L2 レベルでも大きく影響します。

仮想アドレスと物理アドレス:仮想化の問題

キャッシュは仮想アドレス(VA)ベースでタグ付けするか、物理アドレス(PA)ベースでタグ付けするかで設計が変わります。VA キャッシュは仮想アドレスで早く参照できる利点がある一方、コンテキスト切替(ASID 処理)や同一物理ページに対する異なる仮想アドレス(同一ページの別マッピング)での同一性管理が必要となります。多くの設計では L1 を VA、L2 以降を PA で管理するハイブリッド方式が採られることが多いです。

マルチコア時代における L2 の配置と共有戦略

マルチコア CPU では L2 をコアごとにプライベートに持たせる方式と、複数コア間で共有する方式があります。

  • プライベート L2:コアあたりの遅延が最小化され、コア独立の最適化が可能。共有データに対しては L3 やインターコネクトを通す必要がある。
  • 共有 L2:コア間のデータ共有に有利で、同一データを複数コアで使う場合の冗長性を減らせるが、アクセス競合で帯域や遅延の悪化を招く可能性がある。

設計者はコア数、アプリケーションの共有性、帯域要件などに応じてこれらを選びます。近年の多くの x86 系 CPU はコアごとに L2 を持たせ、より大きな L3 を共有するハイブリッド構成が主流となっています。

性能への影響と実測・解析手法

L2 ミス率とレイテンシはプログラムの実行時間に直接効くため、プロファイリングでボトルネックを見つけることが重要です。一般的な手法とツール:

  • ハードウェアイベントカウンタ:Linux の perf、Intel VTune、AMD μProf などで L1/L2 ミス、キャッシュ参照数、メモリ帯域などを収集。
  • マイクロベンチマーク:ストライドアクセスやワーキングセットを変える簡単なベンチでキャッシュサイズ/ラインサイズの推定。
  • プロファイリング:ホットスポットを見つけ、メモリアクセスパターン(ストライド、乱択、局所性欠如)を特定。

注意点として、キャッシュの挙動はプロセッサ世代、設定(ハイパースレッディング、電源管理)や OS のスケジューリングによっても変化します。よって複数環境での検証が望ましいです。

ソフトウェア最適化の実践的ヒント

  • データ局所性を高める:配列の走査順を行優先にする、構造体配列(AoS)と配列構造体(SoA)を使い分けるなど。
  • ワーキングセットを意識:一度にアクセスするデータ量が L2/L3 に収まるように設計する。
  • ループ変換とブロッキング:大きな行列演算やストリーミング処理ではブロック化でキャッシュの再利用を高める。
  • プリフェッチ:ハードウェアプリフェッチャに頼るか、必要に応じてソフトウェアプリフェッチ命令を利用する。
  • 並列処理でのデータ配置:NUMA とキャッシュの関係に注意し、スレッドのピン留めとデータのローカリティを保つ。

最新動向と将来展望

近年は次のような潮流があります。

  • 各コアに割り当てられる L2 容量の拡大:コアが増えてもコア単位での性能を確保するため、世代ごとに L2 設計が見直されています。
  • キャッシュのレイヤー化・多様化:オンチップ SRAM に加え、HBM やスタック型 DRAM といった高帯域メモリの登場でキャッシュ階層設計も進化しています。
  • 省電力化とQoS:データセンター向けにはキャッシュ帯域やレイテンシの一貫性(QoS)を保つ仕組みが重視されています。
  • セキュリティ面の配慮:スペクトル系やサイドチャネル攻撃に対する防御がキャッシュ設計にも要求されています。

まとめ

二次キャッシュ(L2)は、CPU のメモリ階層において L1 とメインメモリの間で性能と効率を大きく左右する重要な要素です。容量、アソシアティビティ、書き込みポリシー、インクルージョン戦略、コヒーレンシプロトコルなど多数の設計判断がトレードオフを生みます。ソフトウェア側ではデータの局所性を高め、キャッシュフレンドリーなアルゴリズムを採用することで L2 の恩恵を最大化できます。最新のプロセッサでは L2 設計も多様化しているため、実行環境に応じた測定と最適化が不可欠です。

参考文献