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

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

この章では、OpenMP 3.0 仕様の、実装に依存する特定の動作について説明します。

3.1 タスクスケジューリングポイント

拘束を受けていないタスク領域にあるタスクスケジューリングポイントは、拘束されたタスク領域と同じポイントで発生します。このため、拘束を受けていないタスク領域内では、タスクスケジューリングポイントは次の場所にのみ現れます。

3.2 メモリーモデル

複数スレッドから同じ変数への非同期のメモリーアクセスが、互いのそれぞれのアクセスに対して不可分なものになる保証はありません。アクセスが不可分にものなるかどうかは、実装依存、およびアプリケーション依存の要因による影響を受けます。変数によっては、対象プラットフォームでの最大の不可分なメモリー動作よりも大きい場合があります。変数によっては、不正な境界整列が行われていたり境界が不明である場合があります。その場合、コンパイラまたは実行時システムがその変数にアクセスするためには、複数回の読み込みおよび格納が必要になることがあります。より多くの読み込みと格納を使用する、高速なコードシーケンスもあります。

3.3 内部制御変数

次の内部制御変数は、実装時に定義されます。

3.4 スレッドの動的調整

実装後には、スレッド数を動的に調整する機能があります。動的調整の機能はデフォルトで有効に設定されています。OMP_DYNAMIC 環境変数を FALSE に設定するか、引数を適切に指定して omp_set_dynamic() ルーチンを呼び出して、動的調整を無効にします。

スレッドが並列構文を検出したときにこの実装により提供されるスレッド数は、OpenMP 3.0 仕様の 35 - 36 ページに記載されたアルゴリズム 2.1 に従って決定されます。システムリソースの不足時などの例外的な状況では、与えられるスレッドの数はアルゴリズム 2.1 で求めた数よりも少なくなることがあります。このような状況では、 SUNW_MP_WARNTRUE に設定されているか、コールバック関数が sunw_mp_register_warn() の呼び出しにより登録されている場合でも、警告メッセージが表示されます。

3.5 ループ指令

収縮されたループの繰り返し回数の計算に使われる整数型は long です。

run-sched-var 内部制御変数が auto に設定されているときの schedule(runtime) 節の効果は、チャンクサイズを指定しないときの static と同じです。

3.6 コンストラクト

3.6.1 SECTIONS

コンストラクトの節にある構造化ブロックは、チャンクサイズが指定されていない形式の static 状態のチームに含まれるスレッドに割り当てられます。そのため、各スレッドはほぼ同数の連続する構造化ブロックを取得します。

3.6.2 SINGLE

singleコンストラクトを検出した最初のスレッドが、コンストラクトを実行します。

3.6.3 ATOMIC

critical コンストラクトと名付けられた特別なコンストラクトを持つターゲット文を挿入することにより、実装によってすべての atomic 指令が置き換えられます。これにより、プログラム中のすべての atomic 領域間で排他的なアクセスが行われるようになります。これらの領域が同じストレージロケーションを更新するのか、異なるロケーションを更新するのかは関係ありません。

3.7 ルーチン

3.7.1 omp_set_schedule()

Solaris Studio 特有の sunw_mp_sched_reserved スケジュールの動作も、チャンクサイズが指定されていない static の場合と同様です。

3.7.2 omp_set_max_active_levels()

omp_set_max_active_levels() がアクティブな並列領域の内部から呼び出された場合、その呼び出しは無視されます。SUNW_MP_WARNTRUE に設定されている場合、またはコールバック関数が sunw_mp_register_warn() の呼び出しにより登録されている場合は、警告メッセージが表示されます。

omp_set_max_active_levels() の引数が負の整数の場合、呼び出しが無視されます。SUNW_MP_WARNTRUE に設定されている場合、またはコールバック関数が sunw_mp_register_warn() の呼び出しにより登録されている場合は、警告メッセージが表示されます。

3.7.3 omp_get_max_active_levels()

omp_get_max_active_levels() プログラムのどこからでも呼び出すことができます。この呼び出しによって、内部制御変数 max-active-levels-var の値が返されます。

3.8 環境変数

変数名 

実装 

OMP_SCHEDULE

OMP_SCHEDULE に指定されたスケジュール型が有効な型 (staticdynamic guided、または auto) ではない場合、環境変数が無視され、デフォルトのスケジュール (チャンクサイズの指定されていない static 型) が使用されます。SUNW_MP_WARNTRUE に設定されている場合、またはコールバック関数が sunw_mp_register_warn() の呼び出しにより登録されている場合は、警告メッセージが表示されます。

OMP_SCHEDULE 環境変数に指定されたスケジュール型が staticdynamic、または guided であるが、チャンクに指定されたサイズが負の整数の場合、次のようにチャンクサイズが設定されます。static の場合には、チャンクサイズは設定されません。dynamic または guided の場合は、チャンクサイズは 1 になります。SUNW_MP_WARNTRUE に設定されている場合、またはコールバック関数が sunw_mp_register_warn() の呼び出しにより登録されている場合は、警告メッセージが表示されます。

OMP_NUM_THREADS

変数の値が正の整数ではない場合、環境変数は無視されます。また、SUNW_MP_WARNTRUE に設定されているか、sunw_mp_register_warn() の呼び出しによりコールバック関数が登録されている場合には、警告メッセージが表示されます。

変数の値が、実装でサポートしているスレッド数よりも大きい場合は、次のアクションが実行されます。  

- スレッド数の動的調整が有効になっている場合は、スレッド数が減少します。また、SUNW_MP_WARNTRUE に設定されているか、sunw_mp_register_warn() の呼び出しによりコールバック関数が登録されている場合には、警告メッセージが表示されます。

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

OMP_DYNAMIC

OMP_DYNAMIC に指定された値が TRUE でも FALSE でもない場合は、その値は無視され、デフォルト値である TRUE が使用されます。SUNW_MP_WARNTRUE に設定されている場合、またはコールバック関数が sunw_mp_register_warn() の呼び出しにより登録されている場合は、警告メッセージが表示されます。

OMP_NESTED

OMP_NESTED に指定された値が TRUE でも FALSE でもない場合は、その値は無視され、デフォルト値である FALSE が使用されます。SUNW_MP_WARNTRUE に設定されている場合、またはコールバック関数が sunw_mp_register_warn() の呼び出しにより登録されている場合は、警告メッセージが表示されます。

OMP_STACKSIZE

OMP_STACKSIZE に指定された値が指定書式に従っていない場合は、その値は無視され、デフォルト値 (32 ビットアプリケーションでは 4M バイト、64 ビットアプリケーションでは 8M バイト) が使用されます。SUNW_MP_WARNTRUE に設定されている場合、またはコールバック関数が sunw_mp_register_warn() の呼び出しにより登録されている場合は、警告メッセージが表示されます。

OMP_WAIT_POLICY

スレッドの ACTIVE の動作は、スピンです。スレッドの PASSIVE の動作は、少しの間スピンした後でのスリープです。

OMP_MAX_ACTIVE_LEVELS

OMP_MAX_ACTIVE_LEVELS に指定された値が負の整数の場合、その値は無視され、デフォルト値 (4) が使用されます。SUNW_MP_WARNTRUE に設定されている場合、またはコールバック関数が sunw_mp_register_warn() の呼び出しにより登録されている場合は、警告メッセージが表示されます。

OMP_THREAD_LIMIT

OMP_THREAD_LIMIT に指定された値が正の整数ではない場合、その値は無視され、デフォルト値 (1024) が使用されます。SUNW_MP_WARNTRUE に設定されている場合、またはコールバック関数が sunw_mp_register_warn() の呼び出しにより登録されている場合は、警告メッセージが表示されます。

3.9 Fortran の問題

次の事項は、Fortran の場合にのみ適用されます。

3.9.1 THREADPRIVATE 指令

2 つの連続した有効な並列領域間で維持される、スレッド (最初のスレッド以外) の threadprivate オブジェクト内のデータの値の条件がすべては保持されない場合、2 番目の領域の割り当て可能な配列の割り当て状態が「not currently allocated」になることがあります。

3.9.2 SHARED

共有変数を組み込み以外の手続きに渡すと、手続きで参照する前に共有変数の値が一時ストレージにコピーされ、手続きでの参照後に一時ストレージが実際の引数ストレージに戻されるることがあります。一時ストレージとの間のコピーは OpenMP 3.0 仕様の節 2.9.3.2 (88 ページ) の条件 a、b、および c が適用される場合に起こります。すなわち、

3.9.3 実行時ライブラリの定義

この実装では、インクルードファイル omp_lib.h とモジュールファイル omp_lib の両方が提供されます。

Solaris プラットフォームでは、引数をとる OpenMP 実行時ライブラリルーチンが generic インタフェースで拡張されたため、異なる Fortran の KIND 型の引数に対応できます。