本連載はHisa Ando氏による連載「コンピュータアーキテクチャ」の初掲載(2005年9月20日掲載)から第72回(2007年3月31日掲載)までの原稿を再掲載したものとなります。第73回以降、最新のものにつきましては、コチラにて、ご確認ください。

MSIプロトコルでは、そのアドレスのデータをキャッシュに持っているのが自分だけであっても、誰か他のプロセサが同じアドレスのデータを持っているのかいないのかが不明であり、他の全てのプロセサに対してInvalid化の要求を送り、確認を求める必要がある。各プロセサがほぼ独立のデータを使っている場合には、他のプロセサが同じアドレスのデータをキャッシュに持っていることは稀であり、常に他のプロセサにInvalid化を要求するのは効率が悪い。

これを改善するのが、MESIプロトコルである。キャッシュラインが有効でメモリと同じデータを持っている状態を、自分のキャッシュだけに入っている場合はExclusive状態とし、他のプロセサのキャッシュにも同じアドレスのデータがキャッシュされている場合をShared状態とする。このように4状態にすると、書き込もうとするキャッシュラインがExclusive状態の場合は、他のプロセサのキャッシュには同一データは無いので、Invalid化要求を行わずに書き込みを行ってModified状態とすることが出来る。

また、MSIプロトコルでは、Modified状態のキャッシュラインのアドレスに他のプロセサから読込み要求が出されると、書き換えられた内容をメモリに書き戻す必要があるが、Ownedという状態を作り、書き戻しの頻度を減少させるのがMOSIプロトコルである。MOSIプロトコルでは、Modifiedのキャッシュラインに対して読込み要求が来ると、キャッシュからデータを供給するとともに、キャッシュラインの状態をOwnedに変更する。データを受け取った側のキャッシュラインの状態はSharedである。Owned状態のキャッシュラインは、このプロセサのキャッシュラインがメモリへの書き戻しの責任を持っていることを示し、このキャッシュラインが追い出される時にはメモリに書き戻す必要があるが、他のプロセサからアクセスされた場合にはメモリへの書き戻しの必要は無く、メモリへの書き込み頻度を減らすことが出来る。

次に述べるMOESIプロトコルは基本となるMSIプロトコルにExclusiveとOwnedの両方の状態を付け加えたプロトコルである。

MOESIプロトコル

コヒーレンシ制御には多くのバリエーションがあるが、マイクロプロセサのキャッシュではMOESIプロトコルやこれを若干簡略化したMESIプロトコルが用いられることが多いので、代表としてMOESIプロトコルについて更に詳しく説明する。MOESIという名前は、タグアレイに保持するキャッシュラインの状態として、Modified、Owned、Exclusive、Shared、Invalidという5状態を使うことから名付けられている。

事象 P0 P1 P2
0 初期状態 Invalid Invalid Invalid
1 P0 Read Exclusive Invalid Invalid
2 P1 Read;P0応答データ供給 Shared Invalid Invalid
3 P2 Read;P0応答データ供給 Shared Shared Shared
4 P0 Write;Invalidate応答を待ってWrite Modified Invalid Invalid
5 P2 Read;P0応答データ供給 Owned Invalid Shared
6 P1 Write;Invalidate、
P0(Owner)応答データ供給、
P2 Invalidate応答
Invalid Modified Invalid
7 P2 Read;P1応答データ供給 Invalid Owned Shared
8 P1 Writeback Invalid --- Shared
表1:キャッシュラインの状態遷移の例

表1に単一のキャッシュラインの状態遷移の例を示す。(0)は初期状態であり、P0、P1、P2のどのプロセサのキャッシュもデータが入っていない状態を表わしている。Invalidというのは、そのキャッシュラインのデータは無効で、使えない状態であることを示す。(1)で、P0のキャッシュラインにメモリからデータが読み込まれると、P0のキャッシュラインはInvalid状態からExclusive状態になる。Exclusive状態は、そのキャッシュだけがそのデータを保持しており、かつ、メモリの内容から変更されていない状態である。

(2)で、P1プロセサが同じデータを読むと、そのプロセサのキャッシュにも同じデータが格納されるので、両方のプロセサのキャッシュラインの状態はSharedに変更される。つまり、Shared状態のキャッシュラインは、システム内の複数のプロセサのキャッシュに同一データがあり、また、その内容はメモリの内容から変更されていない状態である。(3)は、続いてP2プロセサが同一のデータを読んだ場合で、同様にP2プロセサのキャッシュラインもShared状態となる。

ここで(4)のように、P0プロセサがメモリに書き込みを行おうとする場合を考える。そのプロセサのタグアレイをアクセスしてキャッシュラインの状態がSharedである場合は、他のプロセサが同一物理アドレスのデータを持っているので、まず、他の全プロセサのキャッシュにそのキャッシュラインをInvalidにするように要求を送り、他のプロセサからInvalid化の完了通知を受け取ると、自分のキャッシュにデータを書き込み、Modified状態とする。Modified状態は、メモリの内容から変更されたデータを、そのプロセサのキャッシュラインだけが保持しているという状態である。

さらに、(5)でP2プロセサが、その書き換えられたキャッシュラインのデータの読み込みを要求すると、Modified状態のキャッシュラインをもっているP0プロセサのキャッシュが応答してデータを要求元のプロセサに送るとともに、キャッシュラインの状態をOwnedに変更する。Owned状態は、キャッシュラインがメモリの内容から変更された内容を保持しており、複数のプロセサのキャッシュに同じデータがあるが、Owned状態のキャッシュラインがメモリへの書き戻しの責任を持っていることを示す。一方、データを受け取った方のプロセサのキャッシュラインの状態はSharedになる。

次に(6)でP1がそのアドレスに書き込もうとするが、P1はデータを持っていないので、他のプロセサに対して、データを持っているプロセサはデータを提供してからInvalid化しろという要求(Copyback Invalidate)を送る。この場合は、P0がデータ供給責任をもっており、P0からそのアドレスの最新データが送られ、その後P0、P2のキャッシュラインはInvalid化される。(7)ではP2がそのアドレスをReadし、P1がデータ供給を行いキャッシュラインの状態をOwnedに変更する。受け取ったP2はSharedである。

(8)はOwnerであるP1のそのキャッシュラインに別のデータを書き込む必要が出て、キャッシュラインが追い出されるケースである。P1にある変更されたデータがメモリに書き戻され、P2のキャッシュにあるデータはメモリと一致したデータとなり、他のプロセサのキャッシュにはそのデータは存在しない状態であるので、P2 のキャッシュラインはExclusive状態に遷移というのが理想的であるが、一般にはP2は自分だけがそのデータを持っているかどうかを確認できないのでShared状態に留まる。このため、後にP2がそのキャッシュラインに書き込みを行う場合、Exclusiveであれば送る必要の無いInvalid化要求を出すことになり多少無駄が生じるが、コヒーレンシの点では矛盾は生じない。