Sun Studio 12: OpenMP API ユーザーズガイド

2.3 OpenMP 環境変数

OpenMP 仕様では、OpenMP プログラムの実行を制御する環境変数が 4 つ定義されています。これらの環境変数を次の表に示します。

表 2–1 OpenMP 環境変数

環境変数 

関数 

OMP_SCHEDULE

スケジュール型が RUNTIME として指定された DOPARALLEL DOforparallel for の指令またはプラグマのスケジュール型を設定します。定義しない場合は、デフォルト値の STATIC が使用されます。value"type[,chunk]" と いう書式で指定します。

例: setenv OMP_SCHEDULE 'GUIDED,4'

OMP_NUM_THREADS または PARALLEL

並列領域の実行中に使うスレッドの数を設定します。この数は NUM_THREADS 句または OMP_SET_NUM_THREADS() への呼び出しによって上書きできます。設定しない場合は、デフォルト値の 1 が使用されます。value には必ず正の整数を指定します。従来のプログラムとの互換性のため、PARALLEL 環境変数を設定すると OMP_NUM_THREADS を設定するのと同じ効果が得られます。ただし、それらが共に異なる値に設定されると、実行時ライブラリはエラーメッセージを発行します。

例: 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

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

表 2–2 並列処理関係の環境変数

環境変数 

関数 

SUNW_MP_WARN

OpenMP の実行時ライブラリで出力される警告メッセージを制御します。TRUE に設定した場合は、実行時ライブラリの警告メッセージが stderr に出力されます。 FALSE に設定した場合は、警告メッセージが無効になります。デフォルトは FALSE です。

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

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


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

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

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

例:  

setenv SUNW_MP_WARN TRUE

SUNW_MP_THR_IDLE

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

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

デフォルトのアイドルスレッド状態は、スリープ状態ですが、ある程度の時間スピンして待機したあとスリープ状態になることがあります。SLEEPSLEEP(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 システム上でのみ有効です。SUNW_MP_PROCBIND 環境変数を使用して OpenMP プログラムのスレッドを実行中のシステムの仮想プロセッサに結合できます。プロセッサに結合することでパフォーマンスを向上することができますが、同じ仮想プロセッサに複数のスレッドが結合されると、パフォーマンスが低下します。詳細は、「2.4 Solaris でのプロセッサ結合」を参照してください。

SUNW_MP_MAX_POOL_THREADS

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

SUNW_MP_MAX_NESTED_LEVELS

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

STACKSIZE

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

例:  

setenv STACKSIZE 8192 スレッドのスタックサイズを 8M バイトに設定します。

STACKSIZE 環境変数には、接尾辞がそれぞれバイト、キロバイト、メガバイト、ギガバイトを表す B、K、M、または G の数値も指定できます。デフォルトはキロバイトです。

SUNW_MP_GUIDED_WEIGHT

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