FPGA開発日記

カテゴリ別記事インデックス https://msyksphinz.github.io/github_pages , English Version https://fpgadevdiary.hatenadiary.com/

キャッシュのコヒーレンス・プロトコルについてまとめる (MSI/MESIプロトコル)

マルチコアにおいて、キャッシュ・コヒーレンス・プロトコルというのは切っても切り離せない問題だ。 幾つかのプロトコルについてメモを書いたので、一応ここに残しておく。

  • MSIプロトコル
  • MESIプロトコル
  • MOESIプロトコル

MSIプロトコル

キャッシュ内のブロックは以下の3つの状態のどれかを持つ。

  • I(Invalidate): キャッシュ内に当該ブロックは存在していない
  • S(Shared): キャッシュ内にブロックが存在しており、下位のキャッシュと値が一致している
  • M(Modified): キャッシュ内にブロックが存在しており、下位のキャッシュと値が一致していない、つまり書き込まれている)

この状態について、CPU側からの挙動と、バス(スヌーププロトコル側)からの動作をステートマシンにまとめる

CPU側からの挙動

  • I(Invalidate) からの挙動
    • CPUでRead Missが発生した場合、下位のキャッシュからデータを読み込むためのリクエストを発行する。当該ブロックはS(Shared)となる。
    • CPUでWrite Missが発生した場合、下位のキャッシュからデータを読むコムためのリクエストを発行する。当該ブロックはキャッシュに読み込まれ、さらに最新の値に更新され、M(Modified)となる。
  • S(Shared) からの挙動。基本的にキャッシュ内にブロックが存在しているのでHitのみを考える。同じインデックスに別のブロックが要求された場合のことは考えない。
    • CPUでRead Hitが発生する場合、特に何もせず、データをCPUに返す
    • CPUでWrite Hitが発生する場合、Sharedステートは書き込み権限を持っていないので、バスに対して書き込み権限取得要求を行い、完了後にデータを更新し、M(Modified)に移行する。また、他コアが持っている同様のS権限のブロックは古くなるため、他コアのブロックに対してInvalidateを通知する。
  • M(Modified)からの挙動。Hitのみを考える。
    • CPUでRead Hitが発生する場合、特に何もせず、データをCPUに返す
    • CPUでWrite Hitが発生する場合、既に書き込み権限を持っているので、特に何もせず、データを更新する。

バス側からの挙動

以下で説明するRdSnoop/WrSnoopというのは、他コアが当該ブロックをRead/Write要求したが存在せず、下位キャッシュに対してブロックを要求し、スヌープバスを通じて自コアに通知されるコマンドのことを言う。 つまり、バスからRdSnoopが来たということは、他コアが当該ブロックを読みたがっている、WrSnoopが来たということは、他コアが当該ブロックに書き込みたがっているということを意味する。

  • S(Shared)からの挙動
    • バスからRdSnoop (Read Snoop)が来た場合、自身のブロックと下位のキャッシュのブロックは一致しているので、自身がデータを転送する必要はない。特に何もしない。
    • バスからWrSnoop (Write Snoop)が来た場合、他のコアが当該ブロックを更新しようとしている。つまり自身のブロックは古くなることが確定しているので、自身のブロックを破棄しInvalidateとなる。
  • M(Modified)からの挙動
    • バスからWrSnoop が来た場合、Sと同じで自身のブロックを破棄しInvalidateする。
    • バスからRdSnoop が来た場合、自身のブロックが最新であるため、このブロックを転送し他コアと共有する。最新のブロックを他コアと共有している状態のため、ブロックの権限をS(Shared)とする。

MESIプロトコル

上記のMSIプロトコルに対して、E(Exclusive)状態を加える。

  • E(Exclusive): キャッシュ内にブロックが存在しているかつ、他コアは当該ブロックを持っていない。この権限では、読み込みは可能だが書き込みはできない。
    • この状態を付け加えることにより、E権限のブロックは他コアが同じブロックを共有していないことが保証されるため、ブロックを保持しているCPUが当該ブロックに書き込む際、システム全体にInvalidateを通知する必要がなくなる。

CPU側からの挙動

E権限に着目して説明する。

  • I(Invalidate)からの挙動
    • CPUでRead Missが発生すると下位キャッシュからブロックを持ってくるが、その時他コアが当該ブロックを保持していない場合、権限をS(Shared)ではなくE(Exclusive)とする。
  • E(Exclusive)からの挙動
    • Read Hitが発生しても特に何もしない。CPUぢデータを返す。
    • Write Hitが発生すると、他コアにInvalidateをブロードキャストせず、権限をM(Modified)に変更する。

バス側からの挙動

  • E(Exclusive)からの挙動
    • バスからWrSnoopが来た場合、他コアが最新の値を書き込むため、当該ブロックをInvalidateする。
    • バスからRdSnoopが来た場合、他コアとデータを共有することになるため、当該ブロックをS権限に変更する。

MOESIは次回にまとめる。