マルチコアと同期

スレッドごとのカウンタを「long cnt[8];」のように並べた配列で偽共有が起きている。対策として最も適切なものはどれか。

  1. Aカウンタの型をlongからintに変えて、配列を小さくする
  2. B各カウンタの間に詰め物を入れたり整列させたりして、別々のキャッシュラインに置く
  3. Cスレッドの数を増やして、待ち時間を分散させる
答えと解説を見る

正解:B. 各カウンタの間に詰め物を入れたり整列させたりして、別々のキャッシュラインに置く

longが8バイトなら、8個のカウンタは64バイトの1つのラインに収まり、全部のスレッドが同じラインを奪い合います。各カウンタを64バイトごとに置くように詰め物を入れるか、構造体をキャッシュラインの大きさに整列させれば、スレッドごとに別のラインを使えます。また、各スレッドは局所変数で数えて、最後に1回だけ共有の場所へ足す方法も効果的です。

  • A. 小さくすると、かえって同じラインに詰め込まれます。
  • B. 正しい。ラインを分ければ行き来がなくなります。
  • C. スレッドが増えると、行き来はむしろ増えます。
この分野を解く 分野ページへ

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

  1. データ競合(データレース)の説明として正しいものはどれか。
  2. 上のコードを2つのスレッドで同時に実行すると、counterの最終的な値が200000より小さくなることがある。その理由として正しいものはどれか。
  3. アトミック命令(不可分命令)の説明として正しいものはどれか。
  4. アトミック命令CAS(コンペア・アンド・スワップ)の動作として正しいものはどれか。
  5. 上のコードは、CAS(&p, 期待値, 新しい値)を使って共有の変数counterを2倍にしている。CASが失敗してループをやり直すのはどのようなときか。