コヒーレンシ
【英】cache coherency
コヒーレンシーとは、メインメモリとキャッシュメモリのデータにおける一貫性のことである。
コヒーレンシーは特にマルチプロセッサにおいて重要視される。通常、データがキャッシュメモリに上にあれば、そのキャッシュメモリから内容を読み取る。複数のプロセッサがデータを扱う場合に、メインメモリ上のデータとキャッシュメモリ上のデータに違いがあると、正しい処理が行われなくなってしまう。
コヒーレンシーを保つための技術はいくつかある。例としては、先にキャッシュメモリだけに書き込み、キャッシュから追い出されるときに、メインメモリに書き出すライトバック方式と、メモリ内容をキャッシュメモリとメインメモリに同時に書き込むライトスルー方式などを挙げることができる。なお、DMAコントローラによるメモリ転送のようなプロセッサとは独立したメモリ書き込みがあると、メインとキャッシュメモリ間での内容に不一致が発生する問題がある。この問題を回避するためには、メモリ転送をキャッシュ対象外のメモリに限定する、一時的にキャッシュを無効にする、あるいは監視によりメインメモリからキャッシュメモリにコピーすることで一貫性を取る機構が必要となる。
キャッシュコヒーレンシ
出典: フリー百科事典『ウィキペディア(Wikipedia)』 (2024/03/20 15:28 UTC 版)

キャッシュコヒーレンシ(英: cache coherency)とは、共有リソースに対する複数のキャッシュの一貫性を意味する。キャッシュコヒーレンシはメモリ一貫性の一種である。
複数のクライアントが共有メモリリソースのキャッシュを保持するとき、キャッシュ間のデータの不一致という問題が生じる。この問題は特にマルチプロセッシングシステムのCPU間で顕著である。右図において、上のクライアントがメモリのある部分を以前に読み込んでいてキャッシュ上にコピーを保持しているとき、下のクライアントが同じメモリ部分を更新すると、更新を何らかの方法で伝えない限り上のクライアントのキャッシュの内容は不正となる。キャッシュコヒーレンシはそのような状況に対処し、キャッシュとメモリの間の一貫性を保つことである。
定義
一貫性を保つには、同じメモリ位置へのリードとライトの振る舞いを定義する。キャッシュコヒーレンシは以下の条件に適合するよう行われる。
- プロセッサPが位置Xにライトし、同じプロセッサPがXをリードする。その間、他のプロセッサがリードやライトを行っていない場合、Xは常にPがライトした値を返す。これはプログラムの実行順序の保持とも関係し、単一処理アーキテクチャでも常に成り立つ。
- プロセッサP2が位置Xにライトし、その後プロセッサP1がXをリードしたら、その間他のプロセッサがXにライトしていないなら、Xは常にP2がライトした値を返す。これはメモリの一貫性を定義する条件である。P2がライトした後もプロセッサから古い値がリードされる場合、メモリの一貫性が保たれていないと言える。
- 同じ位置へのライトは逐次化される。つまり、Xという位置に対してAという値のライトとBという値のライトがそれぞれ別のプロセッサから発行されたとき、どのプロセッサから見てもライトの順序は一定でなければならず、最終的な値は後からライトした値でなければならない。
これらの条件はリードやライトが瞬間的に行われると仮定して定義している。しかし、実際のハードウェアではメモリレイテンシもあるし、その他アーキテクチャ上の制約によって瞬間的にリードやライトを実行することはできない。プロセッサXがライトを発行した直後にプロセッサYがリードを発行したとき、その間隔が短いとYにはXがライトした内容が見えない場合がある。メモリ一貫性モデルでは、ライトで書き込んだ値はその後の他のプロセッサからのリードで必ず取得できるようにしなければならない。
キャッシュコヒーレンシ機構
- ディレクトリベースの一貫性機構
- キャッシュブロック群を集中ディレクトリ管理する。
- バススヌーピング
- 個々のキャッシュ機構がアドレスバスを常に監視し、キャッシュ上にあるメモリ位置へのアクセスがないかを見ている。キャッシュ上にあるメモリ位置へのライトが観測されたら、キャッシュコントローラが自身のキャッシュ上のコピーを無効化する。
- スナーフィング (snarfing)
- キャッシュコントローラはバスのアドレスとデータ双方を監視し、自身のキャッシュ上のコピーのある位置が更新されたら、キャッシュの内容もそれに合わせて更新する。
分散共有メモリシステムはこれらの機構を疎結合システムに分散配置されたメモリ間でも擬似的に実現し、一貫性を保とうとする。
ディレクトリとスヌーピングはよく研究されていて、それぞれの利点と欠点がよく分かっている。スヌーピングは各ノードの帯域幅が十分大きければ性能がよい。しかし、スケーラビリティはよくない。全てのメモリアクセス要求を全体にブロードキャストしなければならないため、ノード数が増えるとバスの帯域幅もより大きくしなければならなくなる。一方ディレクトリはレイテンシが大きくなる傾向がある(ノードとメモリの間にディレクトリ機構があるため)が、ブロードキャストが不要であるため帯域幅は小さくてもよい。このため、64プロセッサ以上程度の大規模システムではディレクトリベースのキャッシュコヒーレンシを使うことが多い。
一貫性モデル
キャッシュコヒーレンシを保つための各種モデルやプロトコルが考案されてきた。以下に主なものを挙げる。
- MESIプロトコル(イリノイプロトコル)
- MSIプロトコル
- MOSIプロトコル
- MOESIプロトコル
- Write-onceプロトコル
- Synapse protocol
- Berkeley protocol
- Fireflyプロトコル
- Dragonプロトコル
一貫性モデルの選択はキャッシュコヒーレンシシステムの設計においては重要である。一貫性モデルには様々な性能とスケーラビリティのものがあり、個々のシステム毎にどれが最適かは異なる。
さらに、それぞれの実装でどのように状態遷移させるかも様々である。リードやライトで更新するのか無効化するのかによっても4種類の遷移の組合せが考えられる。状態遷移の選択によってキャッシュ間のトラフィック量が変わり、それが全体としての実際の帯域幅にも影響する。マルチプロセッサのキャッシュ間で頻繁に衝突が発生するようなソフトウェアでは、この点も考慮する必要がある。
関連項目
参考文献
- Handy, Jim. The Cache Memory Book. Academic Press, Inc., 1998. ISBN 0-12-322980-4
キャッシュコヒーレンシ (Cache Coherency)
出典: フリー百科事典『ウィキペディア(Wikipedia)』 (2020/11/05 14:09 UTC 版)
「キャッシュメモリ」の記事における「キャッシュコヒーレンシ (Cache Coherency)」の解説
詳細は「キャッシュコヒーレンシ」を参照 マルチCPU/キャッシュ構成など複数のバスマスタが存在し、各々がデータ更新を行った場合でも最新の正しいデータにアクセスできるよう保つべきデータの一貫性のことをキャッシュコヒーレンシもしくはキャッシュコンシステンシ (Cache Consistency) という。データ更新に上記ライトバック方式を用いた場合など、キャッシュに更新されたデータが滞留して主記憶装置など下位レベルのメモリには最新のデータが存在しない可能性がある。この時に複数のCPUが同一の記憶領域を参照/更新しようとすると、データの不整合が起こり正しい結果が得られないため、これを解決しどのCPUも必ず最新のデータにアクセスできるようにする必要がある。このための代表的なアルゴリズムにスヌープ方式やディレクトリ方式、共有キャッシュがある。 スヌープ方式 (Cache Snooping) 詳細は「バススヌーピング」を参照 キャッシュコヒーレンシのアルゴリズムにおいて、特に各キャッシュ自身に搭載される方法としてスヌープ方式(スヌープキャッシュ)がある。これは各々のキャッシュが自身や他CPUのキャッシュのライン更新状態を把握/管理し、他のキャッシュと更新状態の情報を交換することで、どのキャッシュに最新のデータが存在するかを知り、各キャッシュが必要なときに最新のデータを取得できるように自身の状態を変更したりラインのパージを行う。この情報交換は共通のデータバスを介して行われるため、情報の通知と実際のデータ転送との順序が保たれ、破綻を起こすことはない。逆に共通バスを持たない分散型メモリシステムには用いることが困難などの制約もある。このプロトコルとして下記のものが知られている。無効型プロトコル (Invalidate Protocol) 複数のキャッシュから参照があるアドレスに対しあるキャッシュが更新を行う場合、そのアドレスはダーティであるとして参照中の全キャッシュの該当ラインを無効化する。これにより更新されたラインがありながら他のキャッシュで古いデータをキャッシングしている状態がなくなり、コヒーレンシが保たれる。MESI(Illinoisプロトコル)、MOSI(Berkeleyプロトコル)などがある。 更新型プロトコル (Update Protocol) 複数のキャッシュが参照しているアドレスに対してデータ更新を行うときはライトスルー型となり、単独でアクセスしている場合はライトバック型となるような制御を行うことで更新データを行き渡らせコヒーレンシを保つ。MEI(Fireflyプロトコル)、MOES(DRAGONプロトコル)などがある。 ディレクトリ方式 (Directory-based Protocol) スヌープ方式と異なり、メモリの一貫性をディレクトリと呼ぶ専用領域にて一元管理する方式。この領域は実装上の各メモリ領域に分散してよく、分散メモリ型システムに適している。 共有キャッシュ (Shared Cache) 1つのキャッシュに対し複数のCPUが参照できるような構成を持つキャッシュ。1チップに集積された複数のCPUを扱うなど限定的な場面ではキャッシュコヒーレンシを根本的に解決するが、キャッシュ自体の構造が非常に複雑となる、もしくは性能低下要因となり、多くのCPUを接続することはより困難となる。
※この「キャッシュコヒーレンシ (Cache Coherency)」の解説は、「キャッシュメモリ」の解説の一部です。
「キャッシュコヒーレンシ (Cache Coherency)」を含む「キャッシュメモリ」の記事については、「キャッシュメモリ」の概要を参照ください。
固有名詞の分類
- キャッシュ・コヒーレンシのページへのリンク