インテル® Fortran コンパイラー 18.0 デベロッパー・ガイドおよびリファレンス
OpenMP* は、並列モードでプログラムを管理しやすくするために、ランタイム・ライブラリー・ルーチンを提供します。これらのランタイム・ライブラリー・ルーチンの多くには、デフォルトとして設定可能な環境変数が対応付けられています。ランタイム・ライブラリー・ルーチンを使用すれば、これらの変数を動的に変更でき、プログラムを簡単に制御できます。いずれの場合も、ランタイム・ライブラリー・ルーチンを呼び出すと、それに対応する環境変数は無効になります。これらのルーチンはすべて外部プロシージャーです。
OpenMP* ランタイム・ライブラリー・ルーチンを実行することで OpenMP*ランタイム環境が初期化され、OpenMP* 環境変数のそれ以降のプログラムコードによる設定の効果がなくなることがあります。この問題を回避するには、インテルの拡張ルーチン kmp_set_defaults() を使用して OpenMP* 環境変数を設定します。
インテル® コンパイラーは、すべての OpenMP* ランタイム・ライブラリー・ルーチンをサポートしています。これらのルーチンの使用に関する詳細は、OpenMP* API 仕様を参照してください。
ルーチンを含むプログラム単位に次のような文を追加して適切なルーチンの宣言をインクルードします。
例 |
---|
|
モジュールファイルは、コンパイラーをインストールした ../include (Linux* および macOS*) または ..\include (Windows*) ディレクトリーにあります。
omp_lib.mod (および omp_lib.mod のインクルード・バージョンである omp_lib.h) の整数引数 openmp_version は、10 進数 yyyymm です。yyyy と mm は、現在のバージョンのコンパイラーとライブラリーでサポートされる OpenMP* API のバージョンを示します。詳細は、定義済みプリプロセッサー・シンボル _OPENMP を参照してください。
ルーチンのインターフェイスの一部には、同等のオフロード・インターフェイスがあります。同等のオフロード・インターフェイスには、ターゲットの種類と番号を指定する 2 つの追加の引数があります。詳細は、「CPU の関数を呼び出してコプロセッサーの実行環境を変更する」を参照してください。
次の表は、各ルーチンの仮引数のデータ型を指定するキーのリストです。
キー |
OMP_LIB Kind |
BIND(C) Kind |
KIND= |
---|---|---|---|
INTEGER ( int ) |
OMP_INTEGER_KIND |
C_INT |
4 |
LOGICAL ( log ) |
OMP_LOGICAL_KIND |
4 |
|
REAL ( dp ) |
DOUBLE PRECISION |
C_DOUBLE |
8 |
INTEGER(OMP_LOCK_KIND) |
C_INTPTR_T |
intptr_t <<1>> |
|
INTEGER(OMP_NEST_LOCK_KIND) |
C_INTPTR_T |
intptr_t <<1>> |
|
INTEGER (OMP_SCHED_KIND) |
OMP_INTEGER_KIND |
C_INT |
4 |
INTEGER(OMP_PROC_BIND_KIND) |
OMP_INTEGER_KIND |
C_INT |
4 |
INTEGER(OMP_LOCK_HINT_KIND) |
C_INTPTR_T |
intptr_t <<1>> |
intptr_t はポインター (アドレス) を保持できる大きな整数です。インテル® Fortran コンパイラーでは、32 ビット・アプリケーションをビルドする場合は INTEGER(4)、64 ビット・アプリケーションをビルドする場合は INTEGER(8) です。これは、Fortran 組込み関数 INT_PTR_KIND() によって返される値です。
実行環境ルーチンを使用して、スレッドおよび並列環境の監視と操作を行います。
ルーチン |
説明 |
---|---|
SUBROUTINE OMP_SET_NUM_THREADS(num_threads) |
呼び出し側のスレッドにより作成される後続の並列領域に使用するスレッド数を設定します。 |
SUBROUTINE OMP_SET_DYNAMIC(dynamic_threads) |
並列領域の実行に使用するスレッド数の動的な調整を有効または無効にします。dynamic_threads が .TRUE. の場合は、動的スレッドは有効です。dynamic_threads が .FALSE. の場合は、動的スレッドは無効です。動的スレッドはデフォルトでは無効です。 |
SUBROUTINE OMP_SET_NESTED(nested) |
入れ子構造の並列処理を有効または無効にします。nested が .TRUE. の場合は、入れ子構造の並列処理は有効です。nested が .FALSE. の場合は、入れ子構造の並列処理は無効です。入れ子構造の並列処理はデフォルトでは無効です。 |
INTEGER(int) FUNCTION OMP_GET_NUM_THREADS() |
現在の並列領域に使用されているスレッドの数を返します。 この関数は、OMP_SET_NUM_THREADS() 関数からの呼び出し側スレッドによって継承される値は返しません。 |
INTEGER(int) FUNCTION OMP_GET_MAX_THREADS() |
呼び出し側のスレッドにより作成される後続の並列領域に利用可能なスレッド数を返します。 |
INTEGER(int) FUNCTION OMP_GET_THREAD_NUM() |
現在の並列領域のコンテキスト内の呼び出し側スレッド数を返します。 |
INTEGER(int) FUNCTION OMP_GET_NUM_PROCS() |
プログラムで利用できるプロセッサー数を決定します。 |
LOGICAL(log) FUNCTION OMP_IN_PARALLEL() |
並列で実行されている並列領域の動的な範囲内で呼ばれた場合、.TRUE. を返します。そうでない場合は、.FALSE. を返します。 |
LOGICAL(log) FUNCTION OMP_IN_FINAL() |
final タスク領域内で呼ばれた場合、.TRUE. を返します。そうでない場合は、.FALSE. を返します。 |
LOGICAL(log) FUNCTION OMP_GET_DYNAMIC() |
動的なスレッド調整が有効の場合は、.TRUE. を返します。そうでない場合は、.FALSE. を返します。 |
LOGICAL FUNCTION OMP_GET_NESTED() |
入れ子構造の並列処理が有効な場合は、.TRUE. を返します。そうでない場合は、.FALSE. を返します。 |
INTEGER FUNCTION OMP_GET_THREAD_LIMIT() |
OpenMP* プログラムで同時に実行するスレッド数の最大値を返します。 |
SUBROUTINE OMP_SET_MAX_ACTIVE_LEVELS(max_active_levels) |
入れ子構造のアクティブな並列領域の数を制限します。負の max_active_levels が指定された場合、呼び出しは無視されます。 |
INTEGER FUNCTION OMP_GET_MAX_ACTIVE_LEVELS() |
入れ子構造のアクティブな並列領域の最大数を返します。 |
INTEGER FUNCTION OMP_GET_LEVEL() |
呼び出しが含まれたタスクを囲む、入れ子構造の並列領域 (アクティブ、非アクティブにかかわらず) の数を返します。暗黙的な並列領域は含まれません。 |
INTEGER FUNCTION OMP_GET_ACTIVE_LEVEL() |
呼び出しが含まれたタスクを囲む、入れ子構造のアクティブな並列領域の数を返します。 |
INTEGER FUNCTION OMP_GET_ANCESTOR_THREAD_NUM(level) |
指定された現在のスレッドの入れ子レベルに対する先祖のスレッド番号を返します。 |
INTEGER FUNCTION OMP_GET_TEAM_SIZE(level) |
現在のスレッドの指定された入れ子レベルの先祖または現在のスレッドが所属するスレッドチームのサイズを返します。 |
SUBROUTINE OMP_SET_SCHEDULE(kind,chunk_size) |
'runtime' がスケジュール種別として使用されている場合に適用されるワークシェア・ループのスケジュールを決定します。 |
SUBROUTINE OMP_GET_SCHEDULE(kind,chunk_size) |
'runtime' スケジュールが使用されている場合に適用されるワークシェア・ループのスケジュールを返します。 |
INTEGER(KIND=OMP_PROC_BIND_KIND) OMP_GET_PROC_BIND() |
OMP_PROC_BIND 環境変数で設定される現在アクティブなスレッド・アフィニティー・ポリシーを返します。 このポリシーは、後続の入れ子構造の並列領域で使用されます。 |
INTEGER(int) FUNCTION OMP_GET_NUM_PLACES() |
初期タスクのプレースリスト (通常、スレッド、コア、またはソケット) で、実行環境が利用可能なプレースの数を返します。 |
INTEGER(int) FUNCTION OMP_GET_PLACE_NUM_PROCS(place_num) |
プレース番号 place_num に関連付けられたプロセッサー数を返します。place_num が負または OMP_GET_NUM_PLACES() 以上の場合はゼロを返します。 |
SUBROUTINE OMP_GET_PLACE_PROC_IDS(place_num,ids) INTEGER(int) place_num INTEGER(int) ids(*) |
プレース番号 place_num に関連付けられた各プロセッサーの ID 番号を返します。ID 番号は負以外で、その意味は実装定義に依存します。ID 番号は配列 ids で返され、配列内の順序は実装定義に依存します。ids には、少なくとも OMP_GET_PLACE_NUM_PROCS(place_num) 要素が含まれていないければなりません。place_num が OMP_GET_NUM_PLACES() 以上の場合、ルーチンは何も返しません。 |
INTEGER(int) FUNCTION OMP_GET_PLACE_NUM() |
到達スレッドがバインドされているプレースの番号を返します。プレース番号は、0 から OMP_GET_NUM_PLACES() - 1 の範囲の値です。到達スレッドがプレースにバインドされていない場合は、-1 を返します。 |
INTEGER(int) FUNCTION OMP_GET_DEFAULT_DEVICE() |
デフォルトのデバイス番号を返します。 |
SUBROUTINE OMP_SET_DEFAULT_DEVICE(device_number) |
デフォルトのデバイス番号を設定します。 |
INTEGER(int) FUNCTION OMP_GET_NUM_DEVICES() |
ターゲットデバイス数を取得します。 |
INTEGER(int) FUNCTION OMP_GET_NUM_TEAMS() |
現在のチーム領域のチーム数を取得します。 |
INTEGER(int) FUNCTION OMP_GET_TEAM_NUM() |
呼び出し側のスレッドのチーム番号を取得します。 |
LOGICAL(log) FUNCTION OMP_GET_CANCELLATION() |
キャンセルが有効な場合は .TRUE. を返します。そうでない場合は、.FALSE. を返します。 このルーチンは、環境変数 OMP_CANCELLATION の設定の影響を受けます。 |
LOGICAL(log) FUNCTION OMP_IS_INITIAL_DEVICE() |
現在のタスクがホストデバイスで実行している場合は .TRUE. を返します。そうでない場合は、.FALSE. を返します。 |
INTEGER(int) FUNCTION OMP_GET_INITIAL_DEVICE() |
ホストデバイスのデバイス番号を返します。デバイス番号は実装定義に依存します。0 から OMP_GET_NUM_DEVICES() - 1 の範囲の場合、すべてのデバイス構造/ルーチンで有効です。そうでない場合、デバイス・メモリー・ルーチンでのみ有効で、DEVICE 節では無効です。 |
INTEGER(int) FUNCTION OMP_GET_MAX_TASK_PRIORITY() |
PRIORITY 節で指定可能な最大値を返します。 |
ロックルーチンを使用して OpenMP* ロックを操作します。
関数 |
説明 |
---|---|
SUBROUTINE OMP_INIT_LOCK(svar) |
後続の呼び出しに使用する単純なロック変数 svar に関連付けられたロックを初期化します。 |
SUBROUTINE OMP_INIT_LOCK_WITH_HINT(svar, hint) |
svar に関連付けられたロックを解除状態に初期化します。オプションで hint を基に特定のロック実装を選択できます。 |
SUBROUTINE OMP_DESTROY_LOCK(svar) |
svar により指定されたロックを未定義または未初期化にします。ロックは初期化されており、ロックされていてはなりません。 |
SUBROUTINE OMP_SET_LOCK(svar) |
svar に関連付けられているロックが使用可能な状態になるまで実行中のスレッドを強制的に待機させます。ロックが使用可能になると、スレッドにはそのロックの所有権が与えられます。ロックは初期化されていなければなりません。 |
SUBROUTINE OMP_UNSET_LOCK(svar) |
svar に関連付けられているロックの所有権から実行スレッドを解放します。svar に関連付けられたロックを実行中のスレッドが所有していない場合の動作は不定です。 |
LOGICAL(log) OMP_TEST_LOCK(svar) |
svar に関連付けられているロックを設定しようと試みます。成功した場合は、.TRUE. を返します。そうでない場合は、.FALSE. を返します。ロックは初期化されていなければなりません。 |
SUBROUTINE OMP_INIT_NEST_LOCK(nvar) |
後続の呼び出しに使用する入れ子されたロック変数 nvar に関連付けられた入れ子されたロックを初期化します。 |
SUBROUTINE OMP_INIT_NEST_LOCK_WITH_HINT(nvar, hint) |
nvar に関連付けられた入れ子されたロックを解除状態に初期化します。オプションで hint を基に特定のロック実装を選択できます。nvar の入れ子カウントはゼロに設定されます。 |
SUBROUTINE OMP_DESTROY_NEST_LOCK(nvar) |
nvar に関連付けられている入れ子されたロックを未定義または未初期化にします。ロックは初期化されており、ロックされていてはなりません。 |
SUBROUTINE OMP_SET_NEST_LOCK(nvar) |
nvar に関連付けられている入れ子されたロックが使用可能な状態になるまで実行中のスレッドを強制的に待機させます。スレッドがすでにロックを所有している場合は、ロックの入れ子カウント数は増えます。ロックは初期化されていなければなりません。 |
SUBROUTINE OMP_UNSET_NEST_LOCK(nvar) |
入れ子カウント数がゼロの場合は、nvar に関連付けられた入れ子されたロックの所有権から実行中のスレッドを解放します。解放されない場合、入れ子カウント数は減ります。nvar に関連付けられた入れ子のロックを、実行中のスレッドが所有していない場合の動作は不定です。 |
INTEGER(int) OMP_TEST_NEST_LOCK(nvar) |
nvar により指定されている入れ子されたロックを設定しようと試みます。成功した場合は入れ子カウント数を返し、失敗した場合は 0 を返します。 |
関数 |
説明 |
---|---|
REAL (dp) FUNCTION OMP_GET_WTIME() |
任意の参照時間から経過したウォールクロック時間 (秒) に等しい倍精度値を返します。参照時間は、プログラム実行中には変更されません。 |
REAL (dp) FUNCTION OMP_GET_WTICK() |
連続するクロック刻みの間隔の秒数に等しい倍精度値を返します。 |
次の PARAMETER 定数は OMP_LIB.MOD で定義され、OMP_SET_SCHEDULE と OMP_GET_SCHEDULE の KIND 仮引数で設定または返すことができます。
integer(omp_sched_kind), parameter :: omp_sched_static = 1 integer(omp_sched_kind), parameter :: omp_sched_dynamic = 2 integer(omp_sched_kind), parameter :: omp_sched_guided = 3 integer(omp_sched_kind), parameter :: omp_sched_auto = 4
次の PARAMETER 定数は OMP_LIB.MOD で定義され、OMP_GET_PROC_BIND によって返される値を表します。
integer (omp_proc_bind_kind), parameter :: omp_proc_bind_false = 0 integer (omp_proc_bind_kind), parameter :: omp_proc_bind_true = 1 integer (omp_proc_bind_kind), parameter :: omp_proc_bind_master = 2 integer (omp_proc_bind_kind), parameter :: omp_proc_bind_close = 3 integer (omp_proc_bind_kind), parameter :: omp_proc_bind_spread = 4
次の PARAMETER 引数は OMP_LIB.MOD で定義され、OMP_INIT_LOCK_WITH_HINT と OMP_INIT_NEST_LOCK_WITH_HINT の HINT 仮引数で設定できます。
integer (omp_lock_hint_kind), parameter :: omp_lock_hint_none = 0 integer (omp_lock_hint_kind), parameter :: omp_lock_hint_uncontended = 1 integer (omp_lock_hint_kind), parameter :: omp_lock_hint_contended = 2 integer (omp_lock_hint_kind), parameter :: omp_lock_hint_nonspeculative = 4 integer (omp_lock_hint_kind), parameter :: omp_lock_hint_speculative = 8
Fortran では、+ 演算子を使用してヒントを組み合わせることができます。ヒントを組み合わせた場合の動作は、実装定義に依存します。omp_lock_hint_none とヒントを組み合わせた場合、そのヒントを指定した場合と同じ効果があります。次の制約事項は、ヒントを組み合わせる場合に適用されます。
omp_lock_hint_uncontended と omp_lock_hint_contended を組み合わせることはできません。
omp_lock_hint_nonspeculative と omp_lock_hint_nonspeculative を組み合わせることはできません。