FPGA開発日記

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

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

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

MOESIプロトコル

前回まとめたMESIプロトコルに対して、O(Owned)状態を加える。

  • O(Owned): キャッシュ内にブロックが存在しているかつ、下位のキャッシュとブロックの値が異なっている。このブロックは他コアと共有されている。ブロックが置き換えられる際、下位のキャッシュに書き戻す責任を持っている。

O権限は他コアと共有している想定のため、読み出しはできるが書き込みはできない。 では、どのようにしてOwned状態になるのかステートマシンを確認してみる。バス側のリクエストに基づくステートマシンを見てみる。 (CPU側のリクエストでは、ブロックはOwned状態に変化できない)。

MOESIプロトコル、バス側からのリクエストに対するステートマシン

まず、自コアがキャッシュブロックに対して書き込みを行うと、他コアのブロックをInvalidateして自コアのブロックはModified状態になる。 これは、自身のみがキャッシュブロックを保持し、下位のキャッシュと最新データが共有されていないことを意味する。

この後、当該キャッシュブロックに対して他コアが読み込み要求を出すとどのようになるのか。 MESIプロトコルだと、自コアのキャッシュブロックをS権限に変更したうえで、他コアに共有する。 この時、コア全体がS状態になるためには、下位キャッシュに最新のブロックを書き戻す必要がある。

一方、MOESIプロトコルだと、わざわざ下位キャッシュに最新のブロックを戻すことなく、M状態のブロックを直接他コアに転送することができる。 こうすると、下位キャッシュへのアクセスが必要ないためより高速にデータを共有できるが、その代わりに読み込み権限のキャッシュブロックと、下位キャッシュのブロックのデータが一致しないまま全員が読み込み権限を持つブロックを保持していることになる。

そこで、もとももM状態であったブロックを持っていたコアが、ブロックを自コアから破棄する際に、下位キャッシュに書き戻す責任を持つために、Owned権限に移動する。 O権限のブロックは、読み込みのみが可能で、他コアの同一ブロックはすべてS権限のはずだ。 そして、O権限のブロックはキャッシュブロックを破棄するだけでなく、最終的に下位キャッシュに書き戻す必要がある。

CPU側のリクエストに関する挙動は以下の通り。コア側のリクエストではO権限に移動することはできないが、他コアからのRdSnoopによってのみ権限が変化する。 そして、再度O権限のブロックに書き込みを行いたい場合、M権限に移動しつつ、他コアのブロックをInvalidateする必要がある、というわけだ。

MOESIプロトコル、コア側からのリクエストに対するステートマシン