SAITOH Akinori <saitoh@kankyo-u.ac.jp.nospam> writes:

> > つまり、コヒーレントなキャッシュとは「同期を自動化してくれる」仕組みで
> > はなくて、「局所性の利用を自動化してくれる」キャッシュという仕組みを、
> > 並列計算機でも利用できるようにしたものなのだと思います。
> 
> 個人的に持っているイメージですが、、
> 「キャッシュ無しのマルチCPUマシン用に書いたプログラムが
> そのまま動くようにという配慮」かなぁ。

そうですね。「キャッシュ」っていうのは透明な(キャッシュ無しの場合と、
プログラムの意味は変わらない)ものであって欲しくて、コヒーレンシを考慮
せずにマルチプロセッサにキャッシュを持ち込むと、それが崩れてしまうんで
すね。

「あるアドレスのメモリ内容は、どこからみても同じ」であって欲しいのに、
そうでなくなっちゃう。

> マルチプロセッサでのCPU間の通信って、メッセージパッシング的な
> ものだけではなく、あるCPUが適宜更新する内容を他のCPUが非同期に
> サンプリングする(とくにロッキングしない)といった形もあるわけで、
> ある特定の方式だけ想定したキャッシュのコヒーレンシは役に立つ
> 立たないといってもきりが無いと思います。

「データを明示的に送受する」「受けとったものは、ローカルな(キャッシュ
の効く)領域に入れて、いろいろ計算する」っていうような使い方だけなら、
コヒーレンスは不要でしょうね。キャッシュしない特別な領域を経由してやり
とりするとか。

プログラミングとしては、「逐次のCのプログラムを元に、マルチスレッドラ
イブラリを使って、普通のCの変数を共有して…」というのは出来なくって、
MPIみたいな通信パラダイムのものになるでしょうね。

そういう陽にデータを通信するモデルではなくて、たとえば並列ガーベジコレ
クションみたいに、「アプリケーションスレッドが動いている裏で、ガーベジ
コレクタがデータ全体を見ながらこっそり処理する」ようなプログラムは、コ
ヒーレントな共有メモリじゃないとやりにくいですよね。

まあ、せっかくメモリを共有してるんだから、通信パラダイム以外の使い方も
できた方がうれしい。
                                前田敦司