このページの本文へ

前へ 1 2 3 次へ

ロードマップでわかる!当世プロセッサー事情 第78回

マルチコアCPUのキャッシュで問題となるコヒーレンシと解決策

2010年11月22日 12時00分更新

文● 大原雄介(http://www.yusuke-ohara.com/)

  • この記事をはてなブックマークに追加
  • 本文印刷

 キャッシュの仕組み解説編最後のテーマは、「コヒーレンシ」(Coherency)である。あまり耳にしない単語だが、直訳すると「首尾一貫性」といったところか。キャッシュの場合、この単語は「データの一貫性」「データの整合性」といった意味合いで利用される。これは、前回触れた複数レベルのキャッシュで問題となる場合もあるが、一番大きな問題が起きるのは、マルチプロセッサー/マルチコアCPUの環境である。

マルチプロセッサー環境でキャッシュの整合性を保つ
スヌーピングとその方式

 例えば図1のような、懐かしいデュアルCPU構造を例にとって見る。ここで「CPU #1」があるデータを書き換えたとする。

図1

図1 古典的なFSB方式のマルチCPUを想定した構成図

 すると、図2のように1次/2次キャッシュの更新を経て、最終的にメモリーにそれを反映して終わる。ここまではいい。問題は「CPU #2」である。もしCPU #2が同じアドレスのデータをすでにキャッシュしていたとすると、CPU #1がデータを書きこんだことで、CPU #2のキャッシュとデータが一致しなくなる。これを避けるために、実際は以下の手順をとる(図3)。

図2

図2 CPU #1がメモリー内のあるデータ(赤い四角)を書き換えた

図3

図3 CPU #1の書き込みをCPU #2に通知して、整合性を保つ流れ

  • ①CPU #1はキャッシュに書き込むとともに、CPU #2側に書き込んだメモリーアドレスを通知する。
  • ②通知を受け取ったCPU #2が、当該アドレスをキャッシュしている場合、これを無効化する。同時にCPU #1は書き換えた内容をメモリーに反映する。
  • ③もしCPU #2がそのデータを必要とする場合、もう一度メモリーからフェッチする。

 この一連の操作は「スヌーピング」(Snooping)と呼ばれており、FSBのバスプロトコルの中には、このスヌーピングに必要なキャッシュ制御機能が含まれている。このバスプロトコルにはさまざまなものがあるが、x86系で広く使われているのが「MESI」プロトコルである。これはキャッシュの状態を以下の4種類で管理すると言う方法だ。

M E S I
Modified Exclusive Shared Invalid
変更あり 変更なし/他CPUになし 変更なし 無効

 各々の状態の頭文字をとって「MESI」となるわけだが、ほかにも以下のようなキャッシュ管理プロトコルが考案されており、実際にこれらを実装したCPUが存在する。

MSI Exclusiveがない
MOSI Exclusiveの代わりに「Owned」という状態が入る
MOESI MESIにOwnedを追加
MERSI MESIに「Read only or Resent」が追加
MESIF MESIに「Forward」が追加

 一般論として、簡単なプロトコルにすればスヌープ自身のオーバーヘッドは減るが、その分制約が生じる。例えば、MSIプロトコルはExclusiveを持たないため、「あるメモリーのコピーは、特定のCPUのキャッシュだけにある」=「そこを書き換えてもスヌープの必要はない」状態であっても、これを示す方法がない。

 そのためCPUからは、「すべてのCPUのキャッシュに、そのメモリーのコピーがある」のように見えるので、そのデータを書き換えると、必ず全CPUに対してスヌープが発生する。しかし、むやみやたらとキャッシュの状態(ステート)を増やすと、今度は状態の管理によるオーバーヘッドが問題になる。そのためMESIプロトコルは、比較的バランスが取れたものとして広く利用されている。

前へ 1 2 3 次へ

カテゴリートップへ

この連載の記事

注目ニュース

ASCII倶楽部

プレミアムPC試用レポート

ピックアップ

ASCII.jp RSS2.0 配信中

ASCII.jpメール デジタルMac/iPodマガジン