

コンピュータアーキテクチャにおいて、キャッシュコヒーレンスとは、複数のローカルキャッシュに格納される共有リソースデータの一貫性を指します。キャッシュコヒーレンスが確保されたシステムでは、複数のクライアントが共有メモリリソースの同じ領域のキャッシュコピーを保持している場合、すべてのコピーは同じです。キャッシュコヒーレンスがないと、あるクライアントがその領域に加えた変更が他のクライアントには反映されず、異なるクライアント間でデータが一致しないとエラーが発生する可能性があります。[ 1 ]
キャッシュコヒーレンスプロトコルは、キャッシュの一貫性を維持するために使用されます。主な2つのタイプは、スヌーピングプロトコルとディレクトリベースプロトコルです。
キャッシュ コヒーレンスは、各CPU が共有メモリ リソースの独自のローカル キャッシュを持つ可能性が あるマルチプロセッシングシステムで特に重要です。

各プロセッサに個別のキャッシュメモリを備えた共有メモリ型マルチプロセッサシステムでは、共有データの複数のコピーを持つことが可能です。1つはメインメモリに、もう1つはデータを要求した各プロセッサのローカルキャッシュに保存されます。データのコピーの1つが変更されると、他のコピーにもその変更が反映されます。キャッシュコヒーレンスとは、共有オペランド(データ)の値の変更がシステム全体にタイムリーに伝播することを保証する仕組みです。[ 2 ]
キャッシュコヒーレンスの要件は以下のとおりである。[ 3 ]
理論的には、コヒーレンスはロード/ストア粒度で実行できます。しかし、実際にはキャッシュブロック粒度で実行されるのが一般的です。[ 4 ]
コヒーレンスは、単一のアドレス位置への読み取りと書き込みの動作を定義します。[ 3 ]
マルチプロセッサシステムでは、複数のプロセッサがメモリ位置Xのコピーをキャッシュしているものとする。キャッシュコヒーレンスを実現するには、以下の条件が必要である。[ 5 ]
上記の条件は、キャッシュコヒーレンスに必要な書き込み伝播の基準を満たしています。しかし、トランザクションのシリアル化の条件を満たしていないため、十分ではありません。これをよりわかりやすく説明するために、次の例を考えてみましょう。
マルチプロセッサ システムは 4 つのプロセッサ P1、P2、P3、P4 で構成され、すべてのプロセッサに初期値 0 の共有変数Sのキャッシュされたコピーが含まれています。プロセッサ P1 は、キャッシュされたコピー内のSの値を 10 に変更し、続いてプロセッサ P2 がキャッシュされたコピー内のSの値を 20 に変更します。書き込みの伝播のみを保証する場合、 P3 と P4 は、 P1 と P2 によるSの変更を確実に認識します。ただし、 P3 は、 P2 による変更を確認した後に P1 による変更を確認する可能性があり、その場合、Sの読み取りで 10 を返します。一方、 P4 は、 P1 と P2 による変更をその変更順に確認し、Sの読み取りで 20 を返します。これで、プロセッサ P3 と P4 は、メモリの一貫性のないビューを持つことになります。
したがって、トランザクションのシリアル化を満たし、キャッシュの一貫性を実現するには、このセクションで説明した前の 2 つの条件に加えて、次の条件も満たす必要があります。
コヒーレントシステムの別の定義は、シーケンシャルコンシステントメモリモデルの定義によるものである。「キャッシュコヒーレントシステムは、各スレッドのプログラム順序を尊重する完全な順序で、すべてのスレッドのロードとストアを単一のメモリ位置に対して実行するように見える必要がある」。[ 4 ]したがって、キャッシュコヒーレントシステムとシーケンシャルコンシステントシステムの唯一の違いは、定義で言及されているアドレス位置の数(キャッシュコヒーレントシステムの場合は単一のメモリ位置、シーケンシャルコンシステントシステムの場合はすべてのメモリ位置)である。
別の定義は、「同じメモリ位置へのすべての書き込みが一定の順序で実行される場合、マルチプロセッサはキャッシュ一貫性がある」というものである。[ 7 ]
稀ではありますが、特にアルゴリズムにおいては、コヒーレンスは参照の局所性を指すこともあります。同じデータの複数のコピーが異なるキャッシュに同時に存在する可能性があり、プロセッサが自身のコピーを自由に更新できる場合、メモリのビューに矛盾が生じる可能性があります。
一貫性を保証するための最も一般的な 2 つのメカニズムはスヌーピングとディレクトリ ベースであり、それぞれに利点と欠点があります。[ 8 ]スヌーピング ベースのプロトコルは、十分な帯域幅が利用できる場合は、すべてのトランザクションがすべてのプロセッサから参照される要求/応答であるため、高速になる傾向があります。欠点は、スヌーピングがスケーラブルではないことです。すべての要求をシステム内のすべてのノードにブロードキャストする必要があるため、システムが大きくなるにつれて、(論理または物理)バスのサイズとそれが提供する帯域幅を増やす必要があります。一方、ディレクトリは、レイテンシが長くなる傾向がありますが (3 ホップの要求/転送/応答の場合)、メッセージがポイント ツー ポイントでありブロードキャストされないため、使用する帯域幅ははるかに少なくなります。このため、大規模なシステム (>64 プロセッサ) の多くでは、このタイプのキャッシュ一貫性が使用されています。
分散共有メモリシステムはこれらのメカニズムを模倣して、疎結合システム内のメモリブロック間の一貫性を維持しようとします。[ 11 ]
コヒーレンス・プロトコルは、マルチプロセッサシステムにおいてキャッシュ・コヒーレンスを適用します。その目的は、2つのクライアントが同じ共有データに対して異なる値を見ることがないようにすることです。
プロトコルは、一貫性のための基本要件を実装する必要があります。対象システムまたはアプリケーションに合わせてカスタマイズできます。
プロトコルは、スヌーピー型とディレクトリベースに分類することもできます。初期のシステムでは、一般的にディレクトリベースのプロトコルが使用されていました。ディレクトリは共有されるデータと共有者を追跡していました。スヌーピー型プロトコルでは、トランザクション要求(読み取り、書き込み、またはアップグレード)がすべてのプロセッサに送信されます。すべてのプロセッサは要求をスヌープし、適切に応答します。
スヌーピー プロトコルでの書き込み伝播は、次のいずれかの方法で実装できます。
プロトコル設計において、共有データのいずれかのコピーが変更されるたびに、他のすべてのコピーをその変更を反映するために「更新」する必要があると規定されている場合、それは書き込み更新プロトコルです。一方、いずれかのプロセッサがキャッシュされたコピーに書き込むと、他のプロセッサはキャッシュされたコピーを破棄または無効化する必要があると規定されている場合、それは書き込み無効化プロトコルです。
ただし、スケーラビリティはブロードキャスト プロトコルの欠点の 1 つです。
コヒーレンスを維持するために、 MSI、MESI(別名イリノイ)、MOSI、MOESI、MERSI、MESIF、ライトワンス、Synapse、Berkeley、Firefly、Dragonプロトコルなど、さまざまなモデルとプロトコルが考案されています。[ 2 ] 2011年にARM社はSoCのコヒーレンス処理用にAMBA 4 ACE [ 12 ]を提案しました。ARM社のAMBA CHI(コヒーレントハブインターフェース)仕様[ 13 ]はAMBA5仕様グループに属し、完全にコヒーレントなプロセッサを接続するためのインターフェースを定義しています。