キャッシュにはプログラムの実行に必要なすべてのブロックを含めることができないため、ブロックがキャッシュから破棄されているため、キャパシティミスが発生します(プログラムワーキングセットはキャッシュ容量よりもはるかに大きい)。
セットアソシアティブまたは直接マップされたブロック配置戦略の場合、競合ミスが発生します。複数のブロックが同じセットまたはブロックフレームにマップされると、競合ミスが発生します。コリジョンミスまたは干渉ミスとも呼ばれます。
実際、それらは非常に密接に関連していますか?
たとえば、すべてのキャッシュラインがいっぱいになり、メモリBの読み取り要求がある場合、メモリAを削除する必要があります。
十分なスペースがないので、キャパシティミスと見なすべきですか?後でメモリAにアクセスしたい場合は、以前に削除されているため、競合ミスと見なされます。
これを正しく理解していますか?ありがとう
ここで重要な違いは、データセットのサイズに起因するキャッシュミスと、キャッシュとデータの配置の編成に起因するキャッシュミスの違いです。
32kの直接マップされたキャッシュがあると仮定して、次の2つのケースを考えてみましょう。
128k配列を繰り返し反復します。データがそのキャッシュに収まる方法はないため、すべてのミスはキャパシティ1です(強制ミスである各行の最初のアクセスを除き、キャッシュを無限に増やすことができても残ります)。
2つの小さな8kアレイがありますが、残念ながら、それらは両方とも同じセットに位置合わせされマップされます。つまり、理論的にはキャッシュに収まりますが(アライメントを修正した場合)、完全なキャッシュサイズを利用せず、代わりに同じセットのグループを競い合い、お互いをスラッシングします。データは適合する可能性がありますが、組織が原因で衝突するため、これらは競合ミスです。同じ問題は、セットアソシエイティブキャッシュでも発生する可能性がありますが、それほど頻繁ではありません(キャッシュは2ウェイですが、4つのアライメントされたデータセットがあるとしましょう...)。
2つのタイプは確かに関連しており、高いレベルの関連性、セットスキュー、適切なデータアライメントおよびその他の手法を考えると、避けられない本当のキャパシティミスがほとんど残るまで、競合を減らすことができます。
強制ミスと容量ミスの削減による競合ミスの私のお気に入りの定義:Norman P. Jouppi:
競合ミスは、キャッシュがLRU置換と完全に関連している場合には発生しないミスです。
例を見てみましょう。サイズ4のダイレクトマップキャッシュがあります。アクセスシーケンスは次のとおりです。
0(compulsory miss), 1(compulsory miss), 2(compulsory miss), 3(compulsory miss), 4(compulsory miss), 1(hit), 2(hit), 3(hit), 0(capacity miss), 4(capacity miss), 0(conflict miss)
キャッシュがLRUキャッシュと完全に関連付けられていたとしても、最後の0より前に4,1,2,3にアクセスするため、最後の0から2番目はキャパシティミスです。ただし、最後の0は競合ミスです。完全連想キャッシュでは、最後の4つが0の代わりにキャッシュ内の1を置き換えます。
強制ミス:メインメモリのブロックがキャッシュの新しい空行を占有しようとしているときに、キャッシュに取り込む必要のあるメモリブロックへの最初のアクセスを強制ミスと呼びます。
コンフリクトミス:キャッシュに空の行がまだある場合、メインメモリのブロックは既に満たされているキャッシュの行と競合しています。塗りつぶされた行。呼ばれる競合ミス。
Capacity miss:キャッシュのすべての行がいっぱいになったときにミスが発生しました。
競合ミスは、直接マップされたキャッシュとセットアソシエイティブキャッシュでのみ発生します。連想マッピングでは、メインメモリのブロックがすでに埋められた行を占有しようとしないためです。