マルチコアと同期

マルチスレッドのプログラムで起こる偽共有(フォールスシェアリング)の説明として正しいものはどれか。

  1. A別々のスレッドが別々の変数を書き換えているのに、それらが同じキャッシュラインにあるため、ラインがコア間を行き来して遅くなる
  2. B2つのスレッドが同じ変数を同期せずに書き換えて、値が壊れる
  3. Cスレッドどうしが互いのロックを待ち合って、止まってしまう
答えと解説を見る

正解:A. 別々のスレッドが別々の変数を書き換えているのに、それらが同じキャッシュラインにあるため、ラインがコア間を行き来して遅くなる

コヒーレンシはキャッシュライン(一般に64バイト)の単位で管理されます。コア0が変数a、コア1が変数bを書き換えるだけでも、aとbが同じラインにあると、書き込むたびに相手のコピーが無効になり、ラインが2つのコアの間を行き来します。結果は正しいのに、性能が大きく落ちるのが偽共有です。スレッドごとの集計用の配列などで起こりやすい問題です。

  • A. 正しい。データは共有していないのに、ラインを共有してしまう現象です。
  • B. それはデータ競合です。
  • C. それはデッドロックです。
この分野を解く 分野ページへ

マルチコアと同期のほかの問題

  1. スレッドごとのカウンタを「long cnt[8];」のように並べた配列で偽共有が起きている。対策として最も適切なものはどれか。
  2. データ競合(データレース)の説明として正しいものはどれか。
  3. 上のコードを2つのスレッドで同時に実行すると、counterの最終的な値が200000より小さくなることがある。その理由として正しいものはどれか。
  4. アトミック命令(不可分命令)の説明として正しいものはどれか。
  5. アトミック命令CAS(コンペア・アンド・スワップ)の動作として正しいものはどれか。