2

次のOpenMPリージョンがあるとしましょう。

omp_set_num_threads(3);
#pragma omp parallel for
{
 //start
 ...
 //somewhere in the middle
 ...
 //end
}

私が8コアシステムを持っているとしましょう。たとえば、「開始」の後、スレッド0がコア4で実行され、スレッド1がコア5で実行され、スレッド2がコア6で実行されるとします。スレッドが移行する「終了」の前の「中間」で可能ですか。 「開始」後に割り当てられたそれぞれのコア?つまり、スレッド0〜2が「開始」後にコア4〜5に割り当てられ、「中間のどこか」のスレッドがそれぞれコア5〜7に移行すると言う可能性はありますか?そして、スレッドがコア0〜2の「終了」の直前に存在する可能性さえありますか?ありがとう。

4

1 に答える 1

3

私の知る限り、OpenMP 3.1 仕様はスレッドを再バインドする手段を提供していません。

実際、スレッド バインディングを制御する唯一の方法は、OMP_PROC_BIND環境変数を使用することです。

OMP_PROC_BIND環境変数は、グローバル bind-var ICV の値を設定しますこの環境変数の値はtrueまたはfalseでなければなりません。環境変数がtrueに設定されている場合、実行環境はプロセッサー間で OpenMP スレッドを移動しません。環境変数がfalseに設定されている場合、実行環境は OpenMP スレッドをプロセッサ間で移動する可能性があります。OMP_PROC_BINDの値がtrueでもfalseでもない場合、プログラムの動作は実装定義です。

OpenMP 4.0 ドラフトは、可能な値を拡張しOMP_PROC_BIND、環境変数を追加しOMP_PLACESます。これにより、スレッドをリソースにバインドする方法を選択できます。それでも、スレッドを再バインドする標準的な方法はありません。

この動作がどうしても必要な場合は、hwlocライブラリ、特にCPU バインド部分の使用を検討してください。

于 2013-02-06T08:23:01.557 に答える