L1・L2・L3キャッシュの違い:容量・レイテンシ・共有範囲・包含関係を比較

L1・L2・L3キャッシュは、CPUのコアに近い順に並んだ多段のキャッシュで、近いほど小さく速く、遠いほど大きく遅くなります。一般的なPCやサーバーのCPUでは、L1は数十 KBで数サイクル、L2は数百 KB〜数 MBで十数サイクル、L3は数 MB〜数十 MBで数十サイクルが代表的な範囲です。L1とL2は多くの場合コアごとに持ち、L3は複数のコアで共有します。主記憶のDRAMへのアクセスには数百サイクルかかるので、この階層でできるだけ多くのアクセスを受け止めます。

項目L1キャッシュL2キャッシュL3キャッシュ
コアとの関係各コア専用多くはコアごとに専用。数コアで共有する設計もある複数のコア(チップ全体やコアのまとまり)で共有
容量(PC・サーバー向けCPUの代表的な範囲)命令用・データ用それぞれ約32〜64 KBコアあたり約256 KB〜数 MBチップ全体で数 MB〜数十 MB
レイテンシ(代表的な範囲)約3〜5サイクル約10〜20サイクル約30〜70サイクル。コアから遠い部分ほど長い
命令とデータ分ける(IキャッシュとDキャッシュ)共用(統合キャッシュ)共用(統合キャッシュ)
設計で重視することヒット時間の短さ。パイプラインの中で毎サイクル使うL1のミスを受け止め、ミスペナルティを小さくする主記憶へのアクセスを減らし、コアの間でデータを共有する
ミスしたときの行き先L2L3主記憶(DRAM)
アドレスの扱い仮想インデックス・物理タグ(VIPT)が多い物理アドレス物理アドレス
包含関係最も上位。下位に含まれるかは下位の方式で決まるインクルーシブ、非インクルーシブなど設計によるインクルーシブにすると一貫性の確認を絞り込みやすい。重複をなくすエクスクルーシブや非インクルーシブの設計もある
物理的な配置コアの中。実行ユニットのすぐそばコアのすぐ外側。コアの一部として配置コアごとのスライスに分け、リングやメッシュの網でつなぐことが多い
ラインサイズ64バイトが一般的64バイトが一般的64バイトが一般的

数値は代表的な目安で、世代や製品によって異なります。

どんなときに使うか

L1キャッシュ
命令の取り出しやロード・ストアのたびに使う、最も近いキャッシュです。よく使うデータを小さな範囲にまとめ、時間的局所性を高めると効果が出ます。
L2キャッシュ
L1に収まらない作業データを受け止めます。ループブロッキングなどで、作業データを数百 KB〜数 MB程度に収めると効果が出やすくなります。
L3キャッシュ
複数のコアでデータを共有するときや、コアごとのキャッシュに収まらない大きなデータを扱うときに効きます。ほかのコアと容量を取り合うので、同時に動くプログラムの影響を受けます。

よくある質問

L1キャッシュをもっと大きくしないのはなぜですか?

容量を大きくすると、記憶セルの配列や配線が長くなり、ヒット時間が延びるからです。L1はパイプラインの中で毎サイクル使うので、1サイクルの遅れも性能に大きく響きます。そのためL1は数十 KBに抑え、大きな容量はL2やL3で確保します。VIPT方式では、ページサイズと連想度の関係からも容量が制限されます。

L1だけ命令用とデータ用に分けるのはなぜですか?

パイプラインでは、毎サイクル命令を取り出しながら、別の命令がデータを読み書きするからです。分けておけば2つのアクセスを同時に行え、それぞれに合った構成にできます。L2以降はアクセスの頻度が下がるので、容量を融通しやすい共用のキャッシュにするのが一般的です。

インクルーシブとエクスクルーシブは、どちらが良いのですか?

一長一短です。インクルーシブでは上位の内容が必ず下位にもあるので、ほかのコアからの問い合わせを下位だけで判断できますが、重複するぶん実質の容量が減ります。エクスクルーシブは重複がなく合計の容量を有効に使えますが、ラインの移動や一貫性の管理が複雑になります。コアの数やキャッシュの大きさに合わせて選ばれます。

表の容量やサイクル数は、どのCPUでも同じですか?

いいえ、PCやサーバー向けのCPUを想定した代表的な範囲です。設計の世代、動作周波数、コアの数、チップの構成で変わります。組込み用のマイコンではL2やL3を持たないものも多く、逆にキャッシュのチップを積層してL3を大きくしたものもあります。実際の値は、性能カウンタやメモリの遅延を測るプログラムで確かめます。

理解度チェック

一般的なコンピュータで、アクセスが速い順に並べた記憶階層として正しいものはどれか。

  1. ASSD → 主記憶 → L2キャッシュ → L1キャッシュ → レジスタ
  2. B主記憶 → レジスタ → SSD → L1キャッシュ
  3. Cレジスタ → L1キャッシュ → L2キャッシュ → 主記憶(DRAM) → SSD
答えと解説を見る

正解:C. レジスタ → L1キャッシュ → L2キャッシュ → 主記憶(DRAM) → SSD

CPUに近い記憶ほど高速で小容量、遠いほど低速で大容量・安価になります。目安は、レジスタが1クロック未満、L1が約1 ns(数十KB)、L2が数ns(数MB)、L3が十数ns(数十MB)、DRAMが約100 ns(数十GB)、SSDが数十〜100 µs(数TB)です。よく使うデータを速い階層に置くことで、全体として速く大容量の記憶を安価に実現しています。

キャッシュを命令用(Iキャッシュ)とデータ用(Dキャッシュ)に分けたL1キャッシュの主な利点はどれか。

  1. A命令とデータが同じアドレスに置かれても衝突しなくなり、容量が2倍に見えるから
  2. B命令の取り出しとデータの読み書きを同じクロックで並行して行えるから
  3. C命令は書き換えられないので、Dキャッシュを不要にできるから
答えと解説を見る

正解:B. 命令の取り出しとデータの読み書きを同じクロックで並行して行えるから

パイプラインでは、毎クロック命令を取り出しながら、別の命令がデータを読み書きします。L1を命令用とデータ用に分けると、2つのアクセスが1つのキャッシュのポートを取り合わずに並行して行え、それぞれの性質に合わせた構成も選べます。容量が2倍になるわけではなく、合計の容量を分けて使います。データの読み書きは常に必要なので、Dキャッシュを不要にすることはできません。L2以降は命令とデータを共用するのが一般的です。

L1キャッシュの下にL2キャッシュを置く多段のキャッシュで、L2キャッシュの主な役割はどれか。

  1. AL1キャッシュより速いヒット時間で、L1のミスそのものをなくす
  2. BL1より大きく遅いが、L1のミスペナルティを小さくする
  3. C主記憶の代わりにプログラムの全データを常に保持する
答えと解説を見る

正解:B. L1より大きく遅いが、L1のミスペナルティを小さくする

L1は速さを優先して小さく作るため、ミスがある程度起こります。L2はL1より大きく、ヒット時間は長いものの主記憶よりはずっと速いので、L1でミスしたアクセスの多くをL2で受け止め、L1のミスペナルティを主記憶まで行くより大きく減らします。L1より速いわけではなく、L1のミスをなくすこともできません。容量は主記憶よりはるかに小さく、全データを保持することもできません。

  1. 下位のキャッシュ(L2など)が上位のキャッシュ(L1)の内容をすべて含むインクルーシブ方式の特徴として正しいものはどれか。
  2. キャッシュの容量を大きくすると一般にヒット時間がどうなるか。その理由とあわせて正しいものはどれか。
  3. L1キャッシュのヒット時間が1 ns、ミス率が5%、L2キャッシュのヒット時間が10 ns、L2のローカルミス率が20%、主記憶のアクセス時間が100 nsのとき、平均メモリアクセス時間はいくらか。

メモリ階層と性能の練習問題へ

関連する用語の解説

キャッシュメモリ
CPUの近くに置く高速・小容量のメモリ。よく使うデータを保持して主記憶との速度差を緩和する。主にSRAMでつくられる。
平均メモリアクセス時間(AMAT)
1回のメモリアクセスにかかる時間の平均。ヒット時間 + ミス率 × ミスペナルティで求め、キャッシュの性能を比べる基本の指標になる。
ミスペナルティ
キャッシュミスが起きたときに、下の階層からデータを持ってくるために余分にかかる時間。下の階層のアクセス時間とラインの転送時間で決まる。
キャッシュコヒーレンシ
マルチコアのCPUで、各コアのキャッシュに同じアドレスのデータがあるとき、その内容の一貫性を保つ仕組み。あるコアが書き換えると、他のコアの古いコピーを無効にするなどして実現する。
時間的局所性
一度アクセスしたデータや命令に、近いうちに再びアクセスしやすい性質。ループの中で繰り返し使う変数などが例で、キャッシュが効く理由の一つ。

関連する比較