マルチコアと同期

配列の全要素の合計を複数のスレッドで求めるとき、性能のために適した方法はどれか。

  1. Aすべてのスレッドが、要素ごとに1つの共有の変数へロックを取って足す
  2. Bすべてのスレッドが、要素ごとに1つの共有の変数へ同期なしで足す
  3. C各スレッドが自分の担当分を局所変数で合計し、最後にそれらを1回ずつ足し合わせる
答えと解説を見る

正解:C. 各スレッドが自分の担当分を局所変数で合計し、最後にそれらを1回ずつ足し合わせる

要素ごとに共有の変数を更新すると、ロックやアトミック命令の待ちと、キャッシュラインの行き来で非常に遅くなります。各スレッドがレジスタや局所変数で部分和を求め、最後にスレッドの数だけの足し算で全体の和を出せば、共有の書き込みはごくわずかです。この方法をリダクションと呼び、OpenMPなどの並列化の仕組みにも組み込まれています。

  • A. ロックの待ちと通信で、並列化の効果がほとんどなくなります。
  • B. データ競合で、合計が正しくなりません。
  • C. 正しい。リダクションと呼ばれる方法です。
この分野を解く 分野ページへ

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

  1. 読み書きロック(リーダー・ライターロック)の特徴として正しいものはどれか。
  2. カウンタ付きのセマフォの使い方として最も適切なものはどれか。
  3. キャッシュコヒーレンシとメモリ一貫性モデルの違いとして正しいものはどれか。
  4. ハードウェアトランザクショナルメモリの考え方として正しいものはどれか。
  5. 条件変数で「キューが空でなくなるまで待つ」とき、待ちから起きた後に条件をif文ではなくwhile文で確かめ直す理由として正しいものはどれか。