Oracle® Developer Studio 12.5: OpenMP API ユーザーズガイド

印刷ビューの終了

更新: 2016 年 7 月
 
 

2.2 OpenMP 環境変数

OpenMP 仕様では、OpenMP プログラムの実行を制御する環境変数がいくつか定義されています。詳細は、http://openmp.org にある OpenMP 4.0 の仕様を参照してください。Oracle Developer Studio での OpenMP 環境変数の実装に関する情報については、OpenMP の実装によって定義される動作を参照してください。

Oracle Developer Studio は、OpenMP 仕様に含まれていない追加の環境変数をサポートしており、それらはOracle Developer Studio の環境変数にまとめられています。


注 -  OpenMP および autopar プログラム用のスレッド数のデフォルト値は、1 ソケットあたりのコア数の倍数 (つまり、1 プロセッサチップあたりのコア数) であり、MIN (合計コア数、32) に等しいかそれよりも小さくなります。

2.2.1 OpenMP の環境変数の動作およびデフォルト値

次の表には、Oracle Developer Studio によってサポートされている OpenMP 環境変数の動作、およびそれらのデフォルト値が記載されています。環境変数に指定する値は、大文字と小文字が区別されないため、大文字でも小文字でもかまいません。

環境変数
動作、デフォルト値、および例
OMP_SCHEDULE
OMP_SCHEDULE に指定されたスケジュール型が有効な型 (staticdynamicguidedautosunw_mp_sched_reserved) ではない場合、環境変数が無視され、デフォルトのスケジュール (チャンクサイズの指定されていない static) が使用されます。SUNW_MP_WARNTRUE に設定されているか、sunw_mp_register_warn() の呼び出しによりコールバック関数が登録されている場合には、警告メッセージが表示されます。
OMP_SCHEDULE 環境変数に指定されたスケジュール型が staticdynamic、または guided であるが、指定されたチャンクサイズが負の整数の場合、次のようにチャンクサイズが設定されます。static の場合は、チャンクサイズは設定されません。dynamic または guided の場合は、チャンクサイズは 1 になります。SUNW_MP_WARNTRUE に設定されているか、sunw_mp_register_warn() の呼び出しによりコールバック関数が登録されている場合には、警告メッセージが表示されます。
設定しない場合は、デフォルト値の static (チャンクサイズは設定されない) が使用されます。
例: % setenv OMP_SCHEDULE "GUIDED,4"
OMP_NUM_THREADS
OMP_NUM_THREADS に指定された値が正の整数ではない場合、この環境変数は無視されます。SUNW_MP_WARNTRUE に設定されているか、sunw_mp_register_warn() の呼び出しによりコールバック関数が登録されている場合には、警告メッセージが表示されます。
指定された値が、実装でサポートしているスレッド数よりも大きい場合は、次のアクションが実行されます。
  • スレッド数の動的調整が有効になっている場合は、スレッド数が減少します。また、SUNW_MP_WARNTRUE に設定されているか、sunw_mp_register_warn() の呼び出しによりコールバック関数が登録されている場合には、警告メッセージが表示されます。

  • スレッド数の動的調整が無効になっている場合は、エラーメッセージが表示され、プログラムの実行が停止します。

設定しない場合、デフォルトは、1 ソケットあたりのコア数の倍数 (つまり、1 プロセッサチップあたりのコア数) であり、MIN (合計コア数、32) 以下になります。
例: % setenv OMP_NUM_THREADS 16
OMP_DYNAMIC
OMP_DYNAMIC に指定された値が TRUE でも FALSE でもない場合は、その値は無視され、デフォルト値である TRUE が使用されます。SUNW_MP_WARNTRUE に設定されている場合、または sunw_mp_register_warn() の呼び出しによりコールバック関数が登録されている場合は、警告メッセージが表示されます。
設定しない場合、デフォルト値は TRUE です。
例: % setenv OMP_DYNAMIC FALSE
OMP_PROC_BIND
OMP_PROC_BIND に指定された値が、TRUEFALSE、あるいは masterclose、または spread のコンマ区切りのリストではない場合、プロセスはゼロ以外のステータスで終了します。
初期スレッドを OpenMP の場所リストの最初の場所にバインドできない場合、プロセスはゼロ以外のステータスで終了します。
設定しない場合、デフォルトは FALSE です。
例: % setenv OMP_PROC_BIND spread
OMP_PLACES
OMP_PLACES に指定された値が有効ではないか、処理できない場合、プロセスはゼロ以外のステータスで終了します。
設定しない場合、デフォルト値は cores です。
例: % setenv OMP_PLACES sockets
OMP_NESTED
OMP_NESTED に指定された値が TRUE でも FALSE でもない場合、その値は無視され、デフォルト値である FALSE が使用されます。SUNW_MP_WARNTRUE に設定されている場合、または sunw_mp_register_warn() の呼び出しによりコールバック関数が登録されている場合は、警告メッセージが表示されます。
設定しない場合、デフォルトは FALSE です。
例: % setenv OMP_NESTED TRUE
OMP_STACKSIZE
OMP_STACKSIZE に指定された値が指定書式に従っていない場合、その値は無視され、デフォルト値 (32 ビットアプリケーションでは 4M バイト、64 ビットアプリケーションでは 8M バイト) が使用されます。SUNW_MP_WARNTRUE に設定されている場合、または sunw_mp_register_warn() の呼び出しによりコールバック関数が登録されている場合は、警告メッセージが表示されます。
ヘルパースレッドのデフォルトのスタックサイズは、32 ビットアプリケーションでは 4M バイト、64 ビットアプリケーションでは 8M バイトです。
例: % setenv OMP_STACKSIZE 10M
OMP_WAIT_POLICY
スレッドの ACTIVE の動作は、スピンです。スレッドの PASSIVE の動作は、少しの間スピンしたあとでのスリープです。
設定しない場合、デフォルト値は PASSIVE です。
例: % setenv OMP_WAIT_POLICY ACTIVE
OMP_MAX_ACTIVE_LEVELS
OMP_MAX_ACTIVE_LEVELS に指定された値が非負整数ではない場合、その値は無視され、デフォルト値 4 が使用されます。SUNW_MP_WARNTRUE に設定されている場合、または sunw_mp_register_warn() の呼び出しによりコールバック関数が登録されている場合は、警告メッセージが表示されます。
設定しない場合、デフォルト値は 4 です。
例: % setenv OMP_MAX_ACTIVE_LEVELS 8
OMP_THREAD_LIMIT
OMP_THREAD_LIMIT に指定された値が正の整数ではない場合、その値は無視され、デフォルト値 1024 が使用されます。SUNW_MP_WARNTRUE に設定されている場合、または sunw_mp_register_warn() の呼び出しによりコールバック関数が登録されている場合は、警告メッセージが表示されます。
設定しない場合、デフォルト値は 1024 です。
例: % setenv OMP_THREAD_LIMIT 128
OMP_CANCELLATION
OMP_CANCELLATION に指定された値が TRUE でも FALSE でもない場合、その値は無視され、デフォルト値である FALSE が使用されます。SUNW_MP_WARNTRUE に設定されている場合、または sunw_mp_register_warn() の呼び出しによりコールバック関数が登録されている場合は、警告メッセージが表示されます。
設定しない場合、デフォルトは FALSE です。
例: % setenv OMP_CANCELLATION TRUE
OMP_DISPLAY_ENV
OMP_DISPLAY_ENV に指定された値が TRUEFALSE、または VERBOSEではない場合、その値は無視され、デフォルト値である FALSE が使用されます。SUNW_MP_WARNTRUE に設定されている場合、または sunw_mp_register_warn() の呼び出しによりコールバック関数が登録されている場合は、警告メッセージが表示されます。
設定しない場合、デフォルトは FALSE です。
例: % setenv OMP_DISPLAY_ENV VERBOSE

2.2.2 Oracle Developer 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 です。詳細は、プロセッサバインディング (スレッドアフィニティー)を参照してください。

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 回明け渡してから休眠状態になります。