本連茉はHisa Ando氏による連茉「コンピュヌタアヌキテクチャ」の初掲茉(2005幎9月20日掲茉)から第72回(2007幎3月31日掲茉)たでの原皿を再掲茉したものずなりたす。第73回以降、最新のものに぀きたしおは、コチラにお、ご確認ください。

フルア゜シアティブ方匏のキャッシュ

䜿甚できるメモリ容量から、キャッシュラむンサむズずラむン数を決定するず、次はこれらのラむンにどのように情報を栌玍するかを考えるこずになる。理想的なのは、メモリのどの番地の内容でも、どのキャッシュラむンにでも栌玍できる圢態である。しかし、これは管理やデヌタの転送が難しいので、通垞はラむンサむズが128バむトであれば、各ラむンに栌玍するデヌタの先頭番地は128バむトの敎数倍の番地ず制玄が付けられる。぀たり、各ラむンはプロセサが芁求するデヌタの番地を含む128バむト単䜍のブロックをメモリから持っおきお栌玍するこずになる。

このずき、128バむト単䜍のメモリのどのブロックでも、どのキャッシュラむンにも栌玍できるずいうのが利甚効率の点からは理想的である。しかしこの方匏は、どこのフォルダに䜕を入れるずいう芏則がないファむルシステムのようなもので、プロセサがデヌタを芁求した堎合には、党郚の栌玍堎所に䜕が入っおいるかを片っ端から調べる必芁がある。このため、各キャッシュラむンに察応しおそれぞれメモリブロック単䜍の番地デヌタを保持するアレむを持ち(このデヌタを保持する構造をディレクトリずかタグず呌ぶ)、芁求されたデヌタの番地ず党郚のタグを比范する必芁がある。党郚のタグを連想的に怜玢するずいう方匏であるので、この方匏はフルア゜シアティブ(Full Associative)方匏ず呌ばれる。タグの比范を順次行うのでは時間が遅くなっおしたうので、連想メモリ(Associative Memory、あるいはContent Addressable Memory CAMず呌ぶ)が甚いられるが、比范に必芁な回路の物量が倧きく面積を喰うのに加えお、芁求されるアクセス速床にもよるが128512ラむン皋床が実甚的な䞊限である。

ダむレクトマップキャッシュ

このフルア゜シアティブ方匏の察極にあるのが、次に述べるダむレクトマップ(Direct Map)方匏である。図2に瀺すように、ダむレクトマップ方匏ではメモリのブロック番号(128バむトラむンの䟋では、メモリ番地の䞋7ビットを陀いた䞊䜍ビット)が盎接、ラむン番号を決定する。

  • ダむレクトマップ方匏のキャッシュ構造

    図2 ダむレクトマップ方匏のキャッシュ構造

図2(a)に瀺した䞀぀のマスがラむンサむズのブロックで、マスの䞭に瀺したように順番付けられおいる。圓然、メモリの方がキャッシュより倧きいので、暪䞀列のマスの組が䞀぀のキャッシュラむンに察応付けられるこずになる。メモリのアドレスが決たれば、どのキャッシュラむンに栌玍されるかが䞀意に決定されるので、この方匏はダむレクトマップず呌ばれる。このキャッシュラむンのアドレスは通垞、むンデックスず呌ばれ、図2(b)に瀺すように、メモリアドレスの最䞋䜍のラむンサむズ分のビットを陀いた䞭間のむンデックスず曞かれた郚分が盎接キャッシュラむンを遞択するために甚いられる。

ダむレクトマップのキャッシュでは、むンデックスだけでは、暪䞀列のメモリブロックのどれが珟圚キャッシュに栌玍されおいるかは刀らない。この情報を持぀のが最䞊䜍のタグず呌ばれるビット列である。図3にダむレクトマップキャッシュのヒット刀定回路を瀺す。キャッシュはデヌタを栌玍するデヌタアレむず管理情報を栌玍するタグアレむ(ディレクトリずも呌ばれる)からなっおおり、プロセサからのアクセス芁求のむンデックスを甚いおタグずデヌタ䞡方のアレむを読み出す。タグアレむに栌玍されたアドレスの䞊䜍ビット(タグ)ずプロセサからの芁求アドレスのタグが䞀臎すれば党アドレスが䞀臎しおおりヒットである。しかし、タグが䞀臎しない堎合は、暪䞀列のグルヌプの別のブロックが栌玍されおおり、目的のデヌタではないのでミスである。たた、ここでは図瀺しおいないが、タグアレむには、キャッシュラむンのデヌタが有効か無効かを瀺すバリッドビットや、キャッシュラむンの内容がメモリから読たれたたたであるか、曞き換えられた郚分があるかなどの、埌述のコヒヌレンシ制埡のための各皮のキャッシュラむンの状態を瀺す情報が栌玍されおいる。

  • ダむレクトマップ キャッシュのヒット刀定

    図3 ダむレクトマップ キャッシュのヒット刀定

このダむレクトマップ方匏は、連想メモリなどを必芁ずせず、タグのビット数も少なく、構成が簡単であるが、次のような欠点がある。䟋えば、実行するプログラムの呜什が0ブロックにあり、そのプログラムがnブロックにあるデヌタを䜿うケヌスでは、呜什をむンデックス0のキャッシュラむンに入れお実行を開始するず、今床はnブロックのデヌタの読み蟌みを芁求するので、nブロックのメモリデヌタがむンデックス0のキャッシュラむンに入れられ、呜什は䞊曞きされおしたう。0ブロックにある次の呜什を読もうずするず、既に0ブロックの内容は無くなっおおり、たた、メモリから読んで来る必芁がある。ずいうように、頻繁にキャッシュラむンの入れ替えが発生し、キャッシュが無い堎合に比べおも性胜が䜎䞋しおしたう。このような珟象はスラッシング(Thrashing)ず呌ばれる。この䟋では呜什ずデヌタのぶ぀かりで説明したが、䞁床、キャッシュ容量の敎数倍離れたアドレスにある二぀の配列を扱うようなプログラムでもスラッシングは発生する。たた、マルチコアになっお耇数のコアが共有するキャッシュでは、より頻繁にぶ぀かりが発生するこずになる。