今さら聞けないマルチプロセッサの基礎教えます ――キャッシュの共有,割り込みの共有,OSによる制御
● キャッシュの利用にも注意が必要
キャッシュの利用についても,単一プロセッサにおけるプログラム開発以上の注意が必要となります.基本的に,キャッシュに乗ったデータはなるべく長い間使い回すこと,むだなキャッシュ間データ転送を行わないこと,の2点を考慮します.ここでは具体例として,キャッシュ間データ転送について説明します.
図7では,CPU0のみが扱うデータAとCPU1のみが扱うデータBが,同一ライン上に配置されています.これらのデータA,Bが両プロセッサのキャッシュにあるとき,CPU0がAを修正すると,(データの共有情報はライン単位で管理されているので)CPU1のキャッシュ上のA,Bが配置されているラインは無効化されることになります.すなわち,後でCPU1がBにアクセスしようとするとむだなミス・ヒットが起こり,結果としてむだなデータ転送が生じることになります.CPU1がBを修正するときも同様のことが起こります.
このように,本来,共有していないデータをキャッシュ上の同一ラインで共有してしまう状況を「false sharing」と言います.これを避けるためには,複数のCPUで共有していないデータを別々のラインに配置するようにします 注6.
このほか,マルチプロセッサ・システムのプログラミング開発では,デッドロックなど,プロセッサ間の待ち合わせ(同期)に関係することにも注意する必要があります(4).
なお,マルチプロセッサ・システムについてさらに詳しく勉強する場合は,参考文献(4),(5)を参照するとよいでしょう.
注6;具体的な手法として,隣り合って配置されたデータが共有されていない場合,それらのデータの間にダミーのデータ(pad)を挿入して,キャッシュ上では別々のラインに配置されるようにする「padding」という手法がある.
図7 false sharingの例
AとBは同一ライン上に配置されているが,それぞれCPU0,CPU1からのみアクセスされるデータである.CPU0がAを修正すると,本来,関係ないはずのCPU1のキャッシュのBまで無効化されてしまう.