ダイレクトマップ・セットアソシアティブ・フルアソシアティブの違い:キャッシュの方式を比較

キャッシュは、メモリの各ブロックをどこに置いてよいかを決めなければなりません。ダイレクトマップのキャッシュでは、各ブロックを置けるラインが1つだけで、単純で速いのですが、2つのブロックが同じラインを取り合うと競合が起きます。フルアソシアティブのキャッシュでは、ブロックをどこにでも置けて競合はなくなりますが、すべてのラインとの比較が必要です。セットアソシアティブは、その折衷で、1つのセットの中のいくつかのウェイのどれかに置けます。ほとんどのCPUのキャッシュは、セットアソシアティブです。

項目ダイレクトマップセットアソシアティブフルアソシアティブ
ブロックを置ける場所インデックスのビットで決まる1つのライン1つのセットの中のウェイ(たとえば4つや8つ)のどれかキャッシュ内のどのライン
1回のアクセスでのタグ比較1回ウェイごとに1回(たとえば8回)すべてのラインを並列に
ヒット時間最も速いやや遅い最も遅い
ハードウェアのコストと電力最も小さい中程度最も大きい。ラインごとに比較器が必要
競合ミス最も多いウェイ数が増えると減るなし。残るのは初期ミスと容量ミスだけ
置き換えの方針不要。選択肢が1つセットの中で選ぶ(LRUやその近似)すべてのラインの中から選ぶ
主な用途小さく単純なキャッシュ、一部のマイコンほとんどのCPUのL1、L2、L3キャッシュ。多くは4〜16ウェイTLBやビクティムキャッシュなど、小さな構造

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

どんなときに使うか

ダイレクトマップ
ヒット率よりも、単純さ、低電力、速さが重要なとき。
セットアソシアティブ
ほとんどのキャッシュの現実的な選択です。数ウェイあれば、競合ミスの大半を、わずかなコストで除けます。
フルアソシアティブ
ヒット率が重要で、比較のコストを負担できる、非常に小さな構造のとき。

よくある質問

競合ミスとは何ですか?

空いているキャッシュのラインがほかにあるのに、2つのブロックが同じ場所に対応するために起こるミスです。ダイレクトマップで最も多く、フルアソシアティブでは起こりません。

8ウェイのキャッシュは、1回のアクセスでタグをいくつ比較しますか?

選ばれたセットの各ウェイに1つずつで、8個です。

なぜほとんどのCPUのキャッシュはセットアソシアティブなのですか?

数ウェイあれば、競合ミスの大半をわずかなコストで除けますが、フルアソシアティブは、ラインごとに比較器が必要だからです。

フルアソシアティブはどこで使われますか?

TLBやビクティムキャッシュなど、ヒット率が最も重要で、比較のコストを負担できる、小さな構造で使われます。

理解度チェック

アドレスが32ビット、容量32 KB、ラインサイズ64バイトのダイレクトマップ方式のキャッシュで、タグは何ビットになるか。

  1. A15ビット
  2. B19ビット
  3. C17ビット
答えと解説を見る

正解:C. 17ビット

ラインサイズ64バイト = 2⁶ なのでオフセットは6ビットです。ライン数は 32 KB ÷ 64 B = 32768 ÷ 64 = 512 = 2⁹ で、ダイレクトマップではライン数がそのままセット数なのでインデックスは9ビットです。残りがタグで、32 − 9 − 6 = 17ビットになります。19ビットは4ウェイのセットアソシアティブにしてインデックスが2ビット減ったときの値で、ダイレクトマップには当てはまりません。

アドレスが32ビット、容量32 KB、ラインサイズ64バイトの4ウェイ・セットアソシアティブ方式のキャッシュのセット数はいくつか。

  1. A128
  2. B512
  3. C32
答えと解説を見る

正解:A. 128

ライン数は 32 KB ÷ 64 B = 512 です。4ウェイでは1つのセットに4ラインが入るので、セット数は 512 ÷ 4 = 128 = 2⁷ となり、インデックスは7ビット、タグは 32 − 7 − 6 = 19ビットになります。512はライン数そのもので、ダイレクトマップのときのセット数です。連想度を上げるとセット数が減り、その分タグのビット数が増えて比較器も増えます。32はラインサイズの64を誤ってウェイ数で割った値です。

フルアソシアティブ方式のキャッシュで、アドレスのうちインデックス(セットを選ぶ部分)に使うビット数はどれか。

  1. Aラインサイズで決まる6ビット
  2. Bライン数と同じだけのビット
  3. C0ビット
答えと解説を見る

正解:C. 0ビット

フルアソシアティブ方式では、どのデータもキャッシュ内のどの場所にでも置けるため、セットは全体で1つしかありません。セットを選ぶ必要がないのでインデックスは0ビットで、アドレスはオフセットとタグだけに分かれ、アクセスのたびにすべてのラインのタグと比べます。そのため比較器が多く必要で、大きなキャッシュには向かず、TLBなどの小さな構造に使われます。ラインサイズで決まるのはオフセットのビット数で、インデックスではありません。

  1. ダイレクトマップ方式のキャッシュで、2つの配列の要素が同じキャッシュの位置に対応し、交互にアクセスするたびに互いを追い出し合っている。このミスの分類はどれか。
  2. ダイレクトマップ方式からセットアソシアティブ方式に変えたときに起こる変化として、正しいものはどれか。
  3. 8ウェイ・セットアソシアティブ方式のキャッシュで、1回のアクセスのたびに並列に比べるタグの数はいくつか。

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

関連する用語の解説

ダイレクトマップ方式
各アドレスのデータを置けるキャッシュ上の場所が1か所に決まっているキャッシュの構成。回路が単純でヒット時間が短いが、同じ場所を取り合う競合ミスが起こりやすい。
セットアソシアティブ方式
アドレスから決まる1つのセットの中の、複数の場所(ウェイ)のどれにでもデータを置けるキャッシュの構成。nウェイなら各アクセスでn個のタグを並列に比べる。
フルアソシアティブ方式
どのデータもキャッシュ内のどの場所にでも置けるキャッシュの構成。競合ミスは起こらないが、すべてのタグと比べる必要があり、大きなキャッシュには向かない。TLBなどに使われる。
キャッシュライン
キャッシュと下の階層の間でデータを読み書きする単位。キャッシュブロックともいう。多くのCPUでは64バイトで、アドレスの下位ビットがライン内の位置(オフセット)を表す。

関連する比較