プロセッサキャッシュとは?仕組み・階層・性能最適化からセキュリティ対策までの完全ガイド
プロセッサキャッシュとは — 概要
プロセッサキャッシュ(CPUキャッシュ)は、CPUと主記憶(DRAM)との速度差を埋めるために、CPU内部または近傍に設けられる高速な小容量メモリです。頻繁にアクセスされるデータや命令をキャッシュに置くことで、平均メモリアクセス時間を下げ、システム全体の性能を大きく向上させます。一般的に「L1」「L2」「L3」などの階層(レベル)で構成され、各レベルは容量・速度・共有性が異なります。
なぜキャッシュが必要か
プロセッサの演算能力(クロック周波数、命令パイプライン長など)は近年大幅に向上しましたが、DRAMのアクセス時間は相対的に遅いままです。この「メモリ壁(memory wall)」を放置すると、CPUはメモリアクセスの待ちでアイドルになる時間が増え、演算性能を活かせません。キャッシュは高速なSRAMでこの速度差を吸収し、CPUが高速にデータを取得できるようにする仕組みです。
基本概念:ライン、ヒット/ミス、AMAT
- キャッシュライン(ブロック):キャッシュが扱う最小転送単位。一般的には64バイトが多い(CPUやアーキテクチャによる)。
- ヒット:アクセスしたアドレスがキャッシュに存在すること。ヒットなら高速にデータ取得。
- ミス:存在しない場合。ミスが発生すると上位レベルまたはメインメモリからラインを読み込む必要があり、遅延が発生する。
- AMAT(Average Memory Access Time):平均メモリアクセス時間。代表式は
AMAT = ヒット時間 + ミス率 × ミスペナルティ
ヒット時間はキャッシュレイテンシ、ミスペナルティはミス発生時に上位レベルから取り込む時間(含む:バス遅延、DRAMレイテンシなど)です。
キャッシュの構成要素:サイズ、連想度、置換アルゴリズム
キャッシュの性能を決める主なパラメータ:
- サイズ:総バイト数。大きいほどデータを多く保持できるが、ヒット時間/コストが増える場合がある。
- ラインサイズ:一度に取り込むバイト数(例:64B)。空間的局所性を活かす。
- 連想度(アソシアティビティ):直接マップ(1-way)、n-way セットアソシアティブ、フルアソシアティブの区別。高い連想度は競合ミス(conflict miss)を減らすがハードウェアコストが上がる。
- 置換アルゴリズム:どのラインを追い出すか。LRU(最長時間未使用)が理想だが実装複雑、疑似LRUやランダムも利用される。
- 書き込みポリシー:Write-through(書き込みを直ちに下位へ伝える)と Write-back(変更をキャッシュ内に保持し、追い出し時に下位へ書く)。Write-back はトラフィック低減に有利だがコヒーレンシ管理が必要。
キャッシュ階層(L1/L2/L3/L4)の特徴
- L1:CPUコアごとに独立。最も高速だが容量は小さい(例:32KB 命令、32KB データ)。多くはインストラクションとデータで分離(Harvard風)。
- L2:L1より大きく遅い。コアごとに専有の場合と共有の場合がある(例:256KB〜1MB)。
- L3(LLC: Last Level Cache):多コア環境で共有されることが多い。数MB〜数十MBで、コア間でデータを共有する役割を担う。
- L4:全ての設計にあるわけではない。例としてCPUパッケージ外(eDRAM)に置かれる大容量のキャッシュや、GPU統合型システムの外部キャッシュ等がある。
マッピング方式:直接マップ、セットアソシアティブ、フルアソシアティブ
主なマッピング手法:
- 直接マップ:各メモリアドレスはキャッシュ内の1つの位置にのみ対応。実装が簡単だが、同じインデックスに集中すると競合が増える。
- セットアソシアティブ:キャッシュを複数のセットに分け、各セットは複数のウェイを持つ。妥協点として広く使われる(例:8-way)。
- フルアソシアティブ:任意の空き位置に配置可。競合ミスは最も少ないが、検索コスト・ハードウェアコストが高い。
キャッシュコヒーレンシ(共有メモリ環境での整合性)
マルチコアでは各コアが独立のキャッシュを持つため、同一メモリアドレスの複製が複数のキャッシュに存在し得ます。これらの一貫性を保つためにコヒーレンシプロトコルが用いられます。代表的なものはMESI(Modified, Exclusive, Shared, Invalid)です。拡張版にMOESI(Owned 状態)やMESIF などがある。
コヒーレンシの実現方法は主に2つ:
- スヌーピング(バスベース):コア間のバス上でトランザクションをブロードキャストして状態を更新。小規模マルチプロセッサ向け。
- ディレクトリベース:メモリ側にディレクトリを置き、どのコアが行を保持しているかを追跡。大規模システム向け。
仮想メモリとキャッシュの関係
実アドレス(物理アドレス)と仮想アドレスのどちらでインデックス/タグを扱うかは重要な設計選択です。仮想インデックス・仮想タグ(VIVT)は高速だがページ同名(aliasing)問題を起こし得る。物理インデックス・物理タグ(PIPT)は確実だがアドレス変換(TLB)を待つ必要がある。多くの実装は仮想インデックス・物理タグ(VIPT)を採用してトレードオフを取ります。
ミスの種類:強制ミス・容量ミス・競合ミス
- 強制(コンパルソリ)ミス:プログラム開始時や初回アクセス時。必然的に発生。
- 容量ミス:キャッシュが小さすぎて作業セットを保持できない場合に発生。
- 競合ミス(コンフリクトミス):マッピング方式のために異なるアドレスが同じ場所を奪い合うと発生。
プリフェッチと投機(speculation)
ハードウェアプリフェッチャはアクセスパターンを予測して先回りしてラインを読み込むことでミス率を低下させます。ソフトウェア(コンパイラやコード)からもプリフェッチ命令を挿入できます。一方、投機実行(例:分岐予測+投機実行)によりキャッシュにデータが入り、サイドエフェクトが生じることもあります(後述のセキュリティ問題)。
セキュリティとサイドチャネル
キャッシュの存在は副次的にタイミングを利用したサイドチャネル攻撃の温床にもなります。有名な攻撃手法には「Flush+Reload」や「Prime+Probe」があり、暗号鍵や機密データの一部を推定することが可能です。また、Spectre/Meltdown のような投機実行に起因する脆弱性はキャッシュを通じてデータを露出させることがあります。
対策としては、ソフトウェアの修正(例:分岐の無害化)、ハードウェアの変更、キャッシュを分割/隔離する技術(例:Intel Cache Allocation Technology(CAT)によるキャッシュ領域割当)、時分割やページカラーリングによる干渉低減などがあります。
実務で押さえておくべきポイント
- 典型的なラインサイズは64B。ループや構造体のレイアウトで空間局所性を活かすと効果的。
- データのアクセス順序(ストライド)によってキャッシュ利用効率は大きく変わる。大きなストライドはキャッシュミスを誘発する。
- 多コア環境ではキャッシュコヒーレンシによるオーバーヘッドに注意。共有データの頻繁な更新は性能悪化を招く。
- パフォーマンス評価には「ヒット率」だけでなく「AMAT」を見てボトルネックを判断する。帯域幅(バス/メモリ)、レイテンシ、競合の影響を考慮する。
- プロファイリングツール(Linuxのperf、Intel VTune Amplifier、AMD uProfなど)を使ってキャッシュミスとホットスポットを特定する。
測定・シミュレーション
開発段階では実際のハードウェアで測定するのが最も確実ですが、研究やアーキテクチャ設計ではキャッシュシミュレータ(gem5、DineroIV、Cachegrind/Valgrind など)を使ってアクセスパターンとパラメータを変えた評価が行われます。測定時はワークロードの代表性やCPUの省電力機構、プリフェッチの影響も考慮する必要があります。
最新トレンドと今後の課題
近年の動向としては、コア数増加に伴う共有キャッシュ設計、オンパッケージeDRAMや3Dスタッキングを用いた大容量低遅延キャッシュ、ソフトウェアと協調したキャッシュ管理(OS/ハイパーバイザによるカラーリング)、そしてセキュリティを重視した分離・割当技術が挙げられます。AIやデータセンター向けワークロードではキャッシュの帯域とレイテンシのトレードオフが再び注目されています。
まとめ(実務的なチェックリスト)
- データの局所性(時間的・空間的)を意識した設計を心掛ける。
- 構造体のパディング、配列アクセスの順序を最適化してラインを有効活用する。
- 共有データの更新を最小化し、可能ならスレッドローカルやバッチ更新を採用する。
- パフォーマンス解析にperfやVTuneを用い、実際のミス率とAMATを確認する。
- セキュリティ要件がある場合はキャッシュ関連のサイドチャネル対策を設計段階で検討する。
参考文献
- CPU cache — Wikipedia
- MESI protocol — Wikipedia
- Spectre: Exploiting Speculative Execution — Paul Kocher et al. (2018)
- Flush+Reload: a High Resolution, Low Noise, L3 Cache Side-Channel Attack — Yuval Yarom, Katrina Falkner (2014)
- Intel 64 and IA-32 Architectures Software Developer Manuals — Intel
- Intel Cache Allocation Technology (CAT) — Intel
- Computer Architecture: A Quantitative Approach — John L. Hennessy, David A. Patterson
- perf — Linux profiling with perf


