L3キャッシュ(LLC)とは — CPU性能を左右する仕組みと実践的最適化ガイド

L3キャッシュとは — 基本概念と役割

L3キャッシュ(レベル3キャッシュ、しばしばLLC=Last Level Cacheと呼ばれる)は、CPU内部に配置される複数階層のキャッシュメモリのうち、L1・L2より下位に位置する最終レベルのキャッシュです。L1やL2に比べて容量が大きく遅延は長いものの、メインメモリ(DRAM)よりは格段に高速であり、主に複数コア間でデータを共有・再利用するためのバッファとして機能します。

なぜL3が必要か — 階層構造の役割

CPUとDRAMの間には大きなレイテンシと帯域のギャップがあります。L1は超低遅延だが容量が小さい、L2は中間、L3はさらに大容量で遅延は増すがDRAMアクセス回数を減らすことで性能向上に寄与します。複数コアが同一ソフトウェアデータを扱う場合、L3を介してキャッシュヒット率を上げられれば、メモリアクセスのボトルネックを緩和できます。

L3キャッシュの構造的特徴

  • 容量: 数メガバイト(例:4–64MB程度)が一般的。サーバー向けではさらに大きくなる。
  • 共有・専有: 多くの設計ではソケット内の複数コアでL3を共有するが、コアごとに分割(専有)されることもある。共有化はコア間のデータ再利用に有利だが帯域競合を生む。
  • キャッシュライン: データは通常64バイト単位のラインで扱われる。ライン単位で読み書き・置換が行われる。
  • 連想度(associativity): 直接マップから高連想(8-way, 16-wayなど)まで様々。高連想は衝突を減らすが複雑度とアクセス遅延が増す。
  • 書き込みポリシー: Write-back(遅延書き戻し)が主流。性能と帯域効率を優先するため、書き込みはまずキャッシュ内で行われ、必要に応じてメモリに反映される。

インクルーシブ/エクスクルーシブ/ヴィクティム

キャッシュ階層間の「包含性(inclusiveness)」は設計上重要です。インクルーシブなLLCはL1/L2にある全ラインのコピーをL3にも保持するため、L3のラインを壊すことで上位キャッシュの無効化を一括して行える。一方、エクスクルーシブは上位と重複しないデータだけを保持し全体容量を有効活用できます。さらに「ヴィクティム(victim)キャッシュ」としてのL3は、上位(L1/L2)からの追い出しデータを受け入れる役割を強め、実質的にエクスクルーシブに近い振る舞いをします。実装はベンダーや世代によって異なります(例:Intelは従来LLCをインクルーシブとしてきた世代がある一方、AMDのZen系はL3がヴィクティム/非包含に近い設計を採るなど)。

コヒーレンシプロトコル(MESI/MESIFなど)

複数キャッシュ間で同じメモリ位置の一貫性を保つため、MESIやその拡張(MESIFなど)といったキャッシュコヒーレンシプロトコルが用いられます。これらは各キャッシュラインが「修正(Modified)」「排他(Exclusive)」「共有(Shared)」「無効(Invalid)」などの状態を取り、読み書きや別コアからの要求に応じて状態遷移を行います。近年の実装では、共有ラインから効率よくデータを供給する最適化(例:F=Forwarding)を持つプロトコルも存在します。

性能指標と具体的な遅延感

キャッシュの性能はヒット率・レイテンシ・帯域で評価できます。典型的な目安として(アーキテクチャや周波数による差は大きいが)L1は数サイクル、L2は十数サイクル、L3は数十サイクル、DRAMは百サイクル以上というオーダーになります。L3のヒット率を上げることは、DRAMアクセス(高レイテンシ・高消費電力)を減らす意味で非常に効果的です。

プログラマが押さえるべきポイント

  • 局所性を高める — 時間的局所性(頻繁に使うデータを繰り返し使う)と空間的局所性(近接するデータを一度に使う)を意識したデータ配置・アルゴリズム設計。
  • データ構造の整列・パディング — キャッシュラインの境界を考慮して構造体・配列を配置し、false sharing(異なるスレッドが同一ラインを更新して競合する現象)を避ける。
  • スレッド配置とNUMA — マルチソケットやNUMA環境では、データとスレッドの配置がL3ヒット率やメモリアクセス遅延に直結する。
  • プリフェッチの活用 — ハードウェアプリフェッチャ/ソフトウェアプリフェッチ命令を適切に使うことでキャッシュミスを低減できる。
  • キャッシュフレンドリーなアルゴリズム — ブロッキング(タイル化)、ループ変換、ストライドアクセスの低減など。

計測とデバッグの方法

実際の挙動を把握するにはハードウェア性能カウンタを利用します。Linuxでは perf でLLC関連イベント(LLC-load-misses、LLC-store-missesなど)を取得可能です。Intel VTune、AMD uProf、Linux perfやmsr-toolsなどを用いてキャッシュミス率や各階層のレイテンシを計測し、ボトルネックの特定に役立てます。

最新動向と今後

近年はコア数増加に伴うLLC設計の見直し、キャッシュ補強のための大容量オンチップキャッシュ、パッケージ内メモリ(HBM)との組合せ、さらにはキャッシュ管理をOSやハードウェアで細かく制御する仕組みの発展が進んでいます。特にAIやデータセンター向けワークロードでは、巨大なモデルや高帯域が要求されるため、LLCやメモリ階層のアーキテクチャが性能に与える影響はますます大きくなっています。

まとめ

L3キャッシュは、CPUのメモリ階層における「最終レベル」のキャッシュとして、複数コア間でのデータ共有、メモリアクセスの削減、そしてアプリケーション性能の安定化に重要な役割を果たします。設計(共有/専有、包含性、連想度など)や実装されるコヒーレンシプロトコルにより振る舞いが大きく異なるため、アプリケーション最適化の際は対象プラットフォームの仕様と実測結果を確認することが肝要です。

参考文献