ビクティムキャッシュとは、 CPUキャッシュのリフィルパスに配置される、通常は完全連想型の小型キャッシュのことです。このキャッシュは、そのレベルのキャッシュから追い出されたすべてのブロックを格納し、1990年に初めて提案されました。現代のアーキテクチャでは、この機能は通常、レベル3またはレベル4キャッシュによって実行されます。
ビクティムキャッシングは、ノーマン・ジョウピによって提案されたキャッシュのパフォーマンスを向上させるためのハードウェア技術です。彼の論文[ 1 ]で述べられているように、
ミスキャッシングは、キャッシュとその再充填パスの間に完全連想キャッシュを配置します。ミスキャッシュでヒットしたキャッシュミスは、ミスキャッシュがない場合の複数サイクルのミスペナルティとは異なり、1サイクルのペナルティで済みます。ビクティムキャッシングは、ミスキャッシングの改良版で、要求されたキャッシュラインではなく、ミスのビクティムを小さな完全連想キャッシュにロードします。[ 1 ]
ビクティムキャッシュは、ダイレクトマップキャッシュの競合ミスを減らし、ヒットレイテンシを向上させるために設計されたハードウェアキャッシュです。レベル1キャッシュのリフィルパスで使用され、キャッシュから追い出されたキャッシュラインはビクティムキャッシュにキャッシュされます。そのため、ビクティムキャッシュはレベル1キャッシュからデータが追い出されたときにのみデータが格納されます。レベル1キャッシュでミスが発生すると、ビクティムキャッシュで該当エントリがチェックされます。アクセスがヒットした場合、レベル1キャッシュラインの内容と対応するビクティムキャッシュラインの内容が交換されます。
Jouppi が当初、直接マップされたレベル 1 キャッシュの性能を向上させるために提案したものの、現代のマルチレベルキャッシュ階層を持つマイクロプロセッサは、メモリ階層で上位にあるキャッシュのビクティム キャッシュとして機能するレベル 3 またはレベル 4 キャッシュを採用しています。 Intel のHaswell プロセッサのCrystal Well [ 2 ]では、プロセッサのレベル 3 キャッシュのビクティム キャッシュとして機能するオン パッケージ レベル 4 キャッシュが導入されました。[ 3 ] POWER5 (IBM) マイクロプロセッサでは、 4~12 MB のレベル 3 キャッシュがビクティム キャッシュとして使用されています。
ハードウェアアーキテクチャと技術の進歩に伴い、プロセッサの性能と周波数はメモリのサイクルタイムよりもはるかに速いペースで向上し、大きな性能差が生じました。プロセッサ速度に比べてメモリのレイテンシが上昇するという課題は、高速キャッシュメモリの導入によって解決されました。
ダイレクトマップキャッシュは、セットアソシアティブキャッシュよりもアクセス時間が速い。しかし、ダイレクトマップキャッシュでは、メモリ内の複数のキャッシュブロックが同じキャッシュラインにマップされると、いずれかのブロックがアクセスされるたびに、他のブロックが追い出されてしまう。この問題はキャッシュ競合問題として知られており、キャッシュのアソシアティビティが限られているために発生する。キャッシュのアソシアティビティを増やすことでこの問題を軽減できるが、実装上の複雑さや、アソシアティビティをどれだけ増やせるかという制限がある。キャッシュのアソシアティビティが限られているという制約の中でキャッシュ競合問題に対処するために、ビクティムキャッシュがよく用いられる。
被害者キャッシュが対応するレベルキャッシュと相互作用する際の動作は以下のとおりです。
キャッシュヒット:アクションなし
キャッシュミス、ビクティムヒット:ブロックがビクティムキャッシュに存在する場合、キャッシュ内のブロックは互いに置き換えられます。ビクティムキャッシュ内のこの新しいエントリが、最も最近使用されたブロックになります。

キャッシュミス、ビクティムミス:ブロックは次のレベルからキャッシュに取り込まれます。キャッシュから追い出されたブロックはビクティムキャッシュに格納されます。
ブロックAとBが同じセットを指すダイレクトマップL1キャッシュを考えます。このキャッシュは、ブロックCとDを含む2エントリの完全連想型ビクティムキャッシュにリンクされています。
追跡すべき経路:A、B、A、B...
図からわかるように、ビクティムキャッシュ(VC)ヒットの場合、ブロックAとBが入れ替わります。VCの中で最も使用頻度の低いブロックはそのまま残ります。そのため、ダイレクトマップL1キャッシュに連想性があるように見せかけることができ、結果としてコンフリクトミスが減少します。
排他的キャッシュポリシー(L2がL1と同じメモリ位置をキャッシュしない)を持つ2つのキャッシュL1とL2の場合、L2はL1のビクティムキャッシュとして機能します。
Jouppi [ 1 ]は、ビクティム キャッシュを使用してパフォーマンスの改善を測定する際に、レベル 1 の直接マップ キャッシュに完全連想キャッシュを追加したものを想定しました。彼が使用したテスト スイートでは、レベル 1 データ キャッシュ ミスの平均 39% がコンフリクト ミスであることが判明し、レベル 1 命令ミスの平均 29% がコンフリクト ミスであることが判明しました。[ 1 ]コンフリクト ミスは全ミスの大部分を占めるため、レベル 1 キャッシュにビクティム キャッシュを追加して追加の連想性を提供することで、全ミス率を大幅に改善できるはずです。
実験結果は、256 ブロック (8 KB) のビクティム キャッシュで拡張された 32 Kb のダイレクト マップ、2 ウェイ、完全連想キャッシュを考慮し、ランダムに選択された 8 つのSPEC 95 ベンチマークを 実行することによって導き出されます。 [ 4 ]結果はすべてのベンチマークに一般化することはできませんが、ビクティム キャッシュを追加すると、すべてのキャッシュ構成で 10% から 100% のミス率削減が実現します。[ 4 ]ただし、ビクティム キャッシュのサイズが 50 ブロックを超えるとリターンは横ばいになるようで、ビクティム キャッシュの利点は最初の数個のビクティム ブロックの後でプラトーに達するという Jouppi の観察[ 1 ]を証明しています。 [ 4 ]
64 KB のキャッシュサイズではミス率の削減が著しく低いことが判明し、ビクティム キャッシングは無限に拡張できるものではないことが証明された。[ 4 ]
さまざまなキャッシュ構成を比較したところ、場合によっては、小さなビクティムキャッシュを追加すると、キャッシュサイズを2倍にした場合と同等のパフォーマンス上の利点が得られることがわかりました。[ 4 ]