キャッシュアクセスの構造

プロセサからメモリアクセス要求が出されると、そのアドレスのデータがキャッシュメモリに格納されているかどうか、格納されている場合は、どのキャッシュラインに入っているかを高速に判定する必要があるが、キャッシュはメインメモリのあちこちのアドレスのデータを格納するので、これは必ずしも簡単ではない。

このやり方として、大きく分けて2つの考え方がある。1つは、プロセサからアクセス要求が出されたアドレスと、キャッシュ内のすべてのキャッシュラインのタグを比較し、上位アドレスが一致したラインがあればヒットであり、そのキャッシュラインのデータを使うという方式である。

この方式は、検索方法としては理想的であるが、すべてのタグに比較回路を付ける必要があり、ハードウェアの物量と消費電力が大きい点が問題である。

もう1つの考え方は、アドレスの一部をインデックスとして使用し、あるアドレスのデータとタグのペアは、キャッシュの固定した部分にしか格納できないという制約を付け、探索範囲を1カ所から数カ所程度に限定することにより検索を容易にする方式である。

この方式は検索は容易であるが、メインメモリ上のアドレスにより使用できるキャッシュラインが決まってしまうので、キャッシュの利用率が低下し、ヒット率が低下するという問題がある。

フルアソシアティブキャッシュ

この理想的に、すべてのキャッシュラインのタグとプロセサからアクセス要求されたアドレスを比較するのがフルアソシアティブ(Full Associative)キャッシュ、あるいは連想キャッシュという方式である。

図4.5 Full Associative Cacheの構造

フルアソシアティブキャッシュは、図4.5に示すように、それぞれのタグの上位アドレス部とプロセサからのアドレスの一致を検出する回路を設け、一致したキャッシュラインはAND回路を開いて、そのデータ部の内容を出力する。

なお、図4.5では通常のXOR回路が書かれているが、この部分はタグの上位アドレス部の数十ビットの一致を検出する回路が必要となる。また、データアレイの出力側のAND回路は、データアレイのサイズだけのビット幅の並列のAND回路が必要である。また、図中の○はOR機能をもつ接続(Wired OR)を示している。

そして、一致回路の出力をバッファしてWired ORすることにより、プロセサからのアドレスがキャッシュ内に存在したというヒット状態を示す信号を生成している。このヒット信号が"1"の場合はデータ出力を使用し、この信号が"0"の場合は、どのキャッシュラインのタグとも一致しなかった、つまり、キャッシュ内に要求されたデータが存在しないことを意味しているので、この信号を使ってメインメモリ(あるいは下位のキャッシュ)へのアクセス動作を開始する。

このフルアソシアティブキャッシュ方式は、どのキャッシュラインにもメインメモリ上の任意のアドレスのデータを格納することができ、格納位置の自由度が高いという利点があるが、タグの比較回路がチップ面積、消費電力の点で大きな負担になるという問題点がある。このため、ライン数が多い大容量のデータや命令キャッシュとしてフルアソシアティブキャッシュ方式のキャッシュが用いられることは稀である。

一方、小容量のキャッシュでは、格納位置の自由度が高く、総メモリ容量の割りにはヒット率が高いという利点があり、後述のアドレス変換テーブルなどのプロセサ内の小容量のキャッシュとしては、フルアソシアティブキャッシュ方式が良く用いられている。