Oracle Solaris Studio 12.2: OpenMP API ユーザーガイド

2.2 OpenMP 環境変数

OpenMP 仕様では、OpenMP プログラムの実行を制御する環境変数がいくつか定義されています。これらは、「2.2.1 一般的な OpenMP 環境変数」にまとめてあります。詳細は、openmp.org にある OpenMP API Version 3.0 の仕様を参照してください。OpenMP 仕様に含まれないその他の環境変数は、Solaris Studio コンパイラのこのリリースで定義されています。それらについては、「2.2.2 Solaris Studio 固有の環境変数」を参照してください。

2.2.1 一般的な OpenMP 環境変数

OMP_SCHEDULE

スケジュール型が RUNTIME として指定された DOPARALLEL DOforparallel for の指令またはプラグマのスケジュール型を指定します。

定義しない場合は、デフォルト値の STATIC が使用されます。value"type[,chunk]" という書式で指定します。

例: setenv OMP_SCHEDULE 'GUIDED,4'

OMP_NUM_THREADS

並列領域の実行中に使用するスレッド数を設定します。

この数は num_threads 節または omp_set_num_threads への呼び出しによって上書きできます。

設定しない場合は、デフォルト値の 1 が使用されます。value には必ず正の整数を指定します。

例: setenv OMP_NUM_THREADS 16

OMP_DYNAMIC

並列領域の実行で使用可能なスレッド数の動的調整を有効または無効にします。

設定しない場合は、デフォルト値の TRUE が使用されます。value には、TRUE または FALSE を指定します。

例: setenv OMP_DYNAMIC FALSE

OMP_NESTED

入れ子並列性を有効または無効にします。

value には、TRUE または FALSE を指定します。

デフォルトは FALSE です。

例: setenv OMP_NESTED FALSE

OMP_STACKSIZE

OpenMP により作成されたスレッドのスタックサイズを設定します。

サイズは 通常 K バイト単位の正の整数で指定されます。また、接尾辞 B、K、M、もしくは G を付けて、それぞれバイト、K バイト、M バイト、または G バイト単位で指定することもあります。

例: setenv OMP_STACKSIZE 10M

OMP_WAIT_POLICY

待機中のスレッドに対して望まれるポリシー、ACTIVE または PASSIVE を設定します。

ACTIVE を指定すると、スレッドは待機中にも CPU 時間を消費します。 PASSIVE を指定すると、スレッドは CPU 時間を消費しないか、スリープ状態に入ります。

OMP_MAX_ACTIVE_LEVELS

入れ子になったアクティブな並列領域のレベルの最大数に非負の整数値を設定します。

OMP_THREAD_LIMIT

OpenMP プログラム全体で使用するスレッド数に正の整数を設定します。

2.2.2 Solaris Studio 固有の環境変数

これ以外にも、OpenMP プログラムの実行に影響を与える多重処理に関する環境変数がありますが、OpenMP 仕様には含まれていません。

PARALLEL

従来のプログラムとの互換性のため、PARALLEL 環境変数を設定すると、OMP_NUM_THREADS を設定したのと同じ効果が得られます。ただし、PARALLELOMP_NUM_THREADS の両方に設定する場合は、同じ値を設定する必要があります。

SUNW_MP_WARN

OpenMP の実行時ライブラリで出力される警告メッセージを制御します。SUNW_MP_WARN TRUE に設定されている場合、実行時ライブラリは stderr に警告メッセージを発行します。さらに、実行時ライブラリは、情報を提供するために、すべての環境変数の設定を出力します。環境変数が FALSE に設定されている場合、実行時ライブラリは警告メッセージを発行せず、設定も出力しません。デフォルトは FALSE です。

OpenMP 実行時ライブラリは、不正な入れ子やデッドロックなど、共通の OpenMP 違反を調べることができます。ただし、実行時チェックを使用するとプログラムの実行時にオーバーヘッドが加わります。第 3 章実装によって定義される動作を参照してください。SUNW_MP_WARNTRUE に設定している場合、実行時ライブラリは stderr に警告メッセージを出力します。

次に例を示します。

setenv SUNW_MP_WARN TRUE

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


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

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

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


注 –

プログラムのテストやデバッグを行うときは、SUNW_MP_WARNTRUE に設定してください。これによって、OpenMP 実行時ライブラリからの警告メッセージが表示されるようになります。


SUNW_MP_THR_IDLE

OpenMP プログラムのバリアで待ち状態または新しい並列領域の実行待ち状態のアイドルスレッドの状態を制御します。次のいずれかの値を設定できます。SPINSLEEPSLEEP(times)SLEEP(timems)、または SLEEP(timemc)time には時間を整数で指定し、s、ms、および mc には時間の単位 (それぞれ、秒、ミリ秒、マクロ秒) を指定します。

SPIN を指定すると、アイドルスレッドは、バリアで待機中または新しい並列領域の実行待ちの間スピンをします。時間引数なしで SLEEP を指定すると、アイドルスレッドはすぐにスリープ状態になります。時間引数付きで SLEEP を指定すると、スレッドは指定した時間スピンを継続し、そのあとスリープ状態になります。

デフォルトのアイドルスレッド状態は、スリープ状態ですが、ある程度の時間スピンして待機したあとスリープ状態になることがあります。SLEEP、SLEEP(0)、SLEEP(0s)、SLEEP(0ms)、および SLEEP(0mc) はすべて同じです。

次に例を示します。


setenv SUNW_MP_THR_IDLE SPIN 
setenv SUNW_MP_THR_IDLE SLEEP 
setenv SUNW_MP_THR_IDLE SLEEP(2s) 
setenv SUNW_MP_THR_IDLE SLEEP(20ms) 
setenv SUNW_MP_THR_IDLE SLEEP(150mc)
SUNW_MP_PROCBIND

この環境変数は、Solaris および Linux システムの両方で使用されます。SUNW_MP_PROCBIND 環境変数を使用して OpenMP プログラムのスレッドを実行中のシステムの仮想プロセッサに結合できます。プロセッサに結合することでパフォーマンスを向上することができますが、同じ仮想プロセッサに複数のスレッドが結合されると、パフォーマンスが低下します。詳細は、「2.3 プロセッサ結合」を参照してください。

SUNW_MP_MAX_POOL_THREADS

スレッドプールの最大数を指定します。プールにあるのは、OpenMP ライブラリが作成した非ユーザースレッドだけです。マスタースレッドやユーザーのプログラムが明示的に作成したスレッドは含まれません。この環境変数をゼロに設定すると、スレッドのプールは空になり、すべての並列領域は 1 つのスレッドによって実行されます。指定しない場合のデフォルトは、1023 です。詳細は、「4.2 入れ子並列処理の制御」を参照してください。

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 だけ大きい数値に設定します。

SUNW_MP_MAX_NESTED_LEVELS

有効な入れ子になった並列領域の深さの最大数を指定します。この環境変数で指定した数を超える有効な入れ子を持つ並列領域は、1 つのスレッドによって実行されます。if 節が False になっている OpenMP 並列領域の場合は、その並列領域は無効であると見なされます。指定しない場合のデフォルトは、4 です。詳細は、「4.2 入れ子並列処理の制御」を参照してください。

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

STACKSIZE

各スレッドのスタックサイズを設定します。値はキロバイト単位で指定します。デフォルトのスレッドスタックサイズは、32 ビット SPARC V8 および x86 プラットフォームで 4M バイト、64 ビット SPARC V9 および x86 プラットフォームで 8M バイトです。

次に例を示します。

setenv STACKSIZE 8192 スタックサイズを 8 MB に設定します。

STACKSIZE 環境変数は、接尾辞 BKM、または G の付いた数値も受け付けます。これらの接尾辞はそれぞれ、バイト、キロバイト、メガバイト、ギガバイトを表します。デフォルトはキロバイトです。

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

SUNW_MP_GUIDED_WEIGHT

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

SUNW_MP_WAIT_POLICY

作業待ち状態 (アイドル)、バリアーで待ち状態、またはタスク待ち状態のスレッドの動作を制御します。これらの待ち状態の動作には、しばらくの間スピンする、しばらくの間 CPU 資源を明け渡す、または呼び起こされるまで休眠状態になる、の 3 つがあります。

構文は次のとおりです (csh で表示)。

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

IDLE=valBARRIER= val、および TASKWAIT= val は、制御される待機の種類を指定する、オプションのキーワードです。

これらのキーワードに対し、それぞれ val 設定があり、これによって待機中の動作、つまり SPINYIELD、または SLEEP が指定されます。

SPIN(time) は、CPU 資源を明け渡すまでに、スレッドがスピンする時間を指定します。time は秒、ミリ秒、またはマイクロ秒で指定します (それぞれ sms、および mc で指定します)。時間単位が指定されていなければ、秒が使用されます。SPIN に時間パラメータが設定されていなければ、待機中のスレッドは継続的にスピンします。

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

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

特定の種類の待ち状態に対し、SPINSLEEP、および YIELD 設定は任意の順序で指定できます。設定はコンマで区切ります。"SPIN(0),YIELD(0)" は、SLEEP、つまり、即座に休眠状態にするのと同じです。IDLEBARRIER、および TASKWAIT の設定を処理する場合、「一番左を最優先」規則が適用されます。

次に例を示します。

% setenv SUNW_MP_WAIT_POLICY “BARRIER=SPIN”

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

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

作業待ち状態 (アイドル) のスレッドは 10 ミリ秒スピンし、休眠状態になるまで CPU 資源を 5 回明け渡します。

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

作業待ち状態 (アイドル) のスレッドは 10 ミリ秒スピンし、休眠状態になるまで CPU 資源を 2 回明け渡します。バリアーで待ち状態のスレッドはただちに休眠状態になります。taskwait で待ち状態のスレッドは、CPU 資源を 10 回明け渡してから休眠状態になります。