マルチコアと同期
MESIプロトコル、メモリ一貫性モデル、CASやLL/SCなどのアトミック命令、ロックとメモリバリア、偽共有とデータ競合を3択問題で学べます。
—あなたの正答率
0 / 50解いた問題
マルチコアと同期の要点
1つのチップに複数のコアを載せたマルチコアCPUでは、各コアが自分のキャッシュをもちながら同じメモリを共有します。あるコアが書き換えたデータを他のコアが古いまま使わないよう、MESIのようなコヒーレンシプロトコルがキャッシュの状態を管理しています。
さらに、書き込みがどの順番で他のコアから見えるかを決めるメモリ一貫性モデル、複数のコアが安全に値を更新するためのアトミック命令、ロックやメモリバリアを理解する必要があります。偽共有やデータ競合のように、正しく見えるプログラムが遅くなったり誤動作したりする落とし穴も学びます。
マルチコアと同期の問題一覧(50問)
- 2つのコアがそれぞれ自分のキャッシュに変数xのコピーを持っている。コア0がxに書き込んだあと、コア1がxを読むときに、キャッシュコヒーレンシの仕組みがなければ起こりうる問題はどれか。
- キャッシュコヒーレンシのプロトコルであるMESIの4つの状態の組み合わせとして正しいものはどれか。
- MESIプロトコルでキャッシュのラインがModified(M)状態にあるときの意味として正しいものはどれか。
- MESIプロトコルで、Exclusive(E)状態のラインにそのコアが書き込むときの動作として正しいものはどれか。
- 無効化型のコヒーレンシプロトコルで、あるコアがShared(S)状態のラインに書き込むときに行われることはどれか。
- MESIプロトコルで、コア0がModified(M)状態で持っているラインを、コア1が読もうとしたときの一般的な動作はどれか。
- キャッシュコヒーレンシのスヌーピング方式の説明として正しいものはどれか。
- コアの数が多いシステムで、スヌーピング方式の代わりにディレクトリ方式のコヒーレンシが使われる理由として正しいものはどれか。
- コヒーレンシのプロトコルには無効化型と更新型がある。多くのCPUが無効化型を採用している理由として最も適切なものはどれか。
- マルチスレッドのプログラムで起こる偽共有(フォールスシェアリング)の説明として正しいものはどれか。
- スレッドごとのカウンタを「long cnt[8];」のように並べた配列で偽共有が起きている。対策として最も適切なものはどれか。
- データ競合(データレース)の説明として正しいものはどれか。
- 上のコードを2つのスレッドで同時に実行すると、counterの最終的な値が200000より小さくなることがある。その理由として正しいものはどれか。
- アトミック命令(不可分命令)の説明として正しいものはどれか。
- アトミック命令CAS(コンペア・アンド・スワップ)の動作として正しいものはどれか。
- 上のコードは、CAS(&p, 期待値, 新しい値)を使って共有の変数counterを2倍にしている。CASが失敗してループをやり直すのはどのようなときか。
- RISC-VのLR/SC(ロード予約/条件付きストア)のような命令の組で、SC(条件付きストア)が失敗するのはどのようなときか。
- CASを使ったロックフリーのデータ構造で問題になるABA問題の説明として正しいものはどれか。
- RISC-Vのamoadd.w命令やx86のlock xadd命令のような、フェッチ・アンド・アッド(fetch-and-add)命令の動作として正しいものはどれか。
- スピンロックの説明として正しいものはどれか。
- スピンロックが向かない場面として最も適切なものはどれか。
- スピンロックで、ロックの変数をいきなりアトミック命令で書き換えようとするのではなく、普段は通常の読み出しで空くのを待ち、空いたと見えたときだけアトミック命令を使う(test-and-test-and-set)理由として正しいものはどれか。
- ミューテックス(眠って待つロック)とスピンロックを比べた説明として正しいものはどれか。
- デッドロックの例として正しいものはどれか。
- 複数のロックを使うプログラムで、デッドロックを防ぐ方法として最も一般的なものはどれか。
- メモリ一貫性モデル(メモリコンシステンシモデル)が定めているものはどれか。
- 逐次一貫性(シーケンシャルコンシステンシ)の説明として正しいものはどれか。
- 上の2つのスレッドを別々のコアで同時に実行する(コンパイラによる並べ替えはないとする)。逐次一貫性では起こらないが、x86などの実際のCPUでは起こりうる結果はどれか。
- x86のメモリ一貫性モデル(TSO、トータルストアオーダー)の特徴として正しいものはどれか。
- ARMやRISC-V(RVWMO)のような弱いメモリ一貫性モデルについて正しいものはどれか。
- メモリバリア(フェンス)命令の役割として正しいものはどれか。
- 上のコードで、スレッド1がdataを用意してからflagで知らせ、スレッド2がflagを見てからdataを読む。弱いメモリ一貫性モデルのCPUで、スレッド2が確実に42を読むために必要なこととして正しいものはどれか。
- 取得(acquire)と解放(release)の意味を持つメモリ操作について正しいものはどれか。
- C言語で、スレッド間で受け渡すフラグ変数にvolatileを付けるだけでは、同期として不十分である理由として正しいものはどれか。
- C11の_AtomicやC++11のstd::atomicで、メモリオーダーを指定できるようになっている理由として正しいものはどれか。
- 大きなデータ構造全体を1つのロックで守る「粗い粒度のロック」と、部分ごとに別のロックで守る「細かい粒度のロック」を比べた説明として正しいものはどれか。
- ロックフリー(lock-free)のアルゴリズムの性質として正しいものはどれか。
- クリティカルセクションの説明として正しいものはどれか。
- 並列プログラムで使われるバリア同期の説明として正しいものはどれか。
- 64個のコアが、1つの共有カウンタを同時にアトミック命令で更新し続けると、コアを増やしても速くならない。主な理由はどれか。
- NUMA(不均一メモリアクセス)のシステムの説明として正しいものはどれか。
- LinuxのNUMAシステムでよく使われるファーストタッチの方針(初めてページに書き込んだスレッドが動いているノードのメモリにそのページを置く)で注意すべき点として正しいものはどれか。
- 並列プログラムで、コアの数を増やしても性能が思うように伸びない原因として当てはまらないものはどれか。
- ループの繰り返しを複数のスレッドに分けるとき、繰り返しごとの計算量が大きくばらつく場合に適した分け方はどれか。
- 配列の全要素の合計を複数のスレッドで求めるとき、性能のために適した方法はどれか。
- 読み書きロック(リーダー・ライターロック)の特徴として正しいものはどれか。
- カウンタ付きのセマフォの使い方として最も適切なものはどれか。
- キャッシュコヒーレンシとメモリ一貫性モデルの違いとして正しいものはどれか。
- ハードウェアトランザクショナルメモリの考え方として正しいものはどれか。
- 条件変数で「キューが空でなくなるまで待つ」とき、待ちから起きた後に条件をif文ではなくwhile文で確かめ直す理由として正しいものはどれか。