スヌープフィルタ
スヌープを使用するキャッシュコヒーレンス機構は、各プロセサが他の全プロセサにスヌープを送るので、プロセサ数の2乗に比例してスヌープ回数が増加する。このため、Sunfireのように、最終レベルのキャッシュのタグを二重化して、一方をチップ内の上位のキャッシュミス用、他方を他のプロセサからのスヌープ用として使うデュプリケートタグという方式が用いられたと述べたが、別の手法としてスヌープフィルタという方法がある。
あるプロセサがそのアドレスのデータをキャッシュしていないことが分かっている場合は、当然、キャッシュに対してスヌープを行う必要はない。このため、図9.12に示すように外部からのスヌープを見て、そのアドレスのデータを持っていないことが確実である場合にはスヌープ要求をフィルタして除いてしまい、キャッシュに送らないというのがスヌープフィルタの考え方である。
ここで問題になるのは、どのようにしてスヌープ要求のアドレスのデータがキャッシュにあるかどうかをチェックするかで、キャッシュに入っているデータの全アドレスを持つデュプリケートタグによるチェックは、スヌープフィルタの1つの方法であるという見方もできる。
しかし、タグとスヌープフィルタには違いがあり、タグはキャッシュに入っている情報のアドレスと属性を完璧に把握している必要があるが、スヌープフィルタは、キャッシュに入っているアドレスへのスヌープを見逃してはいけないが、キャッシュに入っていないアドレスへのスヌープを完璧にブロックする必要はなく、大部分をブロックすることが出来ればOKという点が異なる。この違いを利用して、スヌープフィルタのテーブルはデュプリケートタグよりも簡素化することが可能である。
スヌープフィルタは、大別して、IncludeフィルタとExcludeフィルタという方式がある。Excludeフィルタは、他のプロセサからのスヌープによりインバリデートされたキャッシュラインアドレスを記憶する小容量のキャッシュを持ち、このキャッシュにヒットした場合は、そのアドレスのデータはキャッシュに存在しないことが確実であるので、スヌープ要求をブロックする。図9.13にダイレクトマップのExclusionテーブルの例を示す。ここでは図を簡単にするためにダイレクトマップとしたが、2~4wayのセットアソシアティブ構成にして重なりを減らすという手もある。
もちろん、最近、インバリデートされていなくてもキャッシュに入っていないというアドレスもあるが、Excludeフィルタではそれは除去できずにスヌープを行ってしまう。しかし、このスヌープでキャッシュタグを引いて存在しないことが確認されれば、そのアドレスはExcludeフィルタに登録されるので、次回からは除去することができるようになる。
そして、そのプロセサのキャッシュにデータが存在するアドレスがExclusionテーブルに存在してはならないので、そのプロセサのメモリアクセスがキャッシュをミスして新たなキャッシュラインを取得した場合は、そのアドレスをテーブルから除去する必要がある。
なお、Excludeフィルタの場合は、1つのキャッシュラインに1つのエントリを対応させるのが基本的な考え方であるが、キャッシュラインのアクセスには空間的局所性がある場合が多く、エントリにビットマップを付加して複数の連続したアドレスのキャッシュラインをカバーするという方法もある。次の図9.14に示すように、タグがヒットし、かつ、中位アドレスで指定されるビットマップの当該ビットが"1"の場合がヒットであり、スヌープ要求が除去される。