L1/L2キャッシュの仕組みと「ヒット率」がパフォーマンスに与える影響
組み込み開発や低レイヤーの最適化において、避けては通れないのがキャッシュメモリの理解です。本記事では、L1/L2キャッシュの構造的な違いと、パフォーマンス指標となる「ヒット率」の計算方法について解説します。
キャッシュメモリの階層構造
CPUの演算速度に対して、メインメモリ(DRAM)のアクセス速度は非常に低速です。この速度差(いわゆる「メモリの壁」)を埋めるために、CPUとメモリの間に高速なSRAMを用いたキャッシュが配置されます。
L1キャッシュ (Level 1)
- 位置: CPUコアに最も近く、通常はコア内部に統合されています。
- 特徴: 命令用(I-Cache)とデータ用(D-Cache)に分離されていることが多く、ハーバードアーキテクチャに基づいた並列アクセスが可能です。
- 速度: 数サイクルでアクセス可能ですが、容量は数十KB〜数百KBと極めて限定的です。
L2キャッシュ (Level 2)
- 位置: L1の外側に配置されます。
- 特徴: L1でミス(データが見つからない)した際に参照されます。
- 速度: L1よりは遅いですが、メインメモリよりは遥かに高速です。容量は数百KB〜数MB程度が一般的です。
キャッシュヒット率の計算
キャッシュの効率を評価する指標が ヒット率(Hit Rate) です。CPUが必要とするデータがキャッシュ内に存在する割合を指します。
基本的な計算式
ヒット率は以下の式で求められます。
$$\text{ヒット率} = \frac{\text{キャッシュヒット回数}}{\text{全アクセス回数(ヒット回数 + ミス回数)}}$$
逆に、データが見つからなかった割合を ミス率(Miss Rate) と呼び、1 - ヒット率 で算出されます。
【実例】ヒット率がアクセス時間に与えるインパクト
エンジニアとして注目すべきは、ヒット率の僅かな変動が 実効アクセス時間(EAT: Effective Access Time) にどれほど影響するかという点です。
シミュレーション条件
- キャッシュアクセス時間: $10\text{ns}$
- メインメモリ(ミス時)アクセス時間: $100\text{ns}$
ヒット率 90% の場合
$$\text{EAT} = (10 \times 0.9) + (100 \times 0.1) = 9 + 10 = 19\text{ns}$$
ヒット率 70% の場合
$$\text{EAT} = (10 \times 0.7) + (100 \times 0.3) = 7 + 30 = 37\text{ns}$$
考察:
ヒット率が $20%$ 低下するだけで、平均アクセス時間は約 2倍 にまで悪化します。高性能なSoCやCortex-Aシリーズ等でキャッシュの最適化(データの局所性を意識したコーディング)が求められるのは、この数値からも明らかです。
まとめ
- L1: 最速だが小容量。命令とデータで分かれていることが多い。
- L2: L1を補完する中速・中容量のバッファ。
- ヒット率: わずかな低下がシステム全体のボトルネックに直結する。
組み込み現場では、キャッシュの有無や設定によって割り込み応答速度やリアルタイム性が変わるため、常にこの階層構造を意識した設計が重要になります。