本連載はHisa Ando氏による連載「コンピュータアーキテクチャ」の初掲載(2005年9月20日掲載)から第72回(2007年3月31日掲載)までの原稿を再掲載したものとなります。第73回以降、最新のものにつきましては、コチラにて、ご確認ください。
多階層のキャッシュの場合、一番大きな3次キャッシュに入っているデータの集合が一番大きく、2次キャッシュはこの集合の一部、1次キャッシュは2次キャッシュに入っているものの一部というように、上位のキャッシュの内容は下位のキャッシュの内容のサブセットというやり方が一般的である。この構成は上位キャッシュのデータは下位キャッシュに含まれることからInclusion Cacheと呼ばれる。これに対して、1次キャッシュの内容は必ずしも2次キャッシュに入っていない場合を許容するNon Inclusion(完全に排他の場合は、Exclusionとも呼ばれる)キャッシュも存在する。
1次キャッシュミスで2次キャッシュからデータを読み込んだ時点では、当然、2次キャッシュにも同じデータが存在するが、その後、何らかの理由で2次キャッシュからそのキャッシュラインが追い出される時に、1次キャッシュのデータもInvalid化するのがInclusion Cacheで、1次キャッシュのデータをそのまま残すのがNon Inclusion Cacheであり、下図の1次キャッシュのピンクの部分が2次キャッシュから外にはみ出る。ヒット率の点からは残しておいた方が良く、2次キャッシュに比べて1次キャッシュの容量が比較的大きい場合にNon Inclusion方式にするメリットが大きい。しかし、Non Inclusionにすると、1次キャッシュのデータをWrite Backする場合に新たに2次キャッシュのキャッシュラインを確保する必要があり、制御は複雑になる。また、コヒーレンス制御のためのスヌープについてInclusionの場合は最下位のキャッシュのタグアレイだけをスヌープすれば良いが、スヌープは全てのキャッシュの内容が対象となるので、 Non Inclusionの場合は全部の階層のタグアレイをスヌープする必要が出るなど、良いことばかりではない。
少し毛色の変わったキャッシュとしてVictim Cacheという方式がある。キャッシュは各インデックスにはway数だけの格納場所しかないので、これらが全部使われた状態で新たにそのインデックスの別アドレスのデータを読み込む必要が出ると、LRUなどでどれかのキャッシュラインを追い出して場所を空ける必要がある。このとき、追い出されるデータを犠牲者(Victim)と呼ぶ。このデータは場所が無いので止む無く追い出されるのであって、メモリに格納された他のデータより再度使われる確率が高いというのがVictim Cacheの基本的な考え方であり、上位のキャッシュを追い出されたキャッシュラインだけを格納する。
IBMのPOWER5プロセサはデュアルコアに約1.9MBの2次キャッシュを搭載する構成で、2次キャッシュをミスした場合は、Victim Cacheである36MBの3次キャッシュのタグアレイを引き、3次キャッシュにも入っていない場合は、当然、メモリにアクセスする。しかし、メモリからのデータは3次キャッシュを経由せず、直接、2次キャッシュに入る。そして、新たに2次キャッシュに入れるデータのために2次キャッシュから追い出されたデータが3次キャッシュに格納される。当然、3次キャッシュもこのデータを入れるために空きキャッシュラインを作る必要があり、3次キャッシュから追い出されたデータは、メモリの内容から変更されている場合にはメモリに書き戻される。
当然、IBMはシミュレーションなどを行って、3次キャッシュをVictim Cacheとするほうが通常の3次キャッシュとするより性能が出るということでこの構成を採用したと思われるが、筆者の知る限りでは、どの程度の性能メリットがあるのかについての論文などは発表されていない。
また、VIAのC7プロセサも64KBの1次命令キャッシュと64KBの1次データキャッシュから追い出されたVictimを保持する128KBのVictimキャッシュを持つ構成になっている。POWER5の場合は2次キャッシュの容量は3次キャッシュに比べてかなり小さいので、通常のInclusionのキャッシュとしても良いが、VIA C7の場合は合計128KBの1次キャッシュを128KBキャッシュの2次キャッシュでInclusionにすると1次キャッシュに入っているデータだけで2次キャッシュがいっぱいになり、2次キャッシュの意味が無くなってしまう。この点からもVictim Cacheとするのは妥当である。