キャッシュスヌープとインクルージョン

前節で述べたように、CPUチップを複数使用したり、1チップでもマルチコアのシステムでは、プロセサのキャッシュ間のコヒーレンシを保つ必要があり、ストアを行う場合などには、他のすべてのプロセサに対して書き込みアドレスのデータがキャッシュに存在するかどうかをチェックするスヌープを行う。

図9.8に示すように、各チップがInclusionキャッシュの場合には、メインメモリに近い最下位のキャッシュのタグを見るだけで、上位のキャッシュも含めて、そのチップ内に問い合わせられたアドレスのデータが存在するかどうかを判定できる。しかし、Non InclusionやExclusionキャッシュの場合は、スヌープに対して最下位のキャッシュのタグをチェックするだけでは不十分で、上位のキャッシュのタグもチェックする必要がある。

図9.8 InclusionとNon Inclusionキャッシュのスヌープ範囲

このスヌープのためのタグアクセスであるが、同一チップ内のプロセサコアからの3次キャッシュのアクセスはサイクルあたり高々、数%程度の頻度であり、4コアチップ全体でも10%程度で、タグは90%の時間は他のチップからのスヌープアクセスを処理することが出来る。

しかし、Exclusionキャッシュで1次キャッシュをスヌープする必要がある場合は、状況が違ってくる。1次キャッシュは平均的に3命令に1回程度アクセスされるので、かなり忙しく、これに加えて他のチップからのスヌープアクセスを行おうとすると、両者がぶつかってコアからのアクセスが待たされて性能が低下してしまうという問題が発生する。また、マルチコアの場合は、各コアの1次(あるいは2次)キャッシュのタグをスヌープするために、それぞれのコアにスヌープアドレスを送るバスを張る必要がある。

この上位のキャッシュタグがビジーになる問題に対しては、上位キャッシュのタグを二重化して双方に同じデータを書き込み、タグの読み出しに関しては、一方のタグをコアからのロードストア命令でのアクセスに使用し、もう一方のタグを他のプロセサからのスヌープアクセスに使用するデュプリケートタグという方式がある。

また、最下位のキャッシュはデータとしてはInclusionではないが、タグは上位のキャッシュの分も含んだInclusionとするという方法も考えられるが、いずれにしても、Non Inclusionキャッシュでは、Inclusionキャッシュと比較するとタグの構造や制御が複雑になる。

なお、スヌープの回数はキャッシュコヒーレンシを維持するコア数に比例するので、32コア以上の大規模なシステムになると、Inclusionキャッシュであっても最下位キャッシュのタグへのアクセスの頻度が高くなり、スヌープが性能を制約するようになる。このため、大規模サーバ用のプロセサではInclusionキャッシュであってもデュプリケートタグが設けられる。