goron <naoij@m.ieice.org> writes:

> 何時反映するのか、の何時というのは時間ではない(つまり1cycle前にダーテ
> ィになったから反映しなければならないとか)のではないかと思います。時間
> だと外部要因などにより予想外の動作をした場合、結果が変わってしまう可能
> 性がある。逆に外部要因で変わるぐらいのアバウトさでいいなら、コヒーレン
> シって本当に必要なのでしょうか。その場合多少昔のデータを持っていてもあ
> んまり変わらない気がする。というか具体的な問題点がよくわかりません。

たとえば「同期のための機構は用意するけどキャッシュコヒーレンシはありま
せん(1)」というシステムがあったとします。こういうシステムで、共有領域
に関する書き込みをプロセッサAがロックを使って排他的に行なったとします。

この結果を他のプロセッサBが利用する時に、プロセッサBのキャッシュに入っ
ている値は使えないわけですよね。そうすると、

・プロセッサAが共有領域をロックする
・プロセッサAが書き込む
・プロセッサAがキャッシュをフラッシュし、主記憶に反映する
・プロセッサAが共有領域をアンロックする
・プロセッサBが共有領域をロックする
・プロセッサBがキャッシュをインバリデートし、主記憶から値をロードする
...

という手順ではじめて、値がプロセッサAからプロセッサBにつたわることにな
りますね。

あるいは、「共有領域ははじめからキャッシュ禁止にする(2)」とか。

上の(1)(2)のような、キャッシュコヒーレントでない共有メモリ並列計算機も
あると思いますが、それよりはコヒーレンスプロトコルを使ってデータ転送を
削減した方が効率が良いということだと思います。

たとえ同期操作が同じ回数だったとしても、必ず主記憶に反映させる/主記憶
から持ってくるより、なるべくキャッシュアクセスだけですませた方が速い。
共有領域へアクセスするプロセッサに局所性がある場合を考えてみれば分かる
と思います。

たとえば、ロックを獲得するプロセッサが毎回変わるわけではなくて、同じプ
ロセッサが続けて書き込む場合とか。
あるいは、書き込みの頻度が相対的に少なくて、読み込みの方が頻繁に行なわ
れる場合とか。

このような場合、キャッシュの効果があるでしょう。コヒーレンシを捨てるな
ら、こういうキャッシュの恩恵も捨てることになります。

つまり、コヒーレントなキャッシュとは「同期を自動化してくれる」仕組みで
はなくて、「局所性の利用を自動化してくれる」キャッシュという仕組みを、
並列計算機でも利用できるようにしたものなのだと思います。

                                前田敦司