MOSIプロトコル

図3.8の所で説明したように、MSIプロトコルでは、書き変えられた新データを持っているコアは、問い合わせを受けると、そのデータをメモリに書き出し、要求元はそれをメモリから読み出しを行う。しかし、これには2回のメインメモリのアクセスが必要である。

1つのマルチコアチップに載ったコアの場合、チップ外のDRAMを経由するよりも、コアのプライベートキャッシュ間で、直接、キャッシュラインのデータをやり取りする方がずっと速い。ということで、新データを持つコアはメモリへの書き出しを行わず、そのデータを要求元のコアのキャッシュに直接転送することにして、性能を上げようというやり方が考えられた。

新データを含むキャッシュラインの状態はModifiedであるが、これを他のコアのキャッシュラインに転送する場合、これらのキャッシュラインの状態はどのようにすれば良いであろうか? 受け取り側のキャッシュラインもModifiedということにすると、第3のコアがそのアドレスをアクセスした場合、Modifiedのキャッシュラインを持つコアは2つ、あるいはそれ以上あり、それらすべてが第3のコアにデータを送ろうとすると、データ転送がぶつかってしまう。また、書き変えられたキャッシュラインのデータは、いつかはメインメモリに書き出す必要があるが、複数のコアにModifiedのキャッシュラインがあると、どのコアが書き出しを行うかという問題もある。

図3.10 MOSIプロトコルではキャッシュ間の直接データ転送を行う

これを避けるために、Ownedという状態を追加する。そして、図3.10に示すように、(4)で他のコアにModified状態のキャッシュラインのデータを転送した場合、キャッシュラインの状態をModifiedからOwnedに変更する。

そして、受け取った側のキャッシュラインの状態はSharedとする。なお、Sharedは、MSIプロトコルでいうメモリとデータ値が一致しているという定義を拡張し、メモリとはデータ値が異なっていても、他のコアのキャッシュにも同じデータがある状態を含むことにする。

そして、以降の他のコアからのアクセスに対しては、Owned状態のキャッシュラインがデータ供給の責任を持つ。また、Owned状態のキャッシュラインがキャッシュから追い出される時には、メモリへの書き戻しの責任を負う。

このように、Owned状態を追加することにより、コア間で直接、キャッシュラインのデータを転送することができ、メインメモリへのアクセス回数が減り、性能が向上する。この方式は、Modified、Owned、Shared、Invalidの4状態を使用するので、「MOSI(モジ)プロトコル」と呼ばれる。