OpenMP* ディレクティブの概要

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

次のリストで、ほかでも同じ名前が使用されている OpenMP* ディレクティブにはディレクティブと明記しています。例えば、FLUSH はディレクティブ、文、サブルーチンを指します。

並列ディレクティブ

このディレクティブを使用してスレッドのチームを形成しスレッドを並列に実行します。

ディレクティブ

説明

PARALLEL (OpenMP*)

並列実行領域を定義します。

タスク・ディレクティブ

これらのディレクティブを使用して遅延実行を行います。

ディレクティブ

説明

TASK

タスク領域を定義します。

TASKLOOP

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

ワークシェア・ディレクティブ

これらのディレクティブを使用してスレッドのチーム間のワークを共有します。

ディレクティブ

説明

DO

関連付けられたループの反復がチーム内のスレッド間で分割される、反復的なワークシェアの構造を識別します。

LOOP

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

SECTIONS

囲まれた SECTION ディレクティブがチームのスレッド間に分割されるコードのブロックを定義することを指定します。各セクションは、チーム内のスレッドにより 1 回だけ実行されます。

SINGLE

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

WORKSHARE

文または構造のブロックを実行する作業を個別のユニットに分割します。また、実行単位の作業をチームのスレッドに分配して、各作業単位が 1 回だけ実行されるようにします。

同期ディレクティブ

これらのディレクティブを使用してスレッド間を同期します。

ディレクティブ

説明

ATOMIC

特定のメモリー位置をアトミックに更新し、複数のスレッドが同時に読み取り/書き込みを行う危険性を回避します。

BARRIER

チーム内のすべてのスレッドを同期化します。各スレッドは、チーム内のほかのすべてのスレッドがバリアに到達するまで待機します。

CRITICAL

コードのブロックへのアクセスを一度に 1 つのスレッドのみに制限します。

FLUSH

チームのスレッドでメモリーの状態の整合性が保たれる同期ポイントを定義します。

MASKED

チームのプライマリー・スレッドで実行されるコードブロックを指定します。この機能は ifx でのみ利用できます。

MASTER (非推奨の古いディレクティブ。MASKED を参照。)

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

ORDERED

チームのスレッドがループの反復順に実行するスレッドのコードブロックを指定します。

TASKGROUP

現在のタスクの子タスクと派生タスクがすべて完了するまで待機するように指定します。

TASKWAIT

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

TASKYIELD

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

データ環境ディレクティブ

このディレクティブを使用して、データ環境に影響を与えることができます。

ディレクティブ

説明

THREADPRIVATE

各スレッドにプライベート (ローカル) な名前付き共通ブロック (スレッド内ではグローバル) を指定します。

オフロードターゲットを制御するディレクティブ

これらのディレクティブを使用して 1 つ以上のオフロードターゲット上の実行を制御します。

ディレクティブ

説明

DECLARE TARGET (ifx)

デバイス向けに作成、またはマップする名前付きルーチンと変数を指定します。この機能は ifx でのみ利用できます。

DECLARE VARIANT (ifx)

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

DISPATCH (ifx)

指定された関数やサブルーチン呼び出しに対して、プロシージャーのバリアントが呼び出されるかどうかを決定します。この機能は ifx でのみ利用できます。

DISTRIBUTE

teams 構文により生成されるすべてのスレッドチームのプライマリー・スレッド間で、ループ反復を分配するように指定します。

INTEROP (ifx)

外部のランタイム・コンテキストを識別し、そのコンテキストのランタイム特性を特定して相互運用性を実現します。この機能は ifx でのみ利用できます。

REQUIRES (ifx)

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

TARGET

デバイスデータ環境を作成してそのデバイスで構文を実行します。

TARGET DATA

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

TARGET ENTER DATA

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

TARGET EXIT DATA

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

TEAMS

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

TARGET UPDATE

デバイスデータ環境のリスト項目と対応するオリジナルのリスト項目の整合性を保持します。

ベクトル化ディレクティブ

これらのディレクティブを使用してベクトル・ハードウェア上の実行を制御します。

ディレクティブ

説明

SCAN

SIMD ループの入れ子を囲む各反復で各リスト項目を更新するスキャン計算を指定します。

SIMD (OpenMP*)

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

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

EARLY_EXIT

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

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

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

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

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

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

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

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

DECLARE SIMD

SIMD プロシージャーを生成します。

キャンセル構文

ディレクティブ

説明

CANCEL

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

CANCELLATION POINT

暗黙的または明示的なタスクが、指定された節の最内領域で取り消し要求があったかどうかをチェックするポイントを定義します。

メモリー空間割り当てディレクティブ

この宣言ディレクティブを使用してメモリー空間を割り当てます。この機能は ifx でのみ利用できます。

ディレクティブ

説明

ALLOCATE

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

結合および複合ディレクティブ

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

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

ディレクティブ

説明

DISTRIBUTE PARALLEL DO1

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

DISTRIBUTE PARALLEL DO SIMD1

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

DISTRIBUTE SIMD1

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

DO SIMD1

SIMD 命令による同時実行も適用されます。

MASKED TASKLOOP

MASKED 構造内で TASKLOOP 構造を簡潔に指定する方法を提供します。この機能は ifx でのみ利用できます。

MASKED TASKLOOP SIMD

MASKED 構造内で TASKLOOP SIMD 構造を簡潔に指定する方法を提供します。この機能は ifx でのみ利用できます。

MASTER TASKLOOP

非推奨の古いディレクティブです。MASKED 構造内で TASKLOOP 構造を簡潔に指定する方法を提供します。この機能は ifx でのみ利用できます。

MASTER TASKLOOP SIMD

非推奨の古いディレクティブです。MASTER 構造内で TASKLOOP SIMD 構造を簡潔に指定する方法を提供します。この機能は ifx でのみ利用できます。

PARALLEL DO

1 つの DO ディレクティブを含む並列領域を簡潔に指定する方法を提供します。

PARALLEL DO SIMD

SIMD 命令による同時実行も適用されます。1 つの SIMD ループ構造だけを含み、その他の文を含まない PARALLEL 構造を簡潔に指定する方法を提供します。

PARALLEL LOOP

1 つの LOOP 構造を含む並列領域を簡潔に指定する方法を提供します。この機能は ifx でのみ利用できます。

PARALLEL MASKED

PARALLEL 構造内で MASKED 構造を簡潔に指定する方法を提供します。この機能は ifx でのみ利用できます。

PARALLEL MASKED TASKLOOP

PARALLEL 構造内で MASKED TASKLOOP 構造を簡潔に指定する方法を提供します。この機能は ifx でのみ利用できます。

PARALLEL MASKED TASKLOOP SIMD

PARALLEL 構造内で MASKED TASKLOOP SIMD 構造を簡潔に指定する方法を提供します。この機能は ifx でのみ利用できます。

PARALLEL MASTER

非推奨の古いディレクティブです。PARALLEL 構造内で MASTER 構造を簡潔に指定する方法を提供します。この機能は ifx でのみ利用できます。

PARALLEL MASTER TASKLOOP

非推奨の古いディレクティブです。PARALLEL 構造内で MASTER TASKLOOP 構造を簡潔に指定する方法を提供します。この機能は ifx でのみ利用できます。

PARALLEL MASTER TASKLOOP SIMD

非推奨の古いディレクティブです。PARALLEL 構造内で MASTER TASKLOOP SIMD 構造を簡潔に指定する方法を提供します。この機能は ifx でのみ利用できます。

PARALLEL SECTIONS

1 つの SECTIONS ディレクティブを含む並列領域を簡潔に指定する方法を提供します。セマンティクスは SECTIONS ディレクティブが直後に続く PARALLEL ディレクティブを明示的に指定することと同じです。

PARALLEL WORKSHARE

1 つの WORKSHARE ディレクティブを含む並列領域を簡潔に指定する方法を提供します。

TARGET PARALLEL

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

TARGET PARALLEL DO

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

TARGET PARALLEL DO SIMD

1 つの PARALLEL DO SIMD 構造だけを含み、その他の文を含まない TARGET 構造を簡潔に指定する方法を提供します。

TARGET PARALLEL LOOP

1 つの PARALLEL LOOP 構造だけを含み、その他の文を含まない TARGET 構造を簡潔に指定する方法を提供します。この機能は ifx でのみ利用できます。

TARGET SIMD

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

TARGET TEAMS

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

TARGET TEAMS DISTRIBUTE

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

TARGET TEAMS DISTRIBUTE PARALLEL DO

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

TARGET TEAMS DISTRIBUTE PARALLEL DO SIMD

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

TARGET TEAMS DISTRIBUTE SIMD

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

TARGET TEAMS LOOP

1 つの TEAMS LOOP 構造だけを含み、その他の文を含まない TARGET 構造を簡潔に指定する方法を提供します。この機能は ifx でのみ利用できます。

TASKLOOP SIMD1

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

TEAMS DISTRIBUTE

スレッドチームを複数作成し、各チームのプライマリー・スレッドの構造化ブロックを実行します。また、TEAMS により生成されるすべてのスレッドチームのプライマリー・スレッド間で、ループ反復を分配するように指定します。

TEAMS DISTRIBUTE PARALLEL DO

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

TEAMS DISTRIBUTE PARALLEL DO SIMD

スレッドチームを複数作成し、各チームのプライマリー・スレッドの構造化ブロックを実行します。また、複数のチームのメンバーである複数のスレッドによって並列に実行できるループを指定します。ループはチーム領域のプライマリー・スレッド間で分配され、SIMD 命令を使用して命令レベルで同時に実行されます。

TEAMS DISTRIBUTE SIMD

スレッドチームを複数作成し、各チームのプライマリー・スレッドの構造化ブロックを実行します。また、チームのプライマリー・スレッド間で分配されるループを指定します。

TEAMS LOOP

1 つの LOOP 構造だけを含み、その他の文を含まない TEAMS 構造を簡潔に指定する方法を提供します。この機能は ifx でのみ利用できます。

脚注:

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