> コヒーレントってのは、目標としては、
>      整合性
> があるわけで、その整合性は、
>      トランザクション
> という単位の整列可能性という形で定義されます。
>
> で、そのトランザクションを、
>      メモリアクセス
> という単位で要求すれば、キャッシュコヒーレンスということになるわけ。
>
> 実際、
>      par begin
>         do i=1,99999
>           mem[i]=mem[i+1]+mem[i]
>         od
>      par end
> みたいなアプリケーションに関しては、キャッシュコヒーレンスは極めて
> 重要っていうかなければ、やってられないわけ。

例えば、
CPU1 : mem[5] = mem[6] + mem[5]
CPU2 : mem[6] = mem[7] + mem[6]
を行った場合、これをアセンブラレベルに分解した時に、
[CPU1]
LD $1, @(base+5)
LD $2, @(base+6)
ADD $1, $1, $2
ST $1, @(base+5)

[CPU2]
LD $1, @(base+6)
LD $2, @(base+7)
ADD $1, $1, $2
ST $1, @(base+6)

となると思いますが、CPU1のLD $2はCPU2のSTが為される前に実行されなけ
ればならないわけですよね。つまりCPU2のSTをCPU1のLD $2が止めなければ
ならない。これはキャッシュスヌープのみでは実現できないと思うのです
が。
逆に
par begin
   do i=1,99999
     mem[i]=mem[i-1]+mem[i]
   od
par end
のように更新した後に次のイテレーションをはじめなければならない場合
も、STし始めていようがまだその前のLDやADD処理中であろうが、もう次の
LDは止めてなければならないわけで。STして初めて他のCPUを止められる
スヌープでは何の役にも立たないのではと思ってしまうのです。


>     あるメモリ領域に対してアクセスされた時に、suspend & signal する
>
> ってのは、結構欲しくなる。それ抜きに明示的に通信すれば良いっていう
> 考えもありますし、メモリアクセスを検出して明示的な通信をするっていう
> 実現もあるんですけどね。

> 同期機構は階層的に構築されるものなので、その下位階層としてスヌープ
> という同期機構があると考えれば良いんじゃないでしょうか。

私の理解と疑問は、スヌープはあくまでもキャッシュに間違っていたもの
が入っていたらそれを正すだけで、それに対しsuspend & signalはプログ
ラムの流れを選択的に止める処理と思いますが、上述のようにスヌープは
同期機構にもなっていないんじゃないかと。もしそうなら別途明示的な同
期処理が”必ず”必要なのでしょうか、という点です。


スヌープのsuspend & signalは高々記憶階層の途中でしかないキャッシュ
に閉じてしまっていて、それだけでいろいろ完結できる処理があるものな
のかが疑問点です。結局はCPUが何かお膳立てをする必要があるのかない
のか、必ずお膳立てと後始末をするならその時にパージするとか他のキャ
ッシュのインバリデートを行う機構を入れるとかぐらいでいいんじゃない
かとか。キャッシュのみ全自動で解決しているように見えて、その全自動
がどこに役に立っているのか(ないと困るのか)が見えないのです。

そもそも前提が間違っているんでしょうか。


---
goron