ビクティムキャッシュ

プロセサのサイクルタイムとメモリのアクセス時間の差が開くにつれ、1階層のキャッシュメモリではその差を埋めきれず、最近のプロセサでは、2階層、3階層のキャッシュが用いられるのが普通である。

伝統的なキャッシュの考え方は、プロセサコアからのメモリアクセス要求に対しては1次キャッシュをチェックし、1次キャッシュをミスした場合には、2次キャッシュ、さらに2次キャッシュをミスしたら3次キャッシュをチェックし、3次キャッシュがミスした場合には、メモリにアクセスするというものである。そして、メモリから読まれたデータは、まず、3次キャッシュに格納し、それを2次キャッシュ、1次キャッシュへと送り、最後にプロセサコアにデータが渡されるという動作をする。

これに対して、キャッシュの捜索は、1次、2次、3次と順にチェックする点は同じであるが、3次キャッシュをミスしてメモリから読み込んだデータは、3次、2次のキャッシュをすっ飛ばして、直接、1次キャッシュに送るという方式がある。この時、2次キャッシュには何を書き込むかというと、1次キャッシュへの新たなデータの書き込みで1次キャッシュを追い出されるデータを書き込む。この方式は、1次キャッシュを追い出された犠牲者を2次キャッシュに収容することから、victim cache(ビクティムキャッシュ:victimは犠牲者の意)と呼ばれる。そして3次キャッシュを持つビクティムキャッシュでは、3次キャッシュには2次キャッシュを追い出された犠牲者を書き込む。これを図示すると図8.4のようになる。

図8.4 3階層の通常キャッシュとビクティムキャッシュ

ビクティムキャッシュの場合、メモリからのデータは2次、3次キャッシュを飛ばして直接1次キャッシュに送られるので、多少、アクセス時間の点で有利である。

なお、前述の伝統的なキャッシュでは、最初にメモリから読み込む時に、2次、3次キャッシュにも格納済みであるので、上位のキャッシュを追い出されるキャッシュラインのデータは、データが書き換えられていなければ下位のキャッシュに書き込む必要はない。一方、ビクティムキャッシュの場合は、上位のキャッシュを追い出された時点で下位のキャッシュに書き込みを行う必要がある。

伝統的なキャッシュでは、1次キャッシュに格納されているデータは2次キャッシュにも存在し、2次キャッシュに格納されているデータは3次キャッシュにも存在するということになる。このようにプロセサコアに近い上位のキャッシュの内容は必ず、下位のキャッシュに含まれるという関係が存在するキャッシュをインクルージョン キャッシュ(Inclusion Cache)と言う。インクルージョンキャッシュでは、1次キャッシュの内容は2次キャッシュに、2次キャッシュの内容は3次キャッシュにも存在することになり、同じデータが複数レベルのキャッシュエントリを使ってしまうという無駄が生じる。

一方、ビクティムキャッシュは、上位のキャッシュに存在するデータが、必ずしも下位のキャッシュに存在しないという方式であり、特に、下位のキャッシュの容量が上位のキャッシュの容量に比べてあまり大きくない場合には有効である。AMDの初期のOpteronやVIAのC6プロセサは、下位のキャッシュの容量が小さいので、ビクティムキャッシュを採用していると考えられる。

このL1キャッシュの内容はL2キャッシュに含まれ、L2キャッシュの内容はL3キャッシュに含まれるという関係が成り立つインクルージョンキャッシュに対して、ビクティムキャッシュのようにL1~L3キャッシュの包含関係が成立しないキャッシュをNon Inclusion Cacheと言う。この関係を図8.5に示す。また、L1~L3キャッシュの内容に共通なデータがまったく存在しないNon Inclusion CacheをExclusion Cacheと呼ぶ。

図8.5 Inclusion CacheとNon Inclusion Cacheの包含関係

なお、AMDのOpteronプロセサでは、L1キャッシュをミスしてL2キャッシュにヒットすると、L2キャッシュのデータはL1キャッシュに転送されL2キャッシュから削除されるので、L1キャッシュのデータとL2キャッシュのデータは共通点がない。一方、L3キャッシュは複数のコアで共有されているので、L3キャッシュがヒットして1つのコアのL2キャッシュにデータを転送しても、その後に他のコアも同じデータを必要とする場合があるので、このデータをL3キャッシュから削除するのが良いとは限らない。このため、Opteronでは、L3キャッシュにヒットした場合、そのデータをL3キャッシュに残すか消すかを選択することが可能になっている。図8.5は、L3キャッシュに残すを選択した場合の図である。また、L3キャッシュから消すを選択すると、L1~L3キャッシュに共通のデータが無いExclusion Cacheとなる。

一般的には、伝統的なInclusion Cacheを用いるプロセサが多いが、 前述のようにAMDのOpteronやVIAのC6プロセサはNon Inclusion Cacheとなっている。また、IBMのPOWER6プロセサは、1次キャッシュと2次キャッシュの関係は伝統的なInclusionであるが、3次キャッシュは2次キャッシュを追い出されたデータを格納するビクティムキャッシュという混合型である。