JavaScript is required to for searching.
ナビゲーションリンクをスキップ
印刷ビューの終了
Oracle Solaris Studio 12.3: OpenMP API ユーザーガイド     Oracle Solaris Studio 12.3 Information Library (日本語)
search filter icon
search icon

ドキュメントの情報

はじめに

1.  OpenMP API について

2.  OpenMP プログラムのコンパイルと実行

2.1 コンパイラオプション

2.2 OpenMP 環境変数

2.2.1 OpenMP 環境変数のデフォルト

2.2.2 Oracle Solaris Studio の環境変数

2.2.2.1 PARALLEL

2.2.2.2 SUNW_MP_WARN

2.2.2.3 SUNW_MP_THR_IDLE

2.2.2.4 SUNW_MP_PROCBIND

2.2.2.5 SUNW_MP_MAX_POOL_THREADS

2.2.2.6 SUNW_MP_MAX_NESTED_LEVELS

2.2.2.7 STACKSIZE

2.2.2.8 SUNW_MP_GUIDED_WEIGHT

2.2.2.9 SUNW_MP_WAIT_POLICY

2.3 プロセッサ結合

2.3.1 仮想および論理プロセッサ ID

2.3.2 SUNW_MP_PROCBIND に指定された値の解釈

2.3.3 OS プロセッサセットとの相互作用

2.4 スタックとスタックサイズ

2.5 OpenMP プログラムの確認と分析

3.  実装によって定義される動作

4.  入れ子並列処理

5.  タスク化

6.  変数の自動スコープ宣言

7.  スコープチェック

8.  パフォーマンス上の検討事項

A.  指令での節の記述

索引

2.2 OpenMP 環境変数

OpenMP 仕様では、OpenMP プログラムの実行を制御する環境変数がいくつか定義されています。詳細は、http://openmp.org にある OpenMP API Version 3.1 の仕様を参照してください。Oracle Solaris Studio コンパイラによる OpenMP 環境変数の実装の詳細については、「3.8 環境変数」も参照してください。

Oracle Solaris Studio コンパイラで定義されている、OpenMP 仕様に含まれないその他の環境変数については、「2.2.2 Oracle Solaris Studio の環境変数」を参照してください。

2.2.1 OpenMP 環境変数のデフォルト

この節では、OpenMP 環境変数のデフォルトについて説明します。

OMP_SCHEDULE

設定しない場合は、デフォルト値の STATIC が使用されます。

例: setenv OMP_SCHEDULE 'GUIDED,4'

OMP_NUM_THREADS

設定しない場合は、デフォルト値の 2 が使用されます。

例: setenv OMP_NUM_THREADS 16

OMP_DYNAMIC

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

例: setenv OMP_DYNAMIC FALSE

OMP_NESTED

設定しない場合、デフォルトは FALSE です。

例: setenv OMP_NESTED FALSE

OMP_STACKSIZE

デフォルトは、32 ビットアプリケーションでは 4M バイト、64 ビットアプリケーションでは 8M バイトです。

例: setenv OMP_STACKSIZE 10M

OMP_WAIT_POLICY

設定しない場合、デフォルトは PASSIVE です。

OMP_MAX_ACTIVE_LEVELS

設定しない場合、デフォルトは 4 です。

OMP_THREAD_LIMIT

設定しない場合、デフォルトは 1024 です。

OMP_PROC_BIND

設定しない場合、デフォルトは FALSE です。

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

例:

setenv SUNW_MP_WARN TRUE

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

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

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

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


注 - OpenMP 実行時ライブラリは、不正な入れ子やデッドロックなど、共通の OpenMP 違反を調べることができます。ただし、実行時チェックを使用するとプログラムの実行にオーバーヘッドが加わります。プログラムのテストやデバッグを行うときに OpenMP 実行時ライブラリからの警告メッセージを表示できるようにするには、SUNW_MP_WARNTRUE に設定します。


2.2.2.3 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) はすべて同じです。

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(2s) setenv SUNW_MP_THR_IDLE SLEEP(20ms) setenv SUNW_MP_THR_IDLE SLEEP(150mc)

2.2.2.4 SUNW_MP_PROCBIND

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

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

2.2.2.6 SUNW_MP_MAX_NESTED_LEVELS

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

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

2.2.2.7 STACKSIZE

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

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

例:

 setenv STACKSIZE 8192  // sets the thread stack size to 8 Megabytes
 setenv STACKSIZE 16M  // sets the thread stack size to 16 Megabytes

STACKSIZE OMP_STACKSIZE の両方を設定する場合は、両者は同じ値に設定される必要がある点に留意してください。値が同じでない場合は実行時エラーが発生します。

2.2.2.8 SUNW_MP_GUIDED_WEIGHT

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

2.2.2.9 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 の設定を処理する場合、「一番左を最優先」規則が適用されます。

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

例:

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