この章では、OpenMP 3.0 仕様の、実装に依存する特定の動作について説明します。
拘束を受けていないタスク領域にあるタスクスケジューリングポイントは、拘束されたタスク領域と同じポイントで発生します。このため、拘束を受けていないタスク領域内では、タスクスケジューリングポイントは次の場所にのみ現れます。
検出されたタスク構造
検出された taskwait 構文
検出されたバリアー指令
暗黙のバリアー領域
拘束を受けていないタスク領域の最後
複数スレッドから同じ変数への非同期のメモリーアクセスが、互いのそれぞれのアクセスに対して不可分なものになる保証はありません。アクセスが不可分にものなるかどうかは、実装依存、およびアプリケーション依存の要因による影響を受けます。変数によっては、対象プラットフォームでの最大の不可分なメモリー動作よりも大きい場合があります。変数によっては、不正な境界整列が行われていたり境界が不明である場合があります。その場合、コンパイラまたは実行時システムがその変数にアクセスするためには、複数回の読み込みおよび格納が必要になることがあります。より多くの読み込みと格納を使用する、高速なコードシーケンスもあります。
次の内部制御変数は、実装時に定義されます。
nthreads-var: 検出された並列領域に対して要求されたスレッド数を制限します。 nthreads-var の初期値は 1 です。
dyn-var: 検出された並列領域に対してスレッド数の動的な調整を有効にするかどうかを制御します。dyn-var の初期値は TRUE (動的な調整が有効) です。
run-sched-var: 実行時スケジュール節がループ領域に使用するスケジュールを制御します。run-sched-var の初期値は、static で、チャンクサイズはありません。
def-sched-var: ループ領域のデフォルトスケジューリングとして定義された実装を制御します。def-sched-var の初期値は、static で、チャンクサイズはありません。
stacksize-var: OpenMP の実装が作成するスレッドのスタックサイズを制御します。stacksize-var の初期値は、32 ビットアプリケーションでは 4M バイト、64 ビットアプリケーションでは 8M バイトです。
wait-policy-var: 待ち状態にあるスレッドの動作を制御します。wait-policy-var の初期値は、PASSIVE です。
thread-limit-var: OpenMP プログラムに所属するスレッドの最大数を制御します。thread-limit-var の初期値は 1024 です。
max-active-levels-var: アクティブな入れ子の並列領域の最大数を制御します。max-active-levels-var の初期値は 4 です。
実装後には、スレッド数を動的に調整する機能があります。動的調整の機能はデフォルトで有効に設定されています。OMP_DYNAMIC 環境変数を FALSE に設定するか、引数を適切に指定して omp_set_dynamic() ルーチンを呼び出して、動的調整を無効にします。
スレッドが並列構文を検出したときにこの実装により提供されるスレッド数は、OpenMP 3.0 仕様の 35 ~ 36 ページに記載されたアルゴリズム 2.1 に従って決定されます。システムリソースの不足時などの例外的な状況では、与えられるスレッドの数はアルゴリズム 2.1 で求めた数よりも少なくなることがあります。このような状況では、 SUNW_MP_WARN が TRUE に設定されているか、コールバック関数が sunw_mp_register_warn() の呼び出しにより登録されている場合でも、警告メッセージが表示されます。
収縮されたループの繰り返し回数の計算に使われる整数型は long です。
run-sched-var 内部制御変数が auto に設定されているときの schedule(runtime) 節の効果は、チャンクサイズを指定しないときの static と同じです。
コンストラクトのセクションにある構造化ブロックは、チャンクサイズが指定されていない形式の static 状態のチームに含まれるスレッドに割り当てられます。そのため、各スレッドはほぼ同数の連続する構造化ブロックを取得します。
singleコンストラクトを検出した最初のスレッドが、コンストラクトを実行します。
critical コンストラクトと名付けられた特別なコンストラクトを持つターゲット文を挿入することにより、実装によってすべての atomic 指令が置き換えられます。これにより、プログラム中のすべての atomic 領域間で排他的なアクセスが行われるようになります。これらの領域が同じストレージロケーションを更新するのか、異なるロケーションを更新するのかは関係ありません。
Sun 特有の sunw_mp_sched_reserved スケジュールの動作も、チャンクサイズが指定されていない static の場合と同様です。
omp_set_max_active_levels() がアクティブな並列領域の内部から呼び出された場合、その呼び出しは無視されます。SUNW_MP_WARN が TRUE に設定されている場合、またはコールバック関数が sunw_mp_register_warn() の呼び出しにより登録されている場合は、警告メッセージが表示されます。
omp_set_max_active_levels() の引数が負の整数の場合、呼び出しが無視されます。SUNW_MP_WARN が TRUE に設定されている場合、またはコールバック関数が sunw_mp_register_warn() の呼び出しにより登録されている場合は、警告メッセージが表示されます。
omp_get_max_active_levels() プログラムのどこからでも呼び出すことができます。この呼び出しによって、内部制御変数 max-active-levels-var の値が返されます。
変数名 |
実装 |
---|---|
OMP_SCHEDULE |
OMP_SCHEDULE に指定されたスケジュール型が有効な型 (static、dynamic、 guided、または auto) ではない場合、環境変数が無視され、デフォルトのスケジュール (チャンクサイズの指定されていない static 型) が使用されます。SUNW_MP_WARN が TRUE に設定されている場合、またはコールバック関数が sunw_mp_register_warn() の呼び出しにより登録されている場合は、警告メッセージが表示されます。 OMP_SCHEDULE 環境変数に指定されたスケジュール型が static、dynamic、または guided であるが、チャンクに指定されたサイズが負の整数の場合、次のようにチャンクサイズが設定されます。static の場合には、チャンクサイズは設定されません。dynamic または guided の場合は、チャンクサイズは 1 になります。SUNW_MP_WARN が TRUE に設定されている場合、またはコールバック関数が sunw_mp_register_warn() の呼び出しにより登録されている場合は、警告メッセージが表示されます。 |
OMP_NUM_THREADS |
変数の値が正の整数ではない場合、環境変数は無視されます。また、SUNW_MP_WARN が TRUE に設定されているか、sunw_mp_register_warn() の呼び出しによりコールバック関数が登録されている場合には、警告メッセージが表示されます。 変数の値が、実装でサポートしているスレッド数よりも大きい場合は、次のアクションが実行されます。 - スレッド数の動的調整が有効になっている場合は、スレッド数が減少します。また、SUNW_MP_WARN が TRUE に設定されているか、sunw_mp_register_warn() の呼び出しによりコールバック関数が登録されている場合には、警告メッセージが表示されます。 - 一方、スレッド数の動的調整が無効になっている場合は、エラーメッセージが表示され、プログラムが停止します。 |
OMP_DYNAMIC |
OMP_DYNAMIC に指定された値が TRUE でも FALSE でもない場合は、その値は無視され、デフォルト値である TRUE が使用されます。SUNW_MP_WARN が TRUE に設定されている場合、またはコールバック関数が sunw_mp_register_warn() の呼び出しにより登録されている場合は、警告メッセージが表示されます。 |
OMP_NESTED |
OMP_NESTED に指定された値が TRUE でも FALSE でもない場合は、その値は無視され、デフォルト値である FALSE が使用されます。SUNW_MP_WARN が TRUE に設定されている場合、またはコールバック関数が sunw_mp_register_warn() の呼び出しにより登録されている場合は、警告メッセージが表示されます。 |
OMP_STACKSIZE |
OMP_STACKSIZE に指定された値が指定書式に従っていない場合は、その値は無視され、デフォルト値 (32 ビットアプリケーションでは 4M バイト、64 ビットアプリケーションでは 8M バイト) が使用されます。SUNW_MP_WARN が TRUE に設定されている場合、またはコールバック関数が sunw_mp_register_warn() の呼び出しにより登録されている場合は、警告メッセージが表示されます。 |
OMP_WAIT_POLICY |
スレッドの ACTIVE の動作は、スピンです。スレッドの PASSIVE の動作は、少しの間スピンした後でのスリープです。 |
OMP_MAX_ACTIVE_LEVELS |
OMP_MAX_ACTIVE_LEVELS に指定された値が負の整数の場合、その値は無視され、デフォルト値 (4) が使用されます。SUNW_MP_WARN が TRUE に設定されている場合、またはコールバック関数が sunw_mp_register_warn() の呼び出しにより登録されている場合は、警告メッセージが表示されます。 |
OMP_THREAD_LIMIT |
OMP_THREAD_LIMIT に指定された値が正の整数ではない場合、その値は無視され、デフォルト値 (1024) が使用されます。SUNW_MP_WARN が TRUE に設定されている場合、またはコールバック関数が sunw_mp_register_warn() の呼び出しにより登録されている場合は、警告メッセージが表示されます。 |
次の事項は、Fortran の場合にのみ適用されます。
2 つの連続した有効な並列領域間で維持される、スレッド (最初のスレッド以外) の threadprivate オブジェクト内のデータの値の条件がすべては保持されない場合、2 番目の領域の割り当て可能な配列の割り当て状態が「not currently allocated」になることがあります。
共有変数を組み込み以外の手続きに渡すと、手続きで参照する前に共有変数の値が一時ストレージにコピーされ、手続きでの参照後に一時ストレージが実際の引数ストレージに戻されるることがあります。一時ストレージとの間のコピーは OpenMP 3.0 仕様のセクション 2.9.3.2 (88 ページ) の条件 a、b、および c が適用される場合に起こります。すなわち、
実際の引数は、次のいずれかです。
共有変数
共有変数のサブオブジェクト
共有変数と関連づけられたオブジェクト
共有変数のサブオブジェクトと関連づけられたオブジェクト
実際の引数は、次のいずれかの場合もあります。
部分配列
ベクトル添字のある部分配列
形状引き継ぎ配列
ポインタ配列
この実際の引数に関連づけられたダミー引数は、形状明示配列または形状引き継ぎ配列です。
この実装では、インクルードファイル omp_lib.h とモジュールファイル omp_lib の両方が提供されます。
Solaris プラットフォームでは、引数をとる OpenMP 実行時ライブラリルーチンが generic インタフェースで拡張されたため、異なる Fortran の KIND 型の引数に対応できます。