キャッシュの整合性
マルチプロセッサーの設計において、技術者は、キャッシュの整合性を確保することに、相当な注意を払います。 成功しても、キャッシュの整合性にはパフォーマンス・コストがかかります。
取り組むべき問題を理解する必要があります。
各プロセッサーがメモリーのさまざまな部分の状態を反映するキャッシュを 1 つずつ備えている場合、 複数のキャッシュが同じ線のコピーを持っている可能性があります。 また、所定の線に複数のロック可能データ項目が含まれている可能性もあります。 2 つのスレッドがそれらのデータ項目に、適切にシリアライズされた変更を加えた場合、 結果として、両方のキャッシュに別々の、誤ったバージョンのメモリーの線が含まれることになる場合があります。 言い換えれば、メモリーの特定領域の内容と思われているものについて、 システムに 2 つの異なるバージョンが含まれているため、システムの状態にもう整合性はありません。
キャッシュの整合性の問題は、通常、行が変更された場合、重複する行の 1 つを除くすべてを 無効にすることによって解決できます。 ハードウェアは、線を無効にする際、ソフトウェアの介入なしにスヌープ・ロジックを使用しますが、 キャッシュ線を無効にされたどのプロセッサーも、次にその線がアドレスされると、 キャッシュ・ミスとそれに伴う遅延を生じます。
スヌープ とは、キャッシュの整合性の問題を解決するために使用されるロジックのことです。 プロセッサーのスヌープ・ロジックは、そのキャッシュ内のワードが変更されるたびに、 バスを通じてメッセージをブロードキャストします。 また、スヌープ・ロジックは、他のプロセッサーからのこの種のメッセージを探して、バス上をスヌープします。
プロセッサーが、その専用キャッシュに存在するアドレスの値を別のプロセッサーが変更したことを検出すると、 スヌープ・ロジックは、そのキャッシュ内のエントリーを無効にします。 これは相互無効化 (cross invalidate) と呼ばれます。 相互無効化によって、プロセッサーは、キャッシュ内の値が無効であることと、 どこか別の場所 (メモリーまたはその他のキャッシュ) で正しい値を探す必要があることを認識します。 相互無効化によってキャッシュ・ミスが増え、さらにスヌープ・プロトコルによるバス・トラフィックが加わるため、 キャッシュの整合性の問題を解決すると、すべての SMP のパフォーマンスおよびスケーラビリティーは低下します。