とりあえずの記録

はじめは同学科の人向けのナレッジまとめでした

キャッシュコヒーレンシに関する仮まとめ

まだ詳しく理解できていない領域についてのまとめです.誤りを含んでいる/適切とは言えない記述がある可能性が相応に高いです.予めご了承ください.

キャッシュコヒーレンシ:CPUキャッシュとメモリ内のデータを同期させる仕組み.
これがうまく機能していないと,キャッシュとメモリ,異なるキャッシュレイヤ間でデータが一致しなくなってしまう.(→キャッシュコヒーレンシ問題)

基本的には,プロセッサがハードウェアレベルでうまくやる.
(Intel CPUだと,BIOS設定からスヌープモードを切り替えることで動作を少し変更できる.)

OS・ソフトウェアレベルで直接介入することは困難.次のような策を取る.

  • メモリバリア(メモリフェンス)を用いて命令の実行順序を制御することによって,明示的にキャッシュの内容を同期させる
  • mutexやspin-lock,semaphoreなどの同期機構を使用して,共有データへのアクセスを制御する
    • 同期機構の実装にはアトミック命令が使用される.
      アトミック命令の実装上,メモリフェンスの働きを有していることが多い(?).
      よって,副次的にメモリとキャッシュで整合性をもたせられることが多い?
  • RTOSなどの組み込み系環境では,特殊なCPU命令を実行してキャッシュのフラッシュや無効化を行えることも

x86系CPUにおけるメモリバリア命令の1つとして,mfenceがある.
それまでに行われたすべてのメモリ書き込みが完了するまで,後続のメモリ書き込みは開始されない.
C言語でmfenceを実行するには,GCCやclangが組み込み関数として提供している__sync_synchronize()を用いることが多い.

なお,読み込みのみ保証するlfenceや書き込みのみ保証するsfenceを使用することでパフォーマンスへの影響を抑えることが可能.ただしコンパイラによる組み込み関数としては用意されていないため,インラインアセンブラで記すか,emmintrin.hをincludeして各関数を記すかして用いる.