OpenMP* プラグマの概要

ここでは、インテル® oneAPI DPC++/C++ コンパイラーでサポートされている OpenMP* プラグマの概要を説明します。OpenMP* API の詳細については、OpenMP* ウェブサイトの「OpenMP* Application Program Interface Version 5.1 仕様」を参照してください。

並列プラグマ

このプラグマを使用してスレッドのチームを形成しスレッドを並列に実行します。

プラグマ

説明

omp parallel

スレッドのチームにより並列に実行される構造化ブロックを指定します。

タスキングプラグマ

これらのプラグマを使用して遅延実行を行います。

プラグマ

説明

omp task

実行を遅延させることができるコードブロックを指定します。

omp taskloop

1 つ以上の関連する for ループの反復を OpenMP* タスクを使用して実行するように指定します。反復は、構文によって作成されるタスクに分配され、現在のチームによって並列に実行するようにスケジュールされます。

ワークシェア・プラグマ

これらのプラグマを使用してスレッドのチーム間のワークを共有します。

プラグマ

説明

omp for

ワークシェア・ループを指定します。ループの反復は、チーム内の 1 つのスレッドにより並列に実行されます。

omp loop

関連するループの反復が任意の順序または同時実行可能であることを指定します。

omp sections

チーム内のスレッド間で分配される構造化ブロックのセットを定義します。

omp single

コードブロックがチームの 1 つのスレッドでのみ実行されることを指定します。

同期プラグマ

これらのプラグマを使用してスレッド間を同期します。

プラグマ

説明

omp atomic

アトミックに実行する必要がある計算を指定します。

omp barrier

チーム内のすべてのスレッドが到着するまで各スレッドが待機しなければならないコード位置を指定します。

omp critical

一度に 1 つのスレッドのみアクセスできるコードブロックを指定します。

omp flush

スレッドから見た一時的なメモリーの状態と実際のメモリーの整合性が保たれるポイントを定義します。

omp masked

チームのプライマリー・スレッドで実行されるコードブロックを指定します。

omp master (非推奨の古いプラグマ。omp masked を参照。)

チームのプライマリー・スレッドで 1 回だけ実行するコードブロックを指定します。

omp ordered

チームのスレッドがループの反復順に実行するスレッドのコードブロックを指定します。または、スタンドアロン・ディレクティブとして、DOACROSS ループの入れ子で繰り返し間の依存関係を指定します。

omp taskgroup

囲まれたタスクと派生タスクがすべて完了するまでプログラムを待機させます。

omp taskwait

現在のタスクが開始してから、生成された子タスクの完了まで待機するように指定します。

omp taskyield

現在のタスクを中断し、別のタスクの実行を優先することを許可します。

データ環境プラグマ

これらのプラグマを使用して、データ環境に影響を与えることができます。

プラグマ

説明

omp threadprivate

各スレッドにプライベートとして割り当てられるグローバル変数のリストを指定します。

オフロードターゲットを制御するプラグマ

これらのプラグマを使用して 1 つ以上のオフロードターゲット上の実行を制御します。

プラグマ

説明

omp declare target

デバイス向けに作成またはマップする関数と変数を指定します。

omp declare variant

ベース・プロシージャーのバリアントを識別し、このバリアントが使用されるコンテキストを指定します。

omp dispatch

指定されたプロシージャー呼び出しに対して、プロシージャーのバリアントが呼び出されるかどうかを決定します。

omp distribute

1 つ以上のループの反復をすべてのスレッドチームのプライマリー・スレッド間で分配するかどうかを指定します。

omp interop

外部のランタイム・コンテキストを識別し、そのコンテキストのランタイム特性を特定して相互運用性を実現します。

omp requires

プログラムを正しくコンパイルして実行するため、実装がサポートしなければならない機能を列挙します。

omp target enter data

デバイスのデータ環境へ変数をマップします。

omp target exit data

デバイスのデータ環境から変数をアンマップ (解放) します。

omp teams

ターゲット領域内でスレッドチームを複数作成し、各チームのプライマリー・スレッドの構造化ブロックを実行します。

ベクトル化プラグマ

これらのプラグマを使用してベクトル・ハードウェア上の実行を制御します。

プラグマ

説明

omp simd

ループを SIMD (Single Instruction, Multiple Data) 命令を使用して同時に実行されるループにベクトル化します。

early_exit 節は、インテル独自の OpenMP* 仕様の拡張です。

early_exit

複数の終了ポイントを持つループのベクトル化を許可します。この節を指定すると、プログラムは次のように振る舞います。

  • ループの最後の途中終了文の前にある各操作は、SIMD チャンク内で途中終了がトリガーされなかったかのように実行されることがあります。

  • ループの最後の途中終了文の後、すべての操作はループの最後の反復が見つかったかのように実行されます。

  • linear で指定された各リスト項目は、ループ終了時の最後の反復数に基づいて計算されます。

  • linear 節の最後の値と条件付き lastprivates 節は、スカラー実行では保持されます。

  • reductions 節の最後の値は、ループ終了時に最後の SIMD チャンクの最後の反復が実行されたかのように計算されます。

  • 共有メモリーの状態は、スカラー実行では保持されないことがあります。

  • 例外は許可されません。

omp declare simd

SIMD ループから一度の呼び出しで、SIMD (single instruction-multiple data) 命令を使用して複数の引数を処理できる関数バージョンを作成します。

キャンセル構文

プラグマ

説明

omp cancel

指定した種類の最内領域の取り消し要求を行います。このプラグマに到達したタスクは、取り消された構文の最後に進みます。

omp cancellation point

暗黙的または明示的なタスクが、指定された節の最内領域で取り消し要求があったかどうかをチェックするポイントを定義します。この構文は、スレッド間またはタスク間の同期は実装していません。

ユーザー定義のリダクション・プラグマ

このプラグマを使用して、reduction 節でリダクション演算子として利用可能なリダクション識別子を定義します。

プラグマ

説明

omp declare reduction

reduction 節でリダクション演算子として利用可能なユーザー定義のリダクション (UDR) 関数 (リダクション識別子) を宣言します。

メモリー空間割り当てプラグマ

この宣言ディレクティブを使用してメモリー空間を割り当てます。

プラグマ

説明

omp allocate

オブジェクトの割り当てと解放にメモリー・アロケーターを使用するように指示します。

結合および複合プラグマ

これらのプラグマは、連続する複数のプラグマのショートカットとして使用します。結合構造は、ある構造内に別の構造を入れ子するためのショートカット形式です。内部に別の構造を 1 つだけ含み、ほかの文を含まない構造を明示的に指定することと同じです。

複合構造は、2 つの構造から成り、構造内に別の構造を入れ子する場合とセマンティクスが異なります。複合構造は、その構成要素である 2 つの構造には含まれないセマンティクスを追加したり、構造内に別の構造を入れ子することが不適合な場合に使用します。

プラグマ

説明

omp distribute parallel for1

複数のチームのメンバーである複数のスレッドによって並列に実行できるループを指定します。

omp distribute parallel for simd1

複数のチームのメンバーである複数のスレッドによって並列に実行されるループを指定します。また、ループは SIMD 命令を使用して同時に実行されます。

omp distribute simd1

チーム領域のプライマリー・スレッド間で分配されるループを指定します。また、ループは SIMD 命令を使用して同時に実行されます。

omp for simd1

ループ反復をチーム内のスレッド間で分配するように指定します。各スレッドによって実行される反復は、SIMD 命令を使用して同時に実行することもできます。

omp parallel for

1 つの FOR 構文を含む並列領域を簡潔に指定する方法を提供します。

omp parallel for simd

1 つの for simd 構文だけを含み、その他の文を含まない parallel 構文を指定します。

omp parallel sections

1 つの sections 構文を含む parallel 構文を指定します。

omp target parallel

デバイスデータ環境を作成して、そのデバイスで並列領域を実行します。

omp target parallel for

1 つの omp target parallel for 構造だけを含み、その他の文を含まない target 構造を簡潔に指定する方法を提供します。

omp target parallel for simd

1 つの omp target parallel for simd 構造だけを含み、その他の文を含まない target 構造を簡潔に指定する方法を提供します。

omp target parallel loop

1 つの並列ループ構文を含むターゲット領域を簡潔に指定する方法を提供します。

omp target simd

1 つの omp simd 構造だけを含み、その他の文を含まない target 構造を指定します。

omp target teams

デバイスデータ環境を作成して同じデバイスで構文を実行します。また、スレッドチームを複数作成し、各チームのプライマリー・スレッドが構造化ブロックを実行します。このプラグマは、インテル® MIC アーキテクチャーにのみ適用されます。

omp target teams distribute

デバイスデータ環境を作成してそのデバイスで構文を実行します。また、teams 構造により生成されるすべてのスレッドチームのプライマリー・スレッド間で、ループ反復を分配するように指定します。

omp target teams distribute parallel for

デバイスデータ環境を作成してそのデバイスで構文を実行します。また、teams 構造により生成される複数のチームのメンバーである複数のスレッド間で、ループが並列に実行されるように指定します。

omp target teams distribute parallel for simd

デバイスデータ環境を作成してそのデバイスで構文を実行します。また、teams 構造により生成される複数のチームのメンバーである複数のスレッド間で、ループが並列に実行されるように指定します。ループはチーム全体に分配され、SIMD 命令を使用して同時に実行されます。

omp target teams distribute simd

デバイスデータ環境を作成してそのデバイスで構文を実行します。また、teams により生成されるすべてのスレッドチームのプライマリー・スレッド間で、ループ反復を分配するように指定します。また、ループは SIMD 命令を使用して同時に実行されます。

omp target teams loop

1 つの teams ループ構文を含むターゲット領域を簡潔に指定する方法を提供します。

omp taskloop simd1

SIMD 命令を使用して同時に実行可能で、反復が OpenMP* タスクを使用して並列に実行されるループを指定します。

omp teams distribute

スレッドチームのリーグを作成して、リーグ内のすべてのスレッドチームのプライマリー・スレッド間でループ反復を分配するように指定します。

omp teams distribute parallel for

スレッドチームのリーグを作成して、複数のチームのメンバーである複数のスレッドによって並列に実行できるループを指定します。

omp teams distribute parallel for simd

スレッドチームのリーグを作成して、複数のチームのメンバーである複数のスレッドによって SIMD 命令を使用して並列に実行できるループを指定します。

omp teams distribute simd

スレッドチームのリーグを作成して、リーグ内のチームのプライマリー・スレッド間で分配して、SIMD 命令を使用して並列に実行できるループを指定します。

omp teams loop

1 つのループ構文を含む teams 構文を簡潔に指定する方法を提供します。

脚注:

1 このディレクティブは、複合構造を指定します。