【キャッシュコヒーレンス】

キャッシュコヒーレンス とは?

公開:
💡 手元のメモが食い違わないよう、CPU同士で調整する

複数のCPUコアなどが持つキャッシュで、同じメモリ位置の読み書きに食い違いが生じないよう調整する仕組み。異なる位置の読み書きの順序保証とは別の概念。

📌 このページのポイント
書き込み時に、他方の古いコピーを無効化 ① 読み取りのコピー ② コア1が x = 2 を書く コア1:x = 1 コア1:x = 2 コア2:x = 1 コア2:コピーは無効 コア2が次に読むときは、有効な値を取得 異なる変数の順序保証・排他制御は別の話
無効化方式の簡略例。キャッシュが常に同じ値を保持するという意味ではない。
ひよこ ひよこ
CPUのキャッシュは、それぞれ好きに保存していいの?
ペンギン先生 ペンギン先生
読み取り用のコピーを複数のコアが持つことはあるよ。でも同じ場所を片方が書き換えたあとも、もう片方が古いコピーを使い続けたら困るよね。その整合性を調整する仕組みがキャッシュコヒーレンスなんだ。
ひよこ ひよこ
書き換えた値を全部のキャッシュへ送るの?
ペンギン先生 ペンギン先生
そうとは限らないよ。無効化方式なら、コア1が書き込み権限を得る際に、ほかのコアが持つ同じキャッシュラインのコピーを無効にする。コア2は次に必要になったとき、有効なデータを取り直すんだ。図はこの方式の簡略例だよ。
ひよこ ひよこ
それならスレッドの同期は不要?
ペンギン先生 ペンギン先生
必要だよ。同じ場所の整合性と、異なる場所の更新がどんな順序で見えるかは別なんだ。「データを書いて、準備完了フラグを立てる」なら、読む側も含めた適切な同期が必要だし、読み取り・加算・書き戻しの一連の操作も勝手に原子的にはならないよ。
ひよこ ひよこ
GPUや周辺機器にも同じように働く?
ペンギン先生 ペンギン先生
すべての機器やメモリ領域で保証されるわけではないよ。DMAを使う機器とCPUの間で、自動的なコヒーレンスを提供しない構成もあるんだ。その場合はOSのDMA APIなど、環境に合う方法で整合性を扱う必要があるね。
もっと詳しく知りたい人へ

キャッシュが整合していれば、メインメモリも常に最新ですか?

そうとは限りません。書き戻し方式では変更した値をキャッシュに保持し、後でメインメモリへ書き戻すことがあります。コヒーレンスは、各キャッシュと主記憶にいつでも同一の値が並んでいることを意味しません。

ペンギン
まとめ:ざっくりこれだけ覚えればOK!
「キャッシュコヒーレンス」って出てきたら「同じデータのキャッシュ同士を整合させる仕組み」と思えればだいたいOK!

参考資料

← 用語集にもどる