インテル® Fortran Composer XE 2013 の OpenMP* 4.0 機能

同カテゴリーの次の記事

インテル® C++/Fortran コンパイラーのベクトル化レポートを基にソースに注釈を付ける Python* スクリプト

この記事は、インテル® デベロッパー・ゾーンに掲載されている「OpenMP* 4.0 Features in Intel Fortran Composer XE 2013」の日本語参考訳です。


OpenMP* 4.0 には、コプロセッサー上のベクトル化と実行を制御する新機能が追加されます。インテル® [Visual] Fortran Composer XE 2013 Update 2 (コンパイラー 13.1) では、これらの新機能の多くをサポートしています。新機能の多くは、インテル固有のコンパイラー指示句として追加されます。

新機能に関する説明は、将来のリリースで製品ドキュメントに追加される予定です。それまでは、この記事の説明を参照してください。ご質問またはご意見がある場合は、ユーザーフォーラム (英語) またはインテル® プレミアサポートまでお問い合わせください。

注意: 以下の構文および説明は、『OpenMP Technical Report 1 on Directives for Attached Accelerators』から抜粋したものです。一部の構文や機能は、OpenMP* 4.0 の最終規格の決定時に変更される可能性があります。変更された場合は、それに合わせてコードを修正してください。

新しい OpenMP* 指示句
OMP SIMD
OMP DECLARE SIMD
OMP DO SIMD
OMP PARALLEL DO SIMD
OMP TARGET DATA
OMP TARGET
OMP TARGET UPDATE
OMP DECLARE TARGET
OMP DECLARE TARGET MIRROR
OMP DECLARE TARGET LINKABLE

TARGET* 指示句の新しい OpenMP* 節:
SCRATCH
MAPTO
MAPFROM
MAP

新しい OpenMP* ルーチン

SIMD

OpenMP* Fortran コンパイラー指示句: ループの SIMD ベクトル化を要求および制御します。

c$OMP SIMD [clause[[,] clause]…]

c

コメント。C (または c)、!、* のいずれか (詳細は、「コンパイラー指示句の構文規則」を参照)。

clause

DO または SIMD 指示句で使用できる節のいずれか。

do-loop

1 つ以上の DO 反復 (DO ループ)。DO 反復を DO WHILE またはループ制御なしの DO ループにすることはできません。DO ループ反復変数は整数でなければいけません。

ループ構文に関連するすべてのループは構造化され完全な入れ子でなければいけません。つまり、2 つのループ間に干渉するコードやほかの OpenMP* Fortran 指示句があってはいけません。

DO ループの反復はスレッドのチーム全体に分配されます。DO 指示句に関連する DO ループのループ制御引数の値は、チームのすべてのスレッドで同じでなければいけません。

DO SIMD 指示句と関連する DO ループの外に分岐することはできません。

END DO SIMD 指示句を指定しなかった場合、do-loop の最後に END DO SIMD 指示句があると仮定されます。

DO SIMD 構文は、SIMD 構文に適用される任意の節と一致する方法で、関連する DO ループを SIMD ループに変換します。生成される SIMD チャンクと残りの反復は、DO 構文に適用される任意の節と一致する方法で、並列領域の暗黙のタスクにわたって分配されます。


PARALLEL DO SIMD

OpenMP* Fortran コンパイラー指示句: SIMD 命令を使用して同時に実行できるループを指定します。

c$OMP PARALLEL DO SIMD [clause[[,] clause]…]
do-loop
[ c$OMP END PARALLEL DO SIMD ]

c

コメント。C (または c)、!、* のいずれか (詳細は、「コンパイラー指示句の構文規則」を参照)。

clause

PARALLELDO または SIMD 指示句で使用できる節のいずれか。意味および制限は同じ。

do-loop

1 つ以上の DO 反復 (DO ループ)。DO 反復を DO WHILE またはループ制御なしの DO ループにすることはできません。DO ループ反復変数は整数でなければいけません。

ループ構文に関連するすべてのループは構造化され完全な入れ子でなければいけません。つまり、2 つのループ間に干渉するコードやほかの OpenMP* Fortran 指示句があってはいけません。

DO ループの反復はスレッドのチーム全体に分配されます。DO 指示句に関連する DO ループのループ制御引数の値は、チームのすべてのスレッドで同じでなければいけません。

DO SIMD 指示句と関連する DO ループの外に分岐することはできません。

END PARALLEL DO SIMD 指示句を指定しなかった場合、do-loop の最後に END PARALLEL DO SIMD 指示句があると仮定されます。

PARALLEL DO SIMD 構文に NOWAIT を指定することはできません。


TARGET DATA

OpenMP* Fortran コンパイラー指示句: 領域の範囲のデバイスデータ環境を作成します。この指示句はインテル® MIC アーキテクチャーにのみ適用されます。

c$OMP TARGET DATA [clause[[,] clause]…]
block
[ c$OMP END TARGET DATA ]

c

コメント。C (または c)、!、* のいずれか (詳細は、「コンパイラー指示句の構文規則」を参照)。

clause

次のいずれか (複数指定可)。

  • DEVICE (integer-expression)

    ターゲットデバイスを指定します。

    integer-expression は正の整数値でなければいけません。

    DEVICE が指定されない場合、デフォルトのデバイスは内部制御変数 (ICV) device-num-var によって決定されます

    TARGET DATA 指示句には 1 つの DEVICE 節のみ記述できます。

  • MAP (list)

    以下の説明を参照。

  • MAPTO (list)

    以下の説明を参照。

  • MAPFROM (list)

    以下の説明を参照。

  • SCRATCH (list)

    以下の説明を参照。

  • IF (expression)

    条件文を指定します。

    expression は .TRUE. または .FALSE. のスカラー論理式です。

    IF 節が指定され、expression が .FALSE. である場合、新しいデバイスデータ環境は作成されません。

    TARGET DATA 指示句には 1 つの IF 節のみ記述できます。

block

文または構文の構造ブロック (セクション)。コードのブロックの内または外への分岐は許可されていません。

TARGET DATA 指示句が使用された場合、END TARGET DATA 指示句をブロックの最後の直後に記述しなければいけません。END TARGET DATA 指示句を指定しなかった場合、ブロックの最後に END TARGET DATA 指示句があると仮定されます。

TARGET DATA 構文のタスク領域のバインドは到達したタスクです。ターゲット領域は囲まれた並列またはタスク領域にバインドされます。

TARGET DATA 構文に到達すると、新しいデバイスデータ環境が作成され、到達したタスクがターゲットデータ領域を実行します。

新しいデバイスデータ環境は、囲まれたデータ環境と、構文で指定された MAP、MAPTO、MAPFROM、または SCRATCH 節から構築されます。

プログラムは TARGET DATA 指示句の節の評価順、または節の評価の副作用に依存してはいけません。


TARGET

OpenMP* Fortran コンパイラー指示句: デバイスデータ環境を作成して同じデバイスで構文を実行します。この指示句はインテル® MIC アーキテクチャーにのみ適用されます。

c$OMP TARGET [clause[[,] clause]…]
construct
[ c$OMP END TARGE ]

c

コメント。C (または c)、!、* のいずれか (詳細は、「コンパイラー指示句の構文規則」を参照)。

clause

次のいずれか (複数指定可)。

  • DEVICE (integer-expression)

    ターゲットデバイスを指定します。

    integer-expression は正の整数値でなければいけません。

    DEVICE が指定されない場合、デフォルトのデバイスは内部制御変数 (ICV) device-num-var によって決定されます

    TARGET DATA 指示句には 1 つの DEVICE 節のみ記述できます。

  • MAP (list)

    以下の説明を参照。

  • MAPTO (list)

    以下の説明を参照。

  • MAPFROM (list)

    以下の説明を参照。

  • NUM_THREADS (list)

    新しいデバイスデータ環境の内部制御変数 (ICV) nthreads-var に設定される値を表します。list は、スコープユニットにアクセス可能な 1 つ以上の変数または共通ブロックの名前です。

NUM_THREADS 節は、内部制御変数 (ICV) nthreads-var の値よりも優先されます。

  • SCRATCH (list)

    以下の説明を参照。

  • IF (expression)

    条件文を指定します。

    expression は .TRUE. または .FALSE. のスカラー論理式です。

    IF 節が指定され、expression が .FALSE. である場合、ターゲット領域はデバイスによって実行されません。到達したタスクによって実行されます。

    TARGET DATA 指示句には 1 つの IF 節のみ記述できます。

construct

PARALLEL DO 構文または PARALLEL SECTIONS 構文。

TARGET DATA 指示句が指定された場合、END TARGET 指示句をブロックの最後の直後に記述しなければいけません。END TARGET 指示句を指定しなかった場合、ブロックの最後に END TARGET 指示句があると仮定されます。

TARGET 構文は到達したタスクにバインドされます。ターゲット領域は囲まれた並列またはタスク領域にバインドされます。

この構文は、TARGET DATA 構文で提供される機能の上位セットを提供します。

TARGET 構文は、領域がデバイスによって実行されることも指定します。到達したタスクは、デバイスが構文の最後のターゲット領域を完了するまで待機します。

TARGET、TARGET DATA、または TARGET UPDATE 構文がターゲット領域内に含まれる場合、その構文は無視されます。


TARGET UPDATE

OpenMP* Fortran コンパイラー指示句: 対応するオリジナルのリスト項目と一致するデバイスデータ環境にリスト項目を作成します。この指示句はインテル® MIC アーキテクチャーにのみ適用されます。

c$OMP TARGET UPDATE [clause[[,] clause]…]

c

コメント。C (または c)、!、* のいずれか (詳細は、「コンパイラー指示句の構文規則」を参照)。

clause

次のいずれか (複数指定可)。

  • DEVICE (integer-expression)

    ターゲットデバイスを指定します。

    integer-expression は正の整数値でなければいけません。

    DEVICE が指定されない場合、デフォルトのデバイスは内部制御変数 (ICV) device-num-var によって決定されます

    TARGET UPDATE 指示句には 1 つの DEVICE 節のみ記述できます。

  • MAPTO (list)

    以下の説明を参照。

  • MAPFROM (list)

    以下の説明を参照。

  • IF (expression)

    条件文を指定します。

    expression は .TRUE. または .FALSE. のスカラー論理式です。

    IF 節が指定され、expression が .FALSE. である場合、TARGET UPDATE 構文は無視されます。

    TARGET UPDATE 指示句には 1 つの IF 節のみ記述できます。

TARGET UPDATE 構文は到達したタスクにバインドされます。ターゲット領域は囲まれた並列またはタスク領域にバインドされます。TARGET UPDATE 構文はターゲット領域内に含まれてはいけません。

対応するオリジナルのリスト項目がデバイスデータ環境に存在しない場合、リスト項目は MAPTO または MAPFROM 節で無視されます。

MAPTO 節に含まれるリスト項目は、MAPFROM 節に含まれてはいけません。逆も同様です。


DECLARE TARGET

OpenMP* Fortran コンパイラー指示句: ターゲット領域から呼び出すことができる名前付きルーチンのデバイス固有のバージョンを作成します。この指示句はインテル® MIC アーキテクチャーにのみ適用されます。

c$OMP DECLARE TARGET (routine-name)

c

コメント。C (または c)、!、* のいずれか (詳細は、「コンパイラー指示句の構文規則」を参照)。

routine-name

関数またはサブルーチンの名前。

指定された関数またはサブルーチンは、デバイスで実行するターゲット領域内で使用できます。

DECLARE TARGET 指示句で作成したバージョンのルーチンへのアクセスにプロシージャー・ポインターを使用することはできません。


DECLARE TARGET MIRROR

OpenMP* Fortran コンパイラー指示句: 変数をコピーして、デバイスが自身のコピーを所有するように指定します。この指示句はインテル® MIC アーキテクチャーにのみ適用されます。

c$OMP DECLARE TARGET MIRROR  (list)

c

コメント。C (または c)、!、* のいずれか (詳細は、「コンパイラー指示句の構文規則」を参照)。

list

スコープユニットにアクセス可能な 1 つ以上の変数または共通ブロックの名前。サブオブジェクトは指定できません。名前はカンマで区切り、名前付き共通ブロックはスラッシュ間 (/ /) に記述します。

DECLARE TARGET MIRROR 指示句に記述される各リスト項目について、対応するリスト項目がプログラムの範囲のデバイスデータ環境で利用可能です。オリジナルのリスト項目が初期化された場合、デバイスデータ環境の対応するリスト項目も同じ値に初期化されます。


DECLARE TARGET LINKABLE

OpenMP* Fortran コンパイラー指示句: 名前付きリスト項目がデバイスで利用可能になるように指定します。この指示句はインテル® MIC アーキテクチャーにのみ適用されます。

c$OMP DECLARE TARGET LINKABLE  (list)

c

コメント。C (または c)、!、* のいずれか (詳細は、「コンパイラー指示句の構文規則」を参照)。

list

スコープユニットにアクセス可能な 1 つ以上の変数または共通ブロックの名前。サブオブジェクトは指定できません。名前はカンマで区切り、名前付き共通ブロックはスラッシュ間 (/ /) に記述します。

DECLARE TARGET LINKABLE 構文は変数をデバイスに移動しません。変数をデバイスに移動するには、TARGET DATA または TARGET 構文を指定する必要があります。


TARGET* 指示句の新しい OpenMP* 節:

TARGET 指示句は、インテル® MIC アーキテクチャーでのみ利用できます。

MAP、MAPTO、MAPFROM、および SCRATCH 節は、OpenMP* Fortran TARGET 指示句で使用されます。これらの節はデータモーション節と呼ばれます。

これらの節に記述されたリスト項目から、構文と関連するデバイスデータ環境に対応する新しいリスト項目が作成されます。新しいリスト項目が作成された場合、同じ型、種類、ランクの新しいリスト項目が割り当てられます。新しいリスト項目の初期値は未定義です。

オリジナルのリスト項目と新しいリスト項目はストレージを共有することがあります。つまり、データ競合が発生する可能性があります。データ競合は、意図しないデータの共有によって発生します。例えば、同期なしで、あるタスクまたはデバイスによる項目への書き込みに、別のタスクまたはデバイスによるほかの項目の読み取りが続く場合、データ競合が発生します。

これらの節は、内部制御変数 (ICV) の値を変更しません。

各節の説明を以下に示します。

SCRATCH 節

Parallel 指示句の節: 新しいデバイスデータ環境で利用可能な 1 つ以上のリスト項目を宣言します。この節は、インテル® MIC アーキテクチャーでのみ利用可能な TARGET 指示句でのみ使用できます。

SCRATCH (list)

list

スコープユニットにアクセス可能な 1 つ以上の変数または共通ブロックの名前。サブオブジェクトは指定できません。名前はカンマで区切り、名前付き共通ブロックはスラッシュ間 (/ /) に記述します。

オリジナルのリスト項目の対応するリスト項目が、囲まれたデバイスデータ環境にある場合、新しいデバイスデータ環境は囲まれたデバイスデータ環境の対応するリスト項目を使用します。

対応するリスト項目が、囲まれたデバイスデータ環境にない場合、オリジナルのリスト項目から言語固有の属性を含む新しいリスト項目が、新しいデバイスデータ環境に作成されます。この新しいリスト項目が、新しいデバイスデータ環境のオリジナルのリスト項目に対応するリスト項目になります。

オーバーラップした変数が使用された場合、動作は未定義です。

MAP 節

Parallel 指示句の節: MAPTO および MAPFROM 機能の両方を提供します。この節は、インテル® MIC アーキテクチャーでのみ利用可能な TARGET 指示句でのみ使用できます。

MAP (list)

list

スコープユニットにアクセス可能な 1 つ以上の変数または共通ブロックの名前。サブオブジェクトは指定できません。名前はカンマで区切り、名前付き共通ブロックはスラッシュ間 (/ /) に記述します。

この節は、MAPTO および MAPFROM 節の両方で提供される機能を提供します。

MAPFROM 節

Parallel 指示句の節: 新しいデバイスデータ環境で利用可能にする 1 つ以上のリスト項目を宣言し、領域の最後の後でオリジナルのリスト項目に対応するリスト項目の値を割り当てます。この節は、インテル® MIC アーキテクチャーでのみ利用可能な TARGET 指示句でのみ使用できます。

MAPFROM (list)

list

スコープユニットにアクセス可能な 1 つ以上の変数または共通ブロックの名前。サブオブジェクトは指定できません。名前はカンマで区切り、名前付き共通ブロックはスラッシュ間 (/ /) に記述します。

この節は、SCRATCH 節で提供される機能の上位セットを提供します。

MAPTO 節

Parallel 指示句の節: 新しいデバイスデータ環境で利用可能にする 1 つ以上のリスト項目を宣言します。領域の入口で、新しい対応するリスト項目はオリジナルのリスト項目の値に初期化されます。この節は、インテル® MIC アーキテクチャーでのみ利用可能な TARGET 指示句でのみ使用できます。

MAPTO (list)

list

スコープユニットにアクセス可能な 1 つ以上の変数または共通ブロックの名前。サブオブジェクトは指定できません。名前はカンマで区切り、名前付き共通ブロックはスラッシュ間 (/ /) に記述します。

この節は、SCRATCH 節で提供される機能の上位セットを提供します。

マップの初期化は代入のように行われます。


新しい OpenMP* ルーチン

新しい OpenMP* ルーチンを次に示します。

OpenMP* Fortran 並列ルーチン

名前

説明

OMP_GET_DEVICE_NUM

デフォルトのデバイス番号を決定する内部制御変数 (ICV) device-num-var の値を取得します。

OMP_GET_PROC_BIND

次の最も内側の入れ子の並列領域に使用するスレッド・アフィニティー・ポリシーを取得します。

OMP_SET_DEVICE_NUM

デフォルトのデバイス番号を決定する内部制御変数 (ICV) device-num-var の値を設定します。

コンパイラーの最適化に関する詳細は、最適化に関する注意事項を参照してください。

関連記事