通常用いられているキャッシュはWrite Back Cacheという方式で,CPUがメモリにストアしてもキャッシュに書かれるだけでメモリには書き込みが起こりません。何時,メモリに書き込まれるかというとそのキャッシュラインを別のReadで使う必要が出た時に,メモリへの追い出しが起こります。逆に言うと,そのキャッシュラインを追い出す必要が無ければ何時までもメモリには書かれません。

  ここで言うキャッシュラインはアクセスするアドレスを含むキャッシュの管理単位で,一般的には32バイトから256バイト程度の大きさです。

  複数のCPUが全く別の処理を行っていれば,関係ありませんが,複数のCPUで処理を分担する場合には一つのCPUのStoreした結果を別のCPUがLoadすることは当然起こるわけですが,Storeした結果がメモリに何時反映されるのか分からないのでは困ります。そのために,CPUはLoadで新たに自分のキャッシュにデータを読み込む時には,他の全てのCPUのキャッシュにそのデータが入っていないかをチェックします。そしてどれかのCPUがそのキャッシュラインに書き込んで(ModifiedとかDirtyとか呼びます)いれば,メモリのデータは古いので,そのCPUのキャッシュからデータを読み込みます。

  また,あるCPUがメモリに書き込む場合は,他のCPUがそのキャッシュラインを持っていてそれを使い続けると,本来,同じアドレスであるべきデータが矛盾してしまうので,Modifiedのキャッシュラインを持っているCPUがあればそこからデータを送ってもらい,そして,自分以外のCPU全部にそのキャッシュラインを捨てろという要求を出し,全員が捨てたことを確認してから,キャッシュラインに書き込みを行います。こうすれば,他のどのCPUも同じアドレのデータスをキャッシュに持っていないので矛盾は生じません。

  このように自分のキャッシュに無いメモリをアクセスする場合や,自分のキャッシュにあっても書き込みを行う場合は,他のCPUが同じデータをキャッシュに持っていないかどうかを確認し,矛盾の生じない処理を行うことをキャッシュコヒーレンスと言います。

Ando_san


"goron" <naoij@m.ieice.org> wrote in message 
news:cpjoq2$ce0$1@dojima-n0.hi-ho.ne.jp...
> goronと申します。
>
> マルチCPUについて独学している者ですが、マルチCPUのキャッシュ、特に
> コヒーレンシの意義がよくわかりません。
>
> CPUの参考図書などでもキャッシュコヒーレンシの方法やそのものの機能・
> 意味などは書かれており、理解もできているつもりですが、なぜそれが必
> 要なのか、どういった場面で有効なのかが理解できていません。そのため
> 下記の様な疑問が常にあり、それが解決できません。
>
> 例えば、複数のCPUが同一領域を読込・更新した時に、
>   CPU1_Read -> CPU2_Read -> CPU1_Write -> CPU2_Write
> といったアクセスをした場合、スヌープなどにより複数キャッシュの一意
> 性が保たれても、それ以前にレジスタにリードされていれば無意味ではな
> いか、またどちらのライトが有効かはタイミングによって変動するため、
> 意味のあるアクセスにするためにはコヒーレンシというよりメモリアクセ
> スのロック機構のようなものの方が必要ではないか。
> つまりキャッシュコヒーレンシはあくまでもキャッシュまでのコヒーレン
> シであり、記憶階層の頂点であるレジスタのコヒーレンシは(当然)保た
> れない。そのため、複数のCPUが同一領域を更新するような場合は、キャッ
> シュをコヒーレントしたところで意味はなく、1つのCPUが更新・他のCPU
> はリードという場合のみ意味がある、しかしその割にはスヌープ機構は複
> 雑だし、実際は別の方法/用途があるのだろう、という考えになってしまい
> そこから一歩も出られません。
>
> どなたか、この本を読め/このwebを見よでも構わないので、お教えいただ
> けませんでしょうか。