1. ホーム
  2. caching

[解決済み] コンフリクトミスとキャパシティミスの違いについて

2022-02-16 12:36:36

質問内容

キャッシュがプログラム実行に必要なすべてのブロックを含むことができないため、ブロックがキャッシュから廃棄され、容量不足が発生します(プログラムのワーキングセットがキャッシュ容量よりはるかに大きい)。

コンフリクトミスは、セットアソシアティブまたはダイレクトマップドブロック配置ストラテジーの場合、複数のブロックが同じセットまたはブロックフレームにマップされたときに発生します。

実はとても密接な関係があるのでしょうか?

例えば、キャッシュラインがすべて埋まっている状態で、メモリBに対する読み出し要求があり、そのためにメモリAを退避させなければならない場合です。

では、容量が足りないので、容量ミスと考えるべきなのでしょうか?また、後でメモリAにアクセスしたい場合、前に退避させたので、コンフリクトミスとみなされます。

私の理解は正しいでしょうか?ありがとうございます。

どのように解決するのですか?

ここで重要なのは、データセットのサイズに起因するキャッシュミスと、キャッシュとデータアライメントの編成方法に起因するキャッシュミスを区別することです。

32kのダイレクトマップキャッシュがあると仮定して、次の2つのケースを考えてみます。

  1. 128kの配列に対して繰り返し反復処理を行う。データはキャッシュに収まりきらないので、ミスはすべて容量になります(各行の最初のアクセスは強制ミスで、キャッシュを無限に増やせたとしても残ります)。

  2. 8kの小さなアレイが2つありますが、残念ながら両方ともアラインされており、同じセットにマッピングされています。つまり、理論的にはキャッシュに収まるのですが(アライメントを修正すれば)、キャッシュのサイズをフルに活用できず、代わりに同じグループのセットを奪い合い、互いに衝突してしまうのです。データは収まるはずなのに、編成の関係で衝突してしまうので、これらはコンフリクトミスとなります。同じ問題はセット連想キャッシュでも発生しますが、頻度は低くなります(キャッシュが2ウェイで、4つのアライメントされたデータセットがあるとします......)。

この2つのタイプは確かに関連しており、高レベルの連想性、セットの傾き、適切なデータのアライメント、その他のテクニックを使えば、競合を減らすことができ、ほとんどが避けられない真のキャパシティミスになってしまうとも言えます。