キャッシュ内のどこにでもデータを置けるキャッシュ配置方式
フルアソシアティブ方式とは、主記憶のブロックをキャッシュ内のどのスロット(行)にでも自由に置けるキャッシュ配置方式のことです。ダイレクトマップやセットアソシアティブのような「このアドレスはこの行/セット」という固定の対応がいっさいありません。
置き場所が決まっていないので、アドレスにインデックス部は不要で、タグ部とオフセット部だけになります。代わりに、目的のブロックがキャッシュにあるかを調べるときは全スロットのタグを一度に見比べる必要があります。上のツールで▶ボタンを押すと、全スロットを一斉に比較して判定する様子を確認できます。
身近な例で言うと、空いている席ならどこに座ってもいい自由席のようなものです。座る場所に制約がないので満席になりにくい(衝突しにくい)一方、誰がどこに座っているかを探すには、全部の席を見て回らなければなりません。
「どこにでも置ける」を実現するために、アドレスの扱いと検索のやり方がほかの方式と変わります。
仕組みのポイントは次のとおりです。
・アドレスはタグ部とオフセット部だけ:行を選ぶインデックス部が存在しない
・ヒット判定は全スロット一斉比較:どこに置いたか分からないので全部を同時に照合する
・格納は空きスロットのどれでも可:空きがある限り、追い出しは起きない
全スロットを同時に比較するために、ハードウェアでは連想メモリ(CAM)と呼ばれる専用回路を使います。連想メモリ=「中身(タグ)を一致するか並列に検索できるメモリ」のことです。これにより、スロット数が多くても1回の照合でヒット判定できますが、その分だけ比較器がたくさん必要になり、回路は複雑で高コストになります。
アドレス 011010 の扱い
─────────────────────
タグ 01101 | オフセット 0
→ インデックス部なし → 空きスロットのどこへでも格納
→ 検索時は 4 スロットのタグを一斉に比較
スロットがすべて埋まったときは、どれを追い出すかを置換アルゴリズム(LRU など、最も長く使われていないものを追い出す方式)で選びます。置き場所が完全に自由なぶん、追い出しの候補は全スロットになります。
キャッシュの配置方式は、ダイレクトマップ・セットアソシアティブ・フルアソシアティブの3つに整理できます。柔軟性(置き場所の自由度)・検索コスト・衝突のしやすさを並べて比べましょう。
| 項目 | ダイレクトマップ | セットアソシアティブ | フルアソシアティブ |
|---|---|---|---|
| 配置できる場所 | インデックスで決まる1行のみ | 決まったセット内の任意ウェイ | どのスロットでも可 |
| 柔軟性 | 低い | 中くらい | 高い |
| 検索コスト | 安い(1行だけ比較) | 中くらい(セット内を比較) | 高い(全行を比較) |
| 衝突(追い出し) | 起きやすい | 起きにくい | 最も起きにくい |
| 回路の複雑さ | 単純 | 中くらい | 複雑 |
3方式の関係を一言でまとめると、柔軟性と検索コストはトレードオフ(一方を上げると他方も上がる)です。
・ダイレクトマップ:柔軟性が低く検索は安いが、衝突しやすい
・セットアソシアティブ:両者の中間でバランスがよい(実際の CPU で多用)
・フルアソシアティブ:柔軟性が最大で衝突に強いが、全行検索でコストが高い
フルアソシアティブは衝突に最も強いものの、全スロットを比較する回路が高コストなため、行数の少ない小さなキャッシュ(TLB など)で使われます。大きなキャッシュでは、コストと性能のバランスからセットアソシアティブが選ばれることが多いです。