インテル® C++ コンパイラー 18.0 デベロッパー・ガイドおよびリファレンス
OpenMP* は、並列モードでプログラムを管理しやすくするために、ランタイム・ライブラリー・ルーチンを提供します。これらのランタイム・ライブラリー・ルーチンの多くには、デフォルトとして設定可能な環境変数が対応付けられています。ランタイム・ライブラリー・ルーチンを使用すれば、これらの変数を動的に変更でき、プログラムを簡単に制御できます。いずれの場合も、ランタイム・ライブラリー・ルーチンを呼び出すと、それに対応する環境変数は無効になります。
OpenMP* ランタイム・ライブラリー・ルーチンを実行することで OpenMP*ランタイム環境が初期化され、OpenMP* 環境変数のそれ以降のプログラムコードによる設定の効果がなくなることがあります。この問題を回避するには、インテルの拡張ルーチン kmp_set_defaults() を使用して OpenMP* 環境変数を設定します。
インテル® コンパイラーは、すべての OpenMP* ランタイム・ライブラリー・ルーチンをサポートしています。これらのルーチンの使用に関する詳細は、OpenMP* API 仕様を参照してください。
ソースコードを含むプログラム単位に次のような文を追加して適切なルーチンの宣言をインクルードします。
例 |
---|
|
ヘッダーファイルは、コンパイラーをインストールした ../include (Linux* および macOS*) または ..\include (Windows*) ディレクトリーにあります。
ルーチンのインターフェイスの一部には、同等のオフロード・インターフェイスがあります。同等のオフロード・インターフェイスには、ターゲットの種類と番号を指定する 2 つの追加の引数があります。詳細は、「CPU の関数を呼び出してコプロセッサーの実行環境を変更する」を参照してください。
実行環境ルーチンを使用して、スレッドおよび並列環境の監視と操作を行います。
ルーチン |
説明 |
---|---|
void omp_set_num_threads(int nthreads) |
呼び出し側のスレッドにより作成される後続の並列領域に使用するスレッド数を設定します。 |
void omp_set_dynamic(int dynamic_threads) |
並列領域の実行に使用するスレッド数の動的な調整を有効または無効にします。dynamic_threads が TRUE の場合は、動的スレッドは有効です。dynamic_threads が FALSE の場合は、動的スレッドは無効です。動的スレッドはデフォルトでは無効です。 |
void omp_set_nested(int nested) |
入れ子構造の並列処理を有効または無効にします。nested が TRUE の場合は、入れ子構造の並列処理は有効です。nested が FALSE の場合は、入れ子構造の並列処理は無効です。入れ子構造の並列処理はデフォルトでは無効です。 |
int omp_get_num_threads(void) |
現在の並列領域に使用されているスレッドの数を返します。 この関数は、omp_set_num_threads() 関数からの呼び出し側スレッドによって継承される値は返しません。 |
int omp_get_max_threads(void) |
呼び出し側のスレッドにより作成される後続の並列領域に利用可能なスレッド数を返します。 |
int omp_get_thread_num(void) |
現在の並列領域のコンテキスト内の呼び出し側スレッド数を返します。 |
int omp_get_num_procs(void) |
プログラムで利用できるプロセッサー数を決定します。 |
int omp_in_parallel(void) |
並列で実行されている並列領域の動的な範囲内で呼ばれた場合、TRUE を返します。そうでない場合は、FALSE を返します。 |
int omp_in_final(void) |
final タスク領域内で呼ばれた場合、TRUE を返します。そうでない場合は、FALSE を返します。 |
int omp_get_dynamic(void) |
動的なスレッド調整が有効の場合は、TRUE を返します。そうでない場合は、FALSE を返します。 |
int omp_get_nested(void) |
入れ子構造の並列処理が有効な場合は、TRUE を返します。そうでない場合は、FALSE を返します。 |
int omp_get_thread_limit(void) |
OpenMP* プログラムで同時に実行するスレッド数の最大値を返します。 |
void omp_set_max_active_levels(int max_active_levels) |
入れ子構造のアクティブな並列領域の数を制限します。負の max_active_levels が指定された場合、呼び出しは無視されます。 |
int omp_get_max_active_levels(void) |
入れ子構造のアクティブな並列領域の最大数を返します。 |
int omp_get_level(void) |
呼び出しが含まれたタスクを囲む、入れ子構造の並列領域 (アクティブ、非アクティブにかかわらず) の数を返します。暗黙的な並列領域は含まれません。 |
int omp_get_active_level(void) |
呼び出しが含まれたタスクを囲む、入れ子構造のアクティブな並列領域の数を返します。 |
int omp_get_ancestor_thread_num(int level) |
指定された現在のスレッドの入れ子レベルに対する先祖のスレッド番号を返します。 |
int omp_get_team_size(int level) |
指定されたレベルの先祖が所属するスレッドチームのサイズを返します。 |
void omp_set_schedule(omp_sched_t kind,int chunk_size) |
'runtime' がスケジュール種別として使用されている場合に適用されるワークシェア・ループのスケジュールを決定します。 |
void omp_get_schedule(omp_sched_kind *kind,int *chunk_size) |
'runtime' スケジュールが使用されている場合に適用されるワークシェア・ループのスケジュールを返します。 |
omp_proc_bind_t omp_get_proc_bind(void); |
OMP_PROC_BIND 環境変数で設定される現在アクティブなスレッド・アフィニティー・ポリシーを返します。 このポリシーは、後続の入れ子構造の並列領域で使用されます。 |
int omp_get_num_places(void); |
初期タスクのプレースリスト (通常、スレッド、コア、またはソケット) で、実行環境が利用可能なプレースの数を返します。 |
int omp_get_place_num_procs(int place_num) |
プレース番号 place_num に関連付けられたプロセッサー数を返します。place_num が負または omp_get_num_places() 以上の場合はゼロを返します。 |
void omp_get_place_proc_ids(int place_num, int *ids) |
プレース番号 place_num に関連付けられた各プロセッサーの ID 番号を返します。ID 番号は負以外で、その意味は実装定義に依存します。ID 番号は配列 ids で返され、配列内の順序は実装定義に依存します。ids には、少なくとも omp_get_place_num_procs(place_num) 要素が含まれていないければなりません。place_num が omp_get_num_places() 以上の場合、ルーチンは何も返しません。 |
int omp_get_place_num(void) |
到達スレッドがバインドされているプレースの番号を返します。プレース番号は、0 から omp_get_num_places() の範囲の値です。到達スレッドがプレースにバインドされていない場合は、-1 を返します。 |
int omp_get_default_device(void); |
デフォルトのデバイス番号を返します。 |
void omp_set_default_device(int device_number); |
デフォルトのデバイス番号を設定します。 |
int omp_get_num_devices(void); |
ターゲットデバイス数を取得します。 |
int omp_get_num_teams(void); |
現在のチーム領域のチーム数を取得します。 |
int omp_get_team_num(void); |
呼び出し側のスレッドのチーム番号を取得します。 |
int omp_get_cancellation(void); |
キャンセルが有効な場合は TRUE を返します。そうでない場合は、FALSE を返します。 このルーチンは、環境変数 OMP_CANCELLATION の設定の影響を受けます。 |
int omp_is_initial_device(void); |
現在のタスクがホストデバイスで実行している場合は TRUE を返します。そうでない場合は、FALSE を返します。 |
int omp_get_initial_device(void); |
ホストデバイスのデバイス番号を返します。デバイス番号は実装定義に依存します。0 から omp_get_num_devices() - 1 の範囲の場合、すべてのデバイス構造/ルーチンで有効です。そうでない場合、デバイス・メモリー・ルーチンでのみ有効で、device 節では無効です。 |
int omp_get_max_task_priority(void); |
priority 節で指定可能な最大値を返します。 |
void * omp_target_alloc(size_t size, int device_num) |
格納場所のデバイスアドレス (バイト単位) を返します。 |
void omp_target_free(void *device_ptr, int device_num) |
omp_target_alloc によって割り当てられたデバイスメモリーを解放します。 |
int omp_target_is_present(void *ptr, int device_num) |
map 節の device_num で指定されたデバイスでポインターが見つかった場合は、TRUE を返します。その他の場合は FALSE を返します。 |
int omp_target_memcpy(void *dst, void *src, size_t length, size_t dst_offset, size_t src_offset, int dst_device, int src_device) |
デバイス src_device_num のデバイスデータ環境のメモリー位置 src + オフセット src_offset から、デバイス dst_device_num のデバイスデータ環境のメモリー位置 dst + オフセット dst_offset へ length バイトをコピーします。成功した場合はゼロを返し、失敗した場合は非ゼロを返します。omp_get_initial_device を使用して、ホストデバイスとホスト・デバイス・データ環境の参照に使用できるデバイス番号を取得できます。このルーチンには、タスク・スケジュール・ポイントが含まれます。 ターゲット領域から呼び出された場合、このルーチンの動作は不定です。 |
int omp_target_memcpy_rect( void *dst, void *src,size_t element_size,int num_dims,const size_t *volume, const size_t *dst_offsets,const size_t *src_offsets, const size_t *dst_dimensions, const size_t *src_dimensions,int dst_device_num, int src_device_num) |
デバイス src_device_num のデバイスデータ環境の src の矩形領域を、デバイス dst_device_num のデバイスデータ環境の dst へコピーします。volume は、要素サイズ、次元数、長さ num_dims の定数配列で指定します。サポートされる最大次元数は 3 以上です。volume 配列は、各次元で src から dst へコピーする長さ (要素数) を指定します。dst_offsets と src_offsets 引数は、dst と src の開始位置からの要素数を指定します。dst_dimensions と src_dimensions 引数は、dst と src の各次元の長さを指定します。このルーチンは、成功した場合ゼロを返します。dst と src がどちらも NULL ポインターの場合、このルーチンは、指定されたデバイス数に対して実装でサポートされている次元数を返します。omp_get_initial_device によって返されたデバイス番号を使用して、ホストデバイスとホスト・デバイス・データ環境を参照できます。そうでない場合、非ゼロを返します。このルーチンには、タスク・スケジュール・ポイントが含まれます。 ターゲット領域から呼び出された場合、このルーチンの動作は不定です。 |
int omp_target_associate_ptr(void *host_ptr, void *device_ptr, size_t size, size_t device_offset, int device_num) |
デバイスポインター (omp_target_alloc によって返されたものなど) をホストポインターにマップします。 |
ロックルーチンを使用して OpenMP* ロックを操作します。
関数 |
説明 |
---|---|
void omp_init_lock(omp_lock_t svar) |
後続の呼び出しに使用する単純なロック変数 svar に関連付けられたロックを初期化します。 |
void omp_init_lock_with_hint(omp_lock_t *svar, omp_lock_hint_t hint) |
svar に関連付けられたロックを解除状態に初期化します。オプションで hint を基に特定のロック実装を選択できます。 |
void omp_destroy_lock(omp_lock_t svar) |
svar により指定されたロックを未定義または未初期化にします。 |
void omp_set_lock(omp_lock_t svar) |
svar に関連付けられているロックが使用可能な状態になるまで実行中のスレッドを強制的に待機させます。ロックが使用可能になると、スレッドにはそのロックの所有権が与えられます。 |
void omp_unset_lock(omp_lock_t svar) |
svar に関連付けられているロックの所有権から実行スレッドを解放します。svar に関連付けられたロックを実行中のスレッドが所有していない場合の動作は不定です。 |
int omp_test_lock(omp_lock_t svar) |
svar に関連付けられているロックを設定しようと試みます。成功した場合は、TRUE を返します。そうでない場合は、FALSE を返します。 |
void omp_init_nest_lock(omp_nest_lock_t nvar) |
後続の呼び出しに使用する入れ子されたロック変数 nvar に関連付けられた入れ子されたロックを初期化します。 |
void omp_init_lock_with_hint(omp_lock_t *nvar, omp_lock_hint_t hint);void omp_init_nest_lock_with_hint(omp_nest_lock_t *nvar, omp_lock_hint_t hint); |
nvar に関連付けられた入れ子されたロックを解除状態に初期化します。オプションで hint を基に特定のロック実装を選択できます。nvar の入れ子カウントはゼロに設定されます。 |
void omp_destroy_nest_lock(omp_nest_lock_t nvar) |
nvar に関連付けられている入れ子されたロックを未定義または未初期化にします。 |
void omp_set_nest_lock(omp_nest_lock_t nvar) |
nvar に関連付けられている入れ子されたロックが使用可能な状態になるまで実行中のスレッドを強制的に待機させます。スレッドがすでにロックを所有している場合は、ロックの入れ子カウント数は増えます。 |
void omp_unset_nest_lock(omp_nest_lock_t lock) |
入れ子カウント数がゼロの場合は、nvar に関連付けられた入れ子されたロックの所有権から実行中のスレッドを解放します。解放されない場合、入れ子カウント数は減ります。nvar に関連付けられた入れ子のロックを、実行中のスレッドが所有していない場合の動作は不定です。 |
int omp_test_nest_lock(omp_nest_lock_t lock) |
nvar により指定されている入れ子されたロックを設定しようと試みます。成功した場合は入れ子カウント数を返し、失敗した場合は 0 を返します。 |
関数 |
説明 |
---|---|
double omp_get_wtime(void) |
任意の参照時間から経過したウォールクロック時間 (秒) に等しい倍精度値を返します。参照時間は、プログラム実行中には変更されません。 |
double omp_get_wtick(void) |
連続するクロック刻みの間隔の秒数に等しい倍精度値を返します。 |
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