マルチコアと同期

C11の_AtomicやC++11のstd::atomicで、メモリオーダーを指定できるようになっている理由として正しいものはどれか。

  1. Aアトミック変数を、メモリのどこに置くかを指定するため
  2. B必要な順番の保証だけを選ぶことで、不要なバリアを避けて性能を保てるから
  3. Cスレッドを実行する順番を、あらかじめ決めておくため
答えと解説を見る

正解:B. 必要な順番の保証だけを選ぶことで、不要なバリアを避けて性能を保てるから

アトミック変数の操作は、既定では逐次一貫性(memory_order_seq_cst)で、最も分かりやすい代わりにバリアの負担が大きくなります。単純なカウンタなら不可分であればよいのでrelaxed、データを受け渡すフラグならacquireとreleaseで十分です。コンパイラは指定に合わせて、CPUのメモリモデルに必要な最小限の命令を出します。

  • A. 置き場所の指定ではありません。
  • B. 正しい。既定は最も強い逐次一貫性です。
  • C. スレッドの実行順を決めるものではありません。
この分野を解く 分野ページへ

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

  1. 大きなデータ構造全体を1つのロックで守る「粗い粒度のロック」と、部分ごとに別のロックで守る「細かい粒度のロック」を比べた説明として正しいものはどれか。
  2. ロックフリー(lock-free)のアルゴリズムの性質として正しいものはどれか。
  3. クリティカルセクションの説明として正しいものはどれか。
  4. 並列プログラムで使われるバリア同期の説明として正しいものはどれか。
  5. 64個のコアが、1つの共有カウンタを同時にアトミック命令で更新し続けると、コアを増やしても速くならない。主な理由はどれか。