OpenMP 実行時ライブラリにはスレッドがプールされていて、並列領域内でのスレーブスレッドとして使用されます。OMP_THREAD_LIMIT 環境変数の設定は、プール内のスレッド数を制御します。デフォルトでは、プール内のスレッド数は最大で 1023 個です。
プールにあるのは、実行時ライブラリが作成した非ユーザースレッドだけです。最初のスレッドやユーザーのプログラムが明示的に作成したスレッドは含まれません。
OMP_THREAD_LIMIT が 1 に設定されている場合 (または SUNW_MP_MAX_POOL_THREADS がゼロに設定されている場合)、スレッドプールは空になり、すべての並列領域は 1 つのスレッドによって実行されます。
次の例では、プール内のスレッド数が不十分な場合、並列領域で取得されるスレッド数も少なくなることを示しています。ここでも、前の例と同じコードを使用します。アクティブ化されるすべての並列領域に必要な同時スレッドの数は、8 個です。つまり、プールには少なくとも 7 個のスレッドが含まれている必要があります。OMP_THREAD_LIMIT を 6 に設定した場合 (または SUNW_MP_MAX_POOL_THREADS を 5 に設定した場合)、プールには最大で 5 個のスレーブスレッドが含まれます。これは、内側から数えて 4 つの並列領域のうち 2 つが、必要な数のスレーブスレッドを取得できないことを示します。実行結果はさまざまですが、1 つの例を見てみましょう。
% setenv OMP_NESTED TRUE % OMP_THREAD_LIMIT 6 % 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 |