マルチコアと同期
LinuxのNUMAシステムでよく使われるファーストタッチの方針(初めてページに書き込んだスレッドが動いているノードのメモリにそのページを置く)で注意すべき点として正しいものはどれか。
- Aファーストタッチではページがランダムなノードに置かれる
- Bmallocを呼んだ時点で、すべてのページの置き場所が決まる
- C大きな配列を1つのスレッドだけで0に初期化すると、全部が1つのノードに置かれ、ほかのノードのスレッドが遠いメモリを使うことになる
答えと解説を見る
正解:C. 大きな配列を1つのスレッドだけで0に初期化すると、全部が1つのノードに置かれ、ほかのノードのスレッドが遠いメモリを使うことになる
mallocで確保しただけでは物理ページは割り当てられず、初めて書き込んだときのページフォルトで、そのスレッドがいるノードのメモリに置かれます。そのため、初期化を1つのスレッドで行うと配列全体がそのノードに集まり、並列の計算で各スレッドが担当する部分の多くが遠いメモリになります。初期化も計算と同じ分担で並列に行えば、各部分が担当のスレッドの近くに置かれます。
- A. ランダムではなく、最初に触ったスレッドで決まります。
- B. mallocの時点ではなく、初めて書き込んだ時点で決まります。
- C. 正しい。初期化も、後で使うスレッドに分担させるのが基本です。