環境変数 OMP_MAX_ACTIVE_LEVELS は、アクティブな並列領域をいくつまで入れ子にすることができるかを制御します。並列領域がアクティブであると見なされるのは、複数のスレッドで構成されているチームによって実行される場合です。設定しない場合、デフォルト値は 4 です。
この環境変数を設定しても、入れ子になったアクティブな並列領域の最大数が制御されるだけで、入れ子並列処理は有効になりません。入れ子並列を有効にするには、OMP_NESTED を TRUE に設定するか、true() と評価される引数を指定して omp_set_nested を呼び出す必要があります。
次のコード例では、4 重の入れ子並列領域を作成しています。
#include <omp.h> #include <stdio.h> #define DEPTH 4 void report_num_threads(int level) { #pragma omp single { printf("Level %d: number of threads in the team = %d\n", level, omp_get_num_threads()); } } void nested(int depth) { if (depth > DEPTH) return; #pragma omp parallel num_threads(2) { report_num_threads(depth); nested(depth+1); } } int main() { omp_set_dynamic(0); omp_set_nested(1); nested(1); return(0); }
次の出力は、DEPTH に 4 を設定してコード例をコンパイルおよび実行した場合の可能性のある結果を示しています。実際の結果は、オペレーティングシステムがどのようにスレッドをスケジューリングしているかによって異なります。
% setenv OMP_NESTED TRUE % setenv OMP_MAX_ACTIVE_LEVELS 4 % a.out | sort Level 1: number of threads in the team = 2 Level 2: number of threads in the team = 2 Level 2: number of threads in the team = 2 Level 3: number of threads in the team = 2 Level 3: number of threads in the team = 2 Level 3: number of threads in the team = 2 Level 3: number of threads in the team = 2 Level 4: number of threads in the team = 2 Level 4: number of threads in the team = 2 Level 4: number of threads in the team = 2 Level 4: number of threads in the team = 2 Level 4: number of threads in the team = 2 Level 4: number of threads in the team = 2 Level 4: number of threads in the team = 2 Level 4: number of threads in the team = 2
OMP_MAX_ACTIVE_LEVELS を 2 に設定すると、3 番目と 4 番目の深さにある入れ子並列領域は 1 つのスレッドによって実行されます。次の例は、可能性のある結果を示しています。
% setenv OMP_NESTED TRUE % setenv OMP_MAX_ACTIVE_LEVELS 2 % a.out |sort Level 1: number of threads in the team = 2 Level 2: number of threads in the team = 2 Level 2: number of threads in the team = 2 Level 3: number of threads in the team = 1 Level 3: number of threads in the team = 1 Level 3: number of threads in the team = 1 Level 3: number of threads in the team = 1 Level 4: number of threads in the team = 1 Level 4: number of threads in the team = 1 Level 4: number of threads in the team = 1 Level 4: number of threads in the team = 1