FE EXAM

フルアソシアティブ方式(fully associative)

キャッシュ内のどこにでもデータを置けるキャッシュ配置方式

INTERACTIVE VISUALIZATION
検索中格納済みヒット
シナリオ
今アクセス: 011010
tag 01101 / ofs 0(インデックスなし)
ステップ1 / 7
STEP 1/7初期状態 — 4スロット、インデックスなしキャッシュは4スロットあります。ダイレクトマップやセットアソシアティブと違い、フルアソシアティブには「このアドレスはこの行」という固定の対応がありません。どのブロックも、空いているどのスロットにでも入れます。すべて空の状態から始めます。
アドレス 011010タグ(インデックスなし)01101OFS0全スロットと比較キャッシュ(4スロット・どこでも可)スロット0スロット1スロット2スロット3
解説

📌
フルアソシアティブ方式とは

ブロックスロット0スロット1スロット2スロット3どのスロットにも置ける(固定先なし)

フルアソシアティブ方式とは、主記憶のブロックをキャッシュ内のどのスロット(行)にでも自由に置けるキャッシュ配置方式のことです。ダイレクトマップやセットアソシアティブのような「このアドレスはこの行/セット」という固定の対応がいっさいありません。

置き場所が決まっていないので、アドレスにインデックス部は不要で、タグ部とオフセット部だけになります。代わりに、目的のブロックがキャッシュにあるかを調べるときは全スロットのタグを一度に見比べる必要があります。上のツールで▶ボタンを押すと、全スロットを一斉に比較して判定する様子を確認できます。

身近な例で言うと、空いている席ならどこに座ってもいい自由席のようなものです。座る場所に制約がないので満席になりにくい(衝突しにくい)一方、誰がどこに座っているかを探すには、全部の席を見て回らなければなりません。

📐
任意位置に格納できる仕組み

「どこにでも置ける」を実現するために、アドレスの扱いと検索のやり方がほかの方式と変わります。

仕組みのポイントは次のとおりです。
アドレスはタグ部とオフセット部だけ:行を選ぶインデックス部が存在しない
ヒット判定は全スロット一斉比較:どこに置いたか分からないので全部を同時に照合する
格納は空きスロットのどれでも可:空きがある限り、追い出しは起きない

全スロットを同時に比較するために、ハードウェアでは連想メモリ(CAM)と呼ばれる専用回路を使います。連想メモリ=「中身(タグ)を一致するか並列に検索できるメモリ」のことです。これにより、スロット数が多くても1回の照合でヒット判定できますが、その分だけ比較器がたくさん必要になり、回路は複雑で高コストになります。

アドレス 011010 の扱い
─────────────────────
タグ 01101 | オフセット 0
→ インデックス部なし → 空きスロットのどこへでも格納
→ 検索時は 4 スロットのタグを一斉に比較

スロットがすべて埋まったときは、どれを追い出すかを置換アルゴリズム(LRU など、最も長く使われていないものを追い出す方式)で選びます。置き場所が完全に自由なぶん、追い出しの候補は全スロットになります。

⚖️
3方式の比較

キャッシュの配置方式は、ダイレクトマップ・セットアソシアティブ・フルアソシアティブの3つに整理できます。柔軟性(置き場所の自由度)・検索コスト・衝突のしやすさを並べて比べましょう。

項目ダイレクトマップセットアソシアティブフルアソシアティブ
配置できる場所インデックスで決まる1行のみ決まったセット内の任意ウェイどのスロットでも可
柔軟性低い中くらい高い
検索コスト安い(1行だけ比較)中くらい(セット内を比較)高い(全行を比較)
衝突(追い出し)起きやすい起きにくい最も起きにくい
回路の複雑さ単純中くらい複雑

3方式の関係を一言でまとめると、柔軟性と検索コストはトレードオフ(一方を上げると他方も上がる)です。
ダイレクトマップ:柔軟性が低く検索は安いが、衝突しやすい
セットアソシアティブ:両者の中間でバランスがよい(実際の CPU で多用)
フルアソシアティブ:柔軟性が最大で衝突に強いが、全行検索でコストが高い

フルアソシアティブは衝突に最も強いものの、全スロットを比較する回路が高コストなため、行数の少ない小さなキャッシュ(TLB など)で使われます。大きなキャッシュでは、コストと性能のバランスからセットアソシアティブが選ばれることが多いです。

関連コンテンツ