最適化問題に対する超高速&安定計算

大規模最適化問題、グラフ探索、機械学習やデジタルツインなどの研究のお話が中心

OpenMP と KMP_AFFINITY

2009年12月06日 01時42分41秒 | Weblog
OpenMP の実行時の環境変数 KMP_AFFINITY について, 添付図のような構成を持つ Intel Xeon 5460 (3.16GHz : Penryn コア) x 2 を用いて調べてみる。コア番号は 0,1,2,3,4,5,6,7 と順番に並んでいるのではなく、下記のように 0,4,2,6,1,5,3,7 と並んでいる。

OMP: Info #168: KMP_AFFINITY: OS proc 0 maps to package 0 core 0 [thread 0]
OMP: Info #168: KMP_AFFINITY: OS proc 4 maps to package 0 core 1 [thread 0]
OMP: Info #168: KMP_AFFINITY: OS proc 2 maps to package 0 core 2 [thread 0]
OMP: Info #168: KMP_AFFINITY: OS proc 6 maps to package 0 core 3 [thread 0]
OMP: Info #168: KMP_AFFINITY: OS proc 1 maps to package 1 core 0 [thread 0]
OMP: Info #168: KMP_AFFINITY: OS proc 5 maps to package 1 core 1 [thread 0]
OMP: Info #168: KMP_AFFINITY: OS proc 3 maps to package 1 core 2 [thread 0]
OMP: Info #168: KMP_AFFINITY: OS proc 7 maps to package 1 core 3 [thread 0]

1: export KMP_AFFINITY=verbose,compact
compact オプションでは、コアを近い順に 0 から割り振っていくので、以下のように 0,4,2,6,1,5,3,7 となる。

OMP: Info #147: KMP_AFFINITY: Internal thread 0 bound to OS proc set {0}
OMP: Info #147: KMP_AFFINITY: Internal thread 1 bound to OS proc set {4}
OMP: Info #147: KMP_AFFINITY: Internal thread 2 bound to OS proc set {2}
OMP: Info #147: KMP_AFFINITY: Internal thread 3 bound to OS proc set {6}
OMP: Info #147: KMP_AFFINITY: Internal thread 4 bound to OS proc set {1}
OMP: Info #147: KMP_AFFINITY: Internal thread 5 bound to OS proc set {5}
OMP: Info #147: KMP_AFFINITY: Internal thread 6 bound to OS proc set {3}
OMP: Info #147: KMP_AFFINITY: Internal thread 7 bound to OS proc set {7}

2: export KMP_AFFINITY=verbose,scatter
scatter は、スレッドが以下のように均等に割り振られる。ところが、Nehalem や Istanbul などでは 4つのコアが一つの3次キャッシュを共有しているのに対して、Penryn は添付の図のように、例えば 0 と 4 が2次キャッシュを共有しているので、この型の CPU では 0,1,2,3,4,5,6,7 という順番で割り振った方が良いだろう。

OMP: Info #147: KMP_AFFINITY: Internal thread 0 bound to OS proc set {0}
OMP: Info #147: KMP_AFFINITY: Internal thread 1 bound to OS proc set {1}
OMP: Info #147: KMP_AFFINITY: Internal thread 2 bound to OS proc set {4}
OMP: Info #147: KMP_AFFINITY: Internal thread 3 bound to OS proc set {5}
OMP: Info #147: KMP_AFFINITY: Internal thread 7 bound to OS proc set {7}
OMP: Info #147: KMP_AFFINITY: Internal thread 4 bound to OS proc set {2}
OMP: Info #147: KMP_AFFINITY: Internal thread 5 bound to OS proc set {3}
OMP: Info #147: KMP_AFFINITY: Internal thread 6 bound to OS proc set {6}
コメント (3)    この記事についてブログを書く
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする
« 次世代スパコンの試作機 | トップ | SDPA 内部の OpenMP 化 »
最新の画像もっと見る

3 コメント

コメント日が  古い順  |   新しい順
Unknown (後藤)
2009-12-05 02:32:55
この順序は BIOS で設定されるので、ベンダ毎に設定が違います。Dell はかなり特殊な設定をしている方です。

GotoBLAS では内部でこの設定を検出してベストな状態になるように Affinity を設定しています(ディフォルトではバンド幅を稼ぐ方向で設定しています)。残念ながら、100% 正しいわけではありません。

返信する
Unknown (藤澤)
2009-12-05 03:00:10
cpuid 命令の結果だけですと、100% 正しい結果を得るのは難しいでしょうか。ハイパースレッディングの検知も必要ですね。
返信する
Unknown (後藤)
2009-12-05 06:14:57
GotoBLAS ではハイパースレッディングを検出してスレッドの重複割り当てを防ぐ仕組みを入れてあります。ユーザが生成したスレッドが割り当てられると終わりですけど。

本当はアプリケーション側が完全な制御を行うべきなのですが、誰もやってくれないというが現実です。

返信する

コメントを投稿

ブログ作成者から承認されるまでコメントは反映されません。

Weblog」カテゴリの最新記事