OpenMP 実行時ライブラリにはスレッドがプールされていて、並列領域内でのスレーブスレッドとして使用されます。SUNW_MP_MAX_POOL_THREADS 環境変数を設定することで、プールに保存しておけるスレッドの最大数を制限できます。この変数のデフォルト値は 1023 です。
プールにあるのは、実行時ライブラリが作成した非ユーザースレッドだけです。最初のスレッドやユーザーのプログラムが明示的に作成したスレッドは含まれません。この環境変数をゼロに設定すると、スレッドのプールは空になり、すべての並列領域は 1 つのスレッドによって実行されます。
次の例では、プールに充分な数のスレッドがない場合に並列領域で使用されるスレッドが少なくなるケースを挙げています。コードそのものは前述の例と同じです。同時にすべての並列領域が有効になるために必要なスレッドの数は 8 です。このとき、プールには最小でも 7 つのスレッドが必要です。ここで SUNW_MP_MAX_POOL_THREADS 変数を 5 に設定すると、もっとも内側の入れ子にある 4 つの並列領域のうち、2 つは必要な数のスレーブスレッドを取得できない場合があります。実行結果はさまざまですが、1 つの例を見てみましょう。
% setenv OMP_NESTED TRUE % setenv SUNW_MP_MAX_POOL_THREADS 5 % a.out 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 - 1 Level 3: number of threads in the team - 1 |