マルチコアと同期

LinuxのNUMAシステムでよく使われるファーストタッチの方針(初めてページに書き込んだスレッドが動いているノードのメモリにそのページを置く)で注意すべき点として正しいものはどれか。

  1. Aファーストタッチではページがランダムなノードに置かれる
  2. Bmallocを呼んだ時点で、すべてのページの置き場所が決まる
  3. C大きな配列を1つのスレッドだけで0に初期化すると、全部が1つのノードに置かれ、ほかのノードのスレッドが遠いメモリを使うことになる
答えと解説を見る

正解:C. 大きな配列を1つのスレッドだけで0に初期化すると、全部が1つのノードに置かれ、ほかのノードのスレッドが遠いメモリを使うことになる

mallocで確保しただけでは物理ページは割り当てられず、初めて書き込んだときのページフォルトで、そのスレッドがいるノードのメモリに置かれます。そのため、初期化を1つのスレッドで行うと配列全体がそのノードに集まり、並列の計算で各スレッドが担当する部分の多くが遠いメモリになります。初期化も計算と同じ分担で並列に行えば、各部分が担当のスレッドの近くに置かれます。

  • A. ランダムではなく、最初に触ったスレッドで決まります。
  • B. mallocの時点ではなく、初めて書き込んだ時点で決まります。
  • C. 正しい。初期化も、後で使うスレッドに分担させるのが基本です。
この分野を解く 分野ページへ

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

  1. 並列プログラムで、コアの数を増やしても性能が思うように伸びない原因として当てはまらないものはどれか。
  2. ループの繰り返しを複数のスレッドに分けるとき、繰り返しごとの計算量が大きくばらつく場合に適した分け方はどれか。
  3. 配列の全要素の合計を複数のスレッドで求めるとき、性能のために適した方法はどれか。
  4. 読み書きロック(リーダー・ライターロック)の特徴として正しいものはどれか。
  5. カウンタ付きのセマフォの使い方として最も適切なものはどれか。