MESIプロトコル

図3.8のところで説明したように、ストアを行う場合には、他のすべてのコアに対して書き込みを行うアドレスのキャッシュラインを持っていたら無効化(状態がMoifiedの場合は、メモリへの書き出し後に無効化)してくれというコマンドを送り、すべてのコアからの応答を確認してから、書き込みを行うということになる。

しかし、別々のウインドウで動いているようなプロセスは、それぞれ独立したメモリ空間で動いているので、別の仕事をしているコアが同じアドレスのデータを読み書きするということはあまり起こらない。つまり、多くの場合、あるコアがストアを行おうとしたときに、他のコアのキャッシュに同じアドレスのデータが入っているということは稀である。とすると、他のコアのキャッシュには書き込みを行うアドレスのデータが入っていないことが確認できれば、無効化のコマンドを他のコアに放送する必要はなく、この手順を省略して性能を改善することができる。

図3.11 MESIプロトコルでは他のキャッシュに同一アドレスのデータが無い場合はExclusive状態とし、次の書き込みのための無効化を省略

このやり方では、MSIの3状態にExclusiveという状態を追加する。Exclusive状態は、そのアドレスのキャッシュラインのデータはメモリから読んだままで書き変えられておらず、かつ、そのアドレスのデータは他のコアのキャッシュには存在しないという状態である。

Readを行う場合、図3.11のように、(1)ですべてのコアにそのアドレスのキャッシュラインを持っているかという問い合わせを送る。このとき、他のコアからの(2)や(3)の応答が、すべて「持っていない」応答であれば、他のどのコアもそのアドレスのデータを持っていないのであるから、(5)でメモリからのデータ読み出しを指令し、(6)でキャッシュにデータを格納する。そして、キャッシュラインの状態をExclusiveとする。

ストアを行う場合には、プライベートキャッシュのそのアドレスのキャッシュラインの状態がExclusive(あるいはModified)であれば、他のコアのキャッシュには同じアドレスのデータが無いことが保証されているので、無効化要求の放送は必要なく、直ちに(7)でキャッシュへの書き込みを行う。そして、キャッシュラインの状態をModifiedに変更する。

このように、Exclusive状態を追加することにより、無駄な無効化を省略することができ、性能が向上する。この方式はModified、Exclusive、Shared、Invalidの4状態を使うので、MESI(メシ)プロトコルと呼ばれる。

MOESIプロトコル

MSIの基本3状態に、OwnedとExclusiveの2つの状態を追加し、メモリ経由でなくコアのプライベートキャッシュ間で直接データ転送を行い、かつ、他のコアに同じアドレスのデータが無いと分かっている場合は無効化のステップを省略するというのがMOESI(モエジ)プロトコルである。

AMDのOpteronプロセサはこのMOESIプロトコルを使っている。