キャッシュの一貫性

キャッシュの一貫性

参考

キャッシュ コヒーレンス - ウィキペディア

バスの覗き見 - ウィキペディア

ディレクトリベースのキャッシュ一貫性 - ウィキペディア

キャッシュ コヒーレンシ プロトコル (例) - ウィキペディア

キャッシュ コヒーレンス - 概要 | ScienceDirect トピックス

概要

プロセッサごとに個別のキャッシュ メモリを備えた共有メモリマルチプロセッサ システムでは  、共有データのコピーを多数保持することができます。1 つのコピーはメイン メモリに、もう 1 つはデータを要求した各プロセッサのローカル キャッシュにあります。データのコピーの 1 つが変更された場合、他のコピーもその変更を反映する必要があります。キャッシュ コヒーレンスは、共有オペランド (データ) の値の変更がシステム全体にタイムリーに伝播されることを保証する規律です。[1]

キャッシュ コヒーレンスの要件は次のとおりです: [2]

書き込み伝播

キャッシュ内のデータに対する変更は、ピア キャッシュ内の (そのキャッシュ ラインの) 他のコピーに伝播する必要があります。

共有可能なメモリ割り当ての場合、コアがそれを変更すると、すべてのコア/リクエスタがこの変更を確認する必要があります。

トランザクションのシリアル化

単一のメモリ位置への読み取り/書き込みは、すべてのプロセッサによって同じ順序で認識される必要があります。

同じ共有メモリ位置の読み取りと書き込みの場合、すべてのコアから見た読み取りと書き込みの順序は同じです。書き込み後に読み出す場合、最後に書き込まれたデータが読み取られます。

次の段落では、書き込み伝播について説明します。

マルチプロセッサ システムでは、複数のプロセッサがメモリ位置 X のコピーをキャッシュしていると考えてください。キャッシュ コヒーレンスを達成するには、次の条件が必要です。[4]

  1. 同じプロセッサ P による X への書き込みに続く、プロセッサ P による位置 X への読み取りでは、P による書き込み命令と読み取り命令の間に別のプロセッサによる X への書き込みが発生しない場合、X は常に値を返さなければなりませんP によって書かれました。
  2. 別のプロセッサ P2 による X への書き込みに続く、プロセッサ P1 による位置 X への読み取りでは、2 つのアクセスの間にプロセッサによる X への他の書き込みが発生せず、読み取りと書き込みが十分に分離されている場合、X は常にP2 によって書き込まれた値を返します。この条件は、記憶の一貫したビューの概念を定義します。書き込みを共有メモリの場所に伝播することで、すべてのキャッシュがメモリの一貫したビューを持つことが保証されます。プロセッサ P2 による書き込み後であっても、プロセッサ P1 が X の古い値を読み取る場合、メモリはインコヒーレントであると言えます。

一貫性は一貫性の前提です。説明は次のとおりです。

したがって、トランザクションのシリアル化を満たし、キャッシュ コヒーレンスを実現するには、このセクションで説明した前の 2 つの条件に加えて、次の条件を満たす必要があります。

  • 同じ場所への書き込みは順序付けする必要があります。言い換えれば、位置 X が 2 つの異なる値 A と B をこの順序で 2 つのプロセッサから受信した場合、プロセッサは位置 X を B として読み取ってから A として読み取ることはできません。位置 X は値 A と値で認識される必要があります。 Bの順です。[

コヒーレンスメカニズム

一貫性を確保するための最も一般的な 2 つのメカニズムはスヌーピング と ディレクトリベースでありそれぞれに独自の利点と欠点があります。十分な帯域幅がある場合、スヌーピング ベースのプロトコルは高速になる傾向があります。   すべてのトランザクションはすべてのプロセッサによって認識される要求/応答であるため、使用できます。欠点は、スヌーピングがスケーラブルではないことです。すべてのリクエストはシステム内のすべてのノードにブロードキャストされる必要があります。つまり、システムが大きくなるにつれて、(論理または物理) バスのサイズとバスが提供する帯域幅も拡大する必要があります。一方、ディレクトリは (3 ホップの要求/転送/応答で) 待ち時間が長くなる傾向がありますが、メッセージはポイントツーポイントでありブロードキャストではないため、使用する帯域幅ははるかに少なくなります。このため、大規模システム (プロセッサ数が 64 を超える) の多くは、このタイプのキャッシュ コヒーレンスを使用します。

スヌーピング[編集] バススヌーピング - ウィキペディア

詳細は 「バスの覗き見」  

1983 年に初めて導入された[7]スヌーピングは、個々のキャッシュがキャッシュしたメモリ位置へのアクセスのアドレス ラインを監視する プロセスです[4] 書き込み 無効化プロトコル と 書き込み更新プロトコルは このメカニズムを利用します。

スヌーピング メカニズムの場合、スヌープ フィルタは、それぞれが 1 つ以上のノードが所有するキャッシュ ラインを表す複数のエントリを維持することにより、スヌーピング トラフィックを削減します。エントリの 1 つの置換が必要な場合、スヌープ フィルタは、各エントリの存在ベクトルから決定されるように、最も少ないノードが所有するキャッシュ ラインを表すエントリを置換対象として選択します。複数のキャッシュ ラインが最も少ないノードによって所有されている場合は、時間的アルゴリズムまたは他のタイプのアルゴリズムを使用して選択を絞り込みます。[8]

スヌーピングプロトコルの種類[編集]

書き込み操作のローカル コピーを管理する方法に応じて、2 種類のスヌーピング プロトコルがあります。

書き込み無効化[編集]

プロセッサが共有キャッシュ ブロックに書き込むと、他のキャッシュ内のすべての共有コピーが  バス スヌーピングによって無効になります。この方法により、プロセッサはデータのコピーを 1 つだけ排他的に読み書きできるようになります。他のキャッシュ内の他のコピーはすべて無効になります。これは最も一般的に使用されるスヌーピング プロトコルです。 MSI 、  MESI 、  MOSI 、  MOESI 、および MESIF プロトコルがこのカテゴリに属します。

書き込み-更新[編集]

プロセッサが共有キャッシュ ブロックに書き込むと、他のキャッシュのすべての共有コピーがバス スヌーピングを通じて更新されます。このメソッドは、書き込みデータをバス全体のすべてのキャッシュにブロードキャストします。write-invalidate プロトコルよりも大きなバス トラフィックが発生します。このため、この方法は一般的ではありません。 Dragonプロトコル と Firefly プロトコルはこのカテゴリに属します。[3]

ディレクトリベース[編集]

詳細は 「ディレクトリベースのキャッシュコヒーレンス」を参照

ディレクトリベースのシステムでは、共有されるデータは、キャッシュ間の一貫性を維持する共通のディレクトリに配置されますディレクトリは、プロセッサがプライマリ メモリからキャッシュにエントリをロードするための許可を求める必要があるフィルタとして機能しますエントリが変更されると、ディレクトリはそのエントリを含む他のキャッシュを更新または無効化します。

スヌープ フィルタは、スヌーパーがキャッシュ タグをチェックする必要があるかどうかを決定しますスヌープ フィルタはディレクトリ ベースの構造であり、キャッシュ ブロックのコヒーレンシ状態を追跡するためにすべてのコヒーレント トラフィックを監視します。これは、スヌープ フィルターがキャッシュ ブロックのコピーを持つキャッシュを認識していることを意味します。したがって、キャッシュ ブロックのコピーを持たないキャッシュによる不必要なスヌーピングを防ぐことができます。スヌープ フィルターの位置に応じて 3 種類のフィルターがあります。1 つは、キャッシュ側に配置され、コヒーレンス トラフィックが共有バスに到達する前にフィルタリングを実行するソース フィルターです。もう 1 つは、受信側キャッシュに配置され、受信側コアでの不必要なキャッシュ タグ ルックアップを防止する宛先フィルタですが、このタイプのフィルタリングでは送信元からの最初のコヒーレンス メッセージを防止できません。最後に、ネットワーク内フィルターは、共有バス内のコヒーレンス トラフィックを動的にプルーニングします。[5] スヌープ フィルタは、包括的フィルタと排他的フィルタにも分類されます。包括的なスヌープ フィルターは、キャッシュ内のキャッシュ ブロックの存在を追跡します。ただし、排他的スヌープ フィルターは、キャッシュ内にキャッシュ ブロックが存在しないことを監視します。換言すれば、包括的スヌープフィルタのヒットは、対応するキャッシュブロックがキャッシュに保持されていることを意味する。一方、排他的スヌープ フィルタでのヒットは、要求されたキャッシュ ブロックを持つキャッシュが存在しないことを意味します。
 

結論は

キャッシュの一貫性とは、すべてのコアで認識されるデータが一貫していることを意味します。これには 2 つの側面があります: 1) 1 つのコアによって書き込まれたデータは他のコアからも認識される必要がある; 2) すべてのコアから認識される読み取りと書き込みの順序は同じです。

2 つの実装メカニズムがあります: 1) スヌープ、2) ディレクトリ ベース (スヌープ フィルター)実際、それらはすべてスヌープですが、後者はスヌープをフィルタリングします。

スヌープには 2 つのタイプがあります: 1) 無効な書き込み、2) 書き込み更新。前者は比較的単純で、よく使用されます。

おすすめ

転載: blog.csdn.net/m0_38037810/article/details/126448686