マルチコアと同期
マルチスレッドのプログラムで起こる偽共有(フォールスシェアリング)の説明として正しいものはどれか。
- A別々のスレッドが別々の変数を書き換えているのに、それらが同じキャッシュラインにあるため、ラインがコア間を行き来して遅くなる
- B2つのスレッドが同じ変数を同期せずに書き換えて、値が壊れる
- Cスレッドどうしが互いのロックを待ち合って、止まってしまう
答えと解説を見る
正解:A. 別々のスレッドが別々の変数を書き換えているのに、それらが同じキャッシュラインにあるため、ラインがコア間を行き来して遅くなる
コヒーレンシはキャッシュライン(一般に64バイト)の単位で管理されます。コア0が変数a、コア1が変数bを書き換えるだけでも、aとbが同じラインにあると、書き込むたびに相手のコピーが無効になり、ラインが2つのコアの間を行き来します。結果は正しいのに、性能が大きく落ちるのが偽共有です。スレッドごとの集計用の配列などで起こりやすい問題です。
- A. 正しい。データは共有していないのに、ラインを共有してしまう現象です。
- B. それはデータ競合です。
- C. それはデッドロックです。