Oracle® Solaris Studio 12.4: OpenMP API ユーザーズガイド

印刷ビューの終了

更新: 2014 年 12 月
 
 

2.2.2 Oracle Solaris Studio の環境変数

次に示す追加の環境変数は、OpenMP プログラムの実行に影響を与えますが、OpenMP 仕様には含まれていません。次の環境変数に指定する値は、大文字と小文字が区別されないため、大文字でも小文字でもかまいません。

2.2.2.1 PARALLEL

従来のプログラムとの互換性のために提供されます。PARALLEL 環境変数を設定すると、OMP_NUM_THREADS を設定したのと同じ効果が得られます。

PARALLELOMP_NUM_THREADS の両方を設定する場合は、同じ値に設定する必要があります。

2.2.2.2 SUNW_MP_WARN

OpenMP 実行時ライブラリには、多くの一般的な OpenMP 違反 (領域の不正な入れ子、明示バリアの不正な配置、デッドロック、無効な環境変数の設定など) に関する警告を発行する機能があります。

環境変数 SUNW_MP_WARN は、OpenMP 実行時ライブラリによって発行される警告メッセージを制御します。SUNW_MP_WARN TRUE に設定されている場合、実行時ライブラリは stderr に警告メッセージを発行します。環境変数が FALSE に設定されている場合、実行時ライブラリは警告メッセージを発行しません。デフォルトは FALSE です。

例:

% setenv SUNW_MP_WARN TRUE

また、警告メッセージを受け入れるためにプログラムでコールバック関数が登録されている場合も、実行時ライブラリは警告メッセージを出力します。次の関数を呼び出すことにより、プログラムでコールバック関数を登録できます。

int sunw_mp_register_warn (void (*func)(void *));

コールバック関数のアドレスは、sunw_mp_register_warn() への引数として渡されます。sunw_mp_register_warn() は、コールバック関数が正常に登録された場合は 0、失敗した場合は 1 を返します。

プログラムでコールバック関数が登録されている場合、実行時ライブラリは登録済みの関数を呼び出し、警告メッセージを含むローカライズされた文字列のポインタを渡します。ポインタが指しているメモリーは、コールバック関数から戻ると無効になります。


注 -  実行時チェックを有効にして、OpenMP 実行時ライブラリからの警告メッセージを表示するには、プログラムのテストまたはデバッグ中に SUNW_MP_WARNTRUE を設定します。実行時チェックを使用すると、プログラムの実行にオーバーヘッドが加わることに注意してください。

2.2.2.3 SUNW_MP_THR_IDLE

処理の待機中 (アイドル) またはバリアで待機中の OpenMP プログラムのスレッドの動作を制御します。次のいずれかの値を設定できます。SPINSLEEPSLEEP(time s)SLEEP(time ms)SLEEP(time mc)time は時間を指定する整数で、s、ms、および mc は時間の単位 (それぞれ、秒、ミリ秒、マイクロ秒) を指定するオプションの接尾辞です。時間単位が指定されていない場合は、秒が使用されます。

SPIN は、処理の待機中 (アイドル) またはバリアで待機中に、スレッドがスピンすることを指定します。time パラメータなしで SLEEP を指定すると、待機中のスレッドはすぐにスリープ状態になります。time パラメータ付きで SLEEP を指定すると、スレッドは指定した時間スピンを継続し、そのあとスリープ状態になります。

デフォルトでは、しばらくスピンして待機したあとにスリープになります。SLEEP、SLEEP(0)、SLEEP(0s)、SLEEP(0ms)、および SLEEP(0mc) はすべて同じです。

SUNW_MP_THR_IDLEOMP_WAIT_POLICY の両方を設定した場合、OMP_WAIT_POLICY は無視されます。

例:

% setenv SUNW_MP_THR_IDLE SPIN 
% setenv SUNW_MP_THR_IDLE SLEEP

次に示すものはすべて同等です。

% setenv SUNW_MP_THR_IDLE SLEEP(5)
% setenv SUNW_MP_THR_IDLE SLEEP(5s)
% setenv SUNW_MP_THR_IDLE SLEEP(5000ms)
% setenv SUNW_MP_THR_IDLE SLEEP(5000000mc)

2.2.2.4 SUNW_MP_PROCBIND

SUNW_MP_PROCBIND 環境変数を使用すると、実行しているシステムのハードウェアスレッドに OpenMP スレッドをバインドできます。プロセッサバインディングによりパフォーマンスを向上させることができますが、同じハードウェアスレッドに複数のスレッドがバインドされると、パフォーマンスが低下します。SUNW_MP_PROCBINDOMP_PROC_BIND の両方を設定することはできません。SUNW_MP_PROCBIND を設定しない場合、デフォルト値は FALSE です。詳細は、Chapter 5, プロセッサバインディング (スレッドアフィニティー)を参照してください。

2.2.2.5 SUNW_MP_MAX_POOL_THREADS

OpenMP ヘルパースレッドプールの最大サイズを指定します。OpenMP ヘルパースレッドは、並列領域で処理を行うために OpenMP 実行時ライブラリによって作成されるスレッドです。ヘルパースレッドプールには、最初の (メイン) スレッドやユーザーのプログラムが明示的に作成したスレッドは含まれません。この環境変数をゼロに設定すると、OpenMP ヘルパースレッドプールは空になり、すべての並列領域は最初の (メイン) スレッドによって実行されます。設定しない場合、デフォルト値は 1023 です。詳細は、入れ子並列処理の制御を参照してください。

SUNW_MP_MAX_POOL_THREADS はプログラムで使用される非ユーザーの OpenMP スレッドの最大数を指定し、OMP_THREAD_LIMIT はプログラムで使用されるユーザーおよび非ユーザーの OpenMP スレッドの最大数を指定するものである点に留意してください。SUNW_MP_MAX_POOL_THREADSOMP_THREAD_LIMIT の両方を設定する場合は、同じ値を設定する必要があります。OMP_THREAD_LIMIT の値は、SUNW_MP_MAX_POOL_THREADS の値より 1 大きい必要があります。

2.2.2.6 SUNW_MP_MAX_NESTED_LEVELS

入れ子になったアクティブな並列領域の最大数を設定します。並列領域がアクティブであると見なされるのは、複数のスレッドで構成されているチームによって実行される場合です。SUNW_MP_MAX_NESTED_LEVELS を設定しない場合、デフォルト値は 4 です。詳細は、入れ子並列処理の制御を参照してください。

2.2.2.7 STACKSIZE

各 OpenMP ヘルパースレッドのスタックサイズを設定します。この環境変数は、オプションの接尾辞 B、K、M、または G の付いた数値も受け付けます。これらの接尾辞はそれぞれ、バイト、キロバイト、メガバイト、ギガバイトを表します。接尾辞を指定しない場合、デフォルトはキロバイトです。

設定しない場合、デフォルトの OpenMP ヘルパースレッドスタックサイズは、32 ビットアプリケーションでは 4M バイト、64 ビットアプリケーションでは 8M バイトです。

例:

% setenv STACKSIZE 8192  <- sets the OpenMP helper thread stack size to 8 Megabytes
% setenv STACKSIZE 16M   <- sets the OpenMP helper thread stack size to 16 Megabytes

STACKSIZEOMP_STACKSIZE の両方を設定する場合は、同じ値に設定する必要がある点に留意してください。

2.2.2.8 SUNW_MP_GUIDED_WEIGHT

guided スケジュールが設定されたループのチャンクサイズを決定する重み係数を設定します。 値には、正の浮動小数点数を指定します。この値は、同一プログラム中で guided スケジュールが設定されたループすべてに適用されます。設定しない場合、デフォルトの重み計数は 2.0 です。

schedule(guided, chunk_size) 節を for/do ディレクティブとともに指定した場合、スレッドがループの繰り返しを要求したときにループの繰り返しがチャンク内のスレッドに割り当てられ、チャンクサイズは chunk_size まで減少します (最後のチャンクはより小さいサイズになることがあります)。スレッドは繰り返しのチャンクを実行し、割り当てるチャンクがなくなるまで別のチャンクを要求します。chunk_size が 1 の場合、各チャンクのサイズは未割り当ての繰り返しの数をスレッド数で除算した数に比例し、1 まで減少します。chunk_sizek (k は 1 より大きい値) の場合、各チャンクのサイズは同様に決定されますが、最後のチャンクを除いて、各チャンクに k 回未満の繰り返しは含まれていないという制限があります。chunk_size が指定されていない場合、デフォルト値は 1 です。

OpenMP 実行時ライブラリ libmtsk.so は、次の計算式を使用して、guided スケジュールが設定されたループのチャンクサイズを計算します。

chunk_size = num-unassigned-iters / (guided-weight * num-threads)
  • num-unassigned-iters は、スレッドにまだ割り当てられていないループの繰り返し回数です。

  • guided-weight は、SUNW_MP_THR_GUIDED_WEIGHT 環境変数によって指定された重み計数です (またはこの環境変数が設定されていない場合は 2.0)。

  • num-threads は、ループを実行するために使用されるスレッドの数です。

具体的に説明するため、guided スケジュールが設定されている、繰り返しが 100 回のループがあるとします。num-threads = 4、重み係数 = 1.0 の場合、チャンクサイズは次のようになります。

25, 18, 14, 10, 8, 6, 4, 3, 3, 2, 1,...

また、num-threads= 4、重み係数 = 2.0 の場合、チャンクサイズは次のようになります。

12, 11, 9, 8, 7, 6, 5, 5, 4, 4, 3,...

2.2.2.9 SUNW_MP_WAIT_POLICY

プログラム内の処理を待機 (アイドル) するスレッド、バリアで待機するスレッド、およびタスクの完了を待機する OpenMP スレッドの動作を細かく制御できるようにします。これらの待ち状態の動作には、しばらくの間スピンする、しばらくの間プロセッサを明け渡す、呼び起こされるまで休眠状態になるの 3 つがあります。

構文 (csh を使用して示します) は次のとおりです。

% setenv SUNW_MP_WAIT_POLICY "IDLE=val:BARRIER=val:TASKWAIT=val"

IDLEBARRIER、および TASKWAIT は、制御する待機の種類を指定するためのオプションのキーワードです。IDLE は処理を待機することを指します。BARRIER は、明示バリアまたは暗黙バリアで待機することを指します。TASKWAIT は、taskwait 領域で待機することを指します。これらの各キーワードのあとには、キーワード SPINYIELD、または SLEEP を使用して待機の動作を指定する val 設定が続きます。

SPIN(time) は、プロセッサを明け渡すまでに、待機中のスレッドがスピンする時間を指定します。time は秒、ミリ秒、またはマイクロ秒で指定します (それぞれ smsmc で指定します)。time の単位が指定されていない場合は、秒が使用されます。SPINtime パラメータが設定されていない場合、待機中のスレッドは継続的にスピンします。

YIELD(number) は、休眠状態になる前にスレッドがプロセッサを明け渡す回数を指定します。プロセッサが明け渡されたあと、オペレーティングシステムの実行予定時間になると、スレッドは再度実行されます。YIELDnumber パラメータが指定されていない場合、待機中のスレッドは継続的にプロセッサを明け渡します。

SLEEP は、待機中のスレッドをただちに休眠状態にすることを指定します。

特定の種類の待ち状態に対し、SPINSLEEP、および YIELD 設定は任意の順序で指定できます。設定はコンマで区切る必要があります。"SPIN(0),YIELD(0)" は、"YIELD(0),SPIN(0)" と同じであり、SLEEP またはすぐにスリープ状態になることと同等です。IDLEBARRIER、および TASKWAIT の設定を処理する場合、「一番左を最優先」規則が適用されます。「いちばん左を最優先」規則は、同じ種類の待機に異なる値が指定された場合、左端の値が適用されることを意味します。次の例では、IDLE に 2 つの値が指定されます。最初が SPIN で、2 番目は SLEEP です。SPIN が最初に指定されているため (文字列のいちばん左側にあります)、この値が OpenMP 実行時ライブラリによって適用されます。

% setenv SUNW_MP_WAIT_POLICY "IDLE=SPIN:IDLE=SLEEP"
 

SUNW_MP_WAIT_POLICYOMP_WAIT_POLICY の両方を設定した場合、OMP_WAIT_POLICY は無視されます。

例 1:

% setenv SUNW_MP_WAIT_POLICY “BARRIER=SPIN”

バリアーで待ち状態のスレッドは、チーム内のすべてのスレッドがバリアーに到達するまでスピンします。

例 2:

% setenv SUNW_MP_WAIT_POLICY “IDLE=SPIN(10ms),YIELD(5)”

処理待ち状態 (アイドル) のスレッドは 10 ミリ秒スピンし、休眠状態になるまでプロセッサを 5 回明け渡します。

例 3:

% setenv SUNW_MP_WAIT_POLICY “IDLE=SPIN(2s),YIELD(2):BARRIER=SLEEP:TASKWAIT=YIELD(10)”

処理待ち状態 (アイドル) のスレッドは 2 秒スピンし、休眠状態になるまでプロセッサを 2 回明け渡します。バリアで待ち状態のスレッドはただちに休眠状態になります。taskwait で待ち状態のスレッドは、プロセッサを 10 回明け渡してから休眠状態になります。