今さら聞けないマルチプロセッサの基礎教えます ――キャッシュの共有,割り込みの共有,OSによる制御
● マルチプロセッサでキャッシュの一貫性を維持する
もう少し詳しく見ていきましょう.図1のようなシステムで,マルチプロセッサに対応していないCPUを単に接続するとどうなるかを考えてみます(図3).話を単純にするため,CPUの数は二つ,キャッシュは1次キャッシュのみとし,データの書き込みはライト・スルー方式注1を用いて随時メイン・メモリにデータを書き込むものとします.
まず,図3(a)の初期状態では,CPU0とCPU1の両方のキャッシュに同じデータAがあります.ここでCPU0がAをA'に更新すると,メイン・メモリ上のデータもA'に更新されます.しかし,更新情報はCPU1のキャッシュまでは伝わらないので,CPU0のキャッシュ,CPU1のキャッシュ,メイン・メモリの3者の間でデータの一貫性(cohe-rence)がとれなくなります(これをcache coherence problemという).
どのようにすれば,データの一貫性を維持することができるのでしょうか? 一般的には,次のような方法を用います.キャッシュとメモリの間はバスで接続されていると仮定します(図3(b)).すると,データを書き込む場合,その書き込み要求はバスに接続された全要素にブロードキャスト(発信)されることになります.各キャッシュはブロードキャストされた要求を監視(snoop)し,書き込まれるデータが自分のキャッシュにあるものと同一である場合に,そのキャッシュ上のデータが乗っているラインを無効化します.このようにすれば,次のアクセス時にはミス・ヒット処理により,メモリから最新のデータを取得することができ,結果としてキャッシュの一貫性が維持できます(このようなしくみを持つキャッシュをsnoop cacheという).
なお,ここまでの説明はライト・スルー方式を仮定していましたが,snoop cacheはライト・バック方式注2のキャッシュにも,いくつかの拡張により対応できます(コラム「ライト・バック方式の場合のsnoop cache利用法」を参照).
これらの,一貫性を維持するための戦略を「cache coherence protocol」と言います.すなわち,マルチプロセッサ対応のCPUとは,cache coherence protocolをサポートしているCPUであると言えます.cache coherence protocolには,ラインが取りうる状態の数に応じていくつかの種類があります.
注1;ライト・スルー方式とは,CPUがメモリにデータを書き込むときに,キャッシュとメイン・メモリの両方にデータを書き込む方式である.
注2;ライト・バック方式とは,CPUがメモリにデータを書き込むときに,まずキャッシュのみにデータを書き込んでおき,メイン・メモリには後で書き込む方式である.