OpenMPを使ったスレッド並列プログラム実行時のaffinity制御方法を、以前blogに書いたような気がするんだけど、検索しても出てこなかったので、改めてメモしておきます。
CPU bindの方法
CPU coreに対してスレッドをバインドする(=マイグレーションさせない)ためには、
実行時にそれぞれ以下の環境変数を設定します。
Intelコンパイラ
無し(のはず)
後述のKMP_AFFINITYを設定すれば、自動的にバインドされるんですが、特定のcoreの中だけで自由にマイグレーションしても良いなんていう設定はありません。*1
PGIコンパイラ
MP_BIND=yes
GCC
OMP_PROC_BIND=TRUE
どのコアを使うか明示的に指定する方法
こちらも同じく実行時の環境変数で設定します。
Intelコンパイラ
KMP_AFFINITY={compact|scatter|explicit}
compactを設定すると、なるべく使用するコアが密集するように選ばれ、scatterを設定すると分散するように選ばれる。
explicitの場合は、後述のPGIコンパイラやGCCのように明示的に指定されたcore idのみが使われます。
PGIコンパイラ
MP_BLIST={0, 2, 4}
リストにあるcore idのコアのみを使って実行
GCC
GOMP_CPU_AFFINITY="0 3 1-2 4-15:2"
リストにあるcore id(0, 3, 1, 2, 4, 6, 8, 10, 12, 14)のコアのみを使う
生成したスレッド数に対して、リストにあるcoreが足りなければ、先頭に戻ってさらに順次割り当てられます。
参考資料:
Intel
Thread Affinity Interface (Linux* and Windows*)
GCC
OMP_PROC_BIND - GNU libgomp
GOMP_CPU_AFFINITY - GNU libgomp
*1:必要だったらnumctlでやってくれってことでしょうかね