読者です 読者をやめる 読者になる 読者になる

HPCメモ

HPC(High Performance Computing)に関連したりしなかったりすることのメモ書き

CPU affinityの制御

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でやってくれってことでしょうかね