TARGET / END TARGET

目的

TARGET ディレクティブは、ターゲット・タスク を生成する (つまり、変数をデバイス・データ環境にマップし、TARGET ディレクティブと END TARGET ディレクティブに囲まれたコード・ブロックをそのデバイス上で実行する) ようにコンパイラーに指示します。

TARGET ディレクティブと END TARGET ディレクティブは、ターゲット領域 を定義する場合に使用します。 この領域は、異なるデータ環境内で行われる計算のブロックであり、実行時に並列計算デバイス上にオフロードされるように意図されています。

必須指定のオプション

-qsmp および -qoffload

構文

構文図を読む構文図をスキップする
           .-+---+-------------.   
           | '-,-'             |   
           V                   |   
>>-TARGET----+---------------+-+-------------------------------><
             '-target_clause-'     

構文図を読む構文図をスキップする
>>-block-------------------------------------------------------><

構文図を読む構文図をスキップする
>>-END TARGET--------------------------------------------------><

target_clause は以下のいずれかです。

構文図を読む構文図をスキップする
>>-+-defaultmap_clause----+------------------------------------><
   +-depend_clause--------+   
   +-device_clause--------+   
   +-firstprivate_clause--+   
   +-if_clause------------+   
   +-is_device_ptr_clause-+   
   +-map_clause-----------+   
   +-nowait_clause--------+   
   '-private_clause-------'   

defaultmap_clause
これは、スカラー変数用にデフォルト暗黙マッピング規則を FIRSTPRIVATE から TOFROM に変更します。 構文は DEFAULTMAP(TOFROM:SCALAR) です。 暗黙マッピングについて詳しくは、「規則」セクションを参照してください。
depend_clause
ターゲット・タスクと、リスト項目を共有する兄弟タスクとの間のスケジューリング依存性を設定します。 構文は DEPEND(dependence-type:list) です。 dependence-type は INOUTINOUT のいずれかです。 list 内のデータ変数はコンマで区切ります。
  • dependence-type が IN または INOUT の場合、依存性タイプが OUT または INOUT であるタスクの DEPEND 節にあるリスト項目と同じストレージ・ロケーションのリスト項目ごとに、ターゲット・タスクの兄弟タスクに対するスケジューリング依存性が作成されます。
  • dependence-type が OUT または INOUT の場合、依存性タイプが INOUT、または INOUT である兄弟タスクの DEPEND 節にあるリスト項目と同じストレージ・ロケーションのリスト項目ごとに、ターゲット・タスクの兄弟タスクに対するスケジューリング依存性が作成されます。
device_clause
指定した ID を持つ装置上にデータ環境を作成します。 構文は DEVICE(scalar-integer-expression) です。 scalar-integer-expression は、omp_get_num_devices 関数の値より小さくて負ではない整数値に評価されなければなりません。
firstprivate_clause
これは、リストされたデータ変数がターゲット・タスク専用であり、領域を実行する各スレッド・チームによって共用されることを宣言します。 ステートメント・ブロック内で暗黙の宣言があるかのように、ターゲット・タスクによって参照されるリスト項目ごとに、新しい項目が作成されます。 新規 private オブジェクトはそれぞれ、元の変数の値を使用して初期化されます。
詳しくは、FIRSTPRIVATEを参照してください。
if_clause
IF 文節が存在し、その IF 文節式が false に評価される場合、ターゲット領域はホスト・データ環境においてホスト・デバイスによって実行されます。 構文は IF([TARGET:]logical-expression) です。
is_device_ptr_clause
リストされたデータ変数が、装置データ環境内に存在する装置ポインターであることを指示します。 リストされたデータ変数はいずれも、仮引数でなければなりません。 構文は IS_DEVICE_PTR(list) です。
map_clause
これは、ホスト・データ環境にある元の変数から、構文で指定されたデバイスのデバイス・データ環境において対応する変数に、リストにあるデータ変数を明示的にマップするように指定します。 構文は MAP([[map-type-modifier[,]]map-type:]list) です。
map-type は、TOFROMTOFROM、または ALLOC にすることができます。
  • リスト項目が装置データ環境に存在しない場合は、新しい項目が装置データ環境に作成されます。
    • map-typeTO または TOFROM の場合は、この新しい項目が、ホスト・データ環境内の list にある元のリスト項目の値で初期化されます。
    • map-typeFROM または ALLOC の場合、デバイス・データ環境内のリスト項目の初期値は未定義です。
    ターゲット領域の終了時、この構文が最初に検出されたときにリスト項目のストレージが装置データ環境に作成された場合は、リスト項目が装置データ環境から割り振り解除されます。 さらに、map-typeFROM または TOFROM の場合は、デバイス・データ環境内のリスト項目が割り当て解除される前に、元のリスト項目が、デバイス・データ環境内の対応するリスト項目の現行値で更新されます。
  • リスト項目が装置データ環境に存在する場合は、構文が検出されると、装置環境内の項目の割り振りカウントが以下のように変更されます。
    • 構文の始まりで 1 ずつ増加されます。
    • 構文の終わりで 1 ずつ減少されます。
map-type-modifierALWAYS です。 この修飾子が存在する場合は、以下の規則が適用されます。
  • map-typeTO または TOFROM の場合は、元のリスト項目の値が常にデバイス環境にコピーされます。 これは、リスト項目に関してデバイス・データ環境に新規項目が作成されたかどうかには関係なく行われます。
  • map-typeFROM または TOFROM の場合は、リスト項目の値が常にデバイス環境から元のリスト項目にコピーされます。 これは、構文の終了時にデバイス・リスト項目が割り当て解除されるかどうかには関係なく行われます。
関連名を map_clause で指定できます。
nowait_clause
ターゲット・タスクがまだ完了していなくても、親タスクを進行できるように、暗黙のバリアを除去します。 デフォルトでは、暗黙のバリアは target 構文の終わりに存在します。 これにより、ターゲット・タスクが完了するまで親タスクは続行できません。 構文は NOWAIT です。
private_clause
これは、リストされたデータ変数がターゲットに専用であり、領域を実行する各スレッド・チームによって共用されることを宣言します。 ターゲット・タスクによって参照されるリスト項目ごとに、新しい項目が作成されます。
詳しくは、PRIVATEを参照してください。
reduction_clause
list 内の各データ変数に関して、プライベート・コピーが作成され、reduction-identifier に基づいて初期化されることを指定します。 領域の終了時に、元のデータ変数は、reduction-identifier に基づいたコンバイナーを使用して、プライベート・コピーの値で更新されます。

構文は REDUCTION(reduction-identifier:list) です。スカラー変数は list でサポートされています。 list 内の項目はコンマで区切ります。 reduction-identifier は、演算子 +-*.and..or..eqv..neqv.、または組み込みプロシージャー名 maxminiandiorieor のいずれかです。

制限: TARGET ディレクティブの reduction 節は、TARGET PARALLEL DOTARGET TEAMS DISTRIBUTE PARALLEL DO のような組み合わせ構文の形式でのみサポートされます。
block
これは、デバイス・データ環境で実行されるコード・ブロックを表します。

規則

ターゲット領域の実行は、その領域がデバイス環境に正常にオフロードされたかどうかに依存します。 ターゲット領域を装置に正常にオフロードできない場合、ターゲット領域はホスト環境内で実行されます。

ターゲット領域のネストは、動的でも静的でも許可されません。

ターゲット領域のデータ環境は、ホストと装置間の変数の暗黙マッピングまたは明示マッピングによって定義されます。
暗黙マッピング
装置データ環境への、装置データ環境からの、またはその両方のマッピングを行う必要のある変数をコンパイラーが決定します。 明示的にマップされていないスカラー変数は、DEFAULTMAP(TOFROM:SCALAR) が指定されていない場合は FIRSTPRIVATE として暗黙的にマップされます。
明示マッピング
ターゲット領域で MAP 文節を使用すれば、デバイス・データ環境との間でマップされる変数を明示的にリストできます。

リストされたデータ変数は、同じ target 構文上のデータ共有節とマップ節の両方で使用することはできません。

INTEGER :: x
x = 1
!$OMP TARGET MAP(TOFROM: x)
  x = x + 1
!$OMP END TARGET
WRITE(*,*) "After target region, x = ", x

整数 x はホスト環境で宣言され、その初期値はホストで 1 に設定されます。 ターゲット領域は明示マップ・タイプ TOFROMx で宣言されるため、x のストレージはデバイス上に割り当てられ、x のデバイス・コピーは 1 に初期化されます。 ターゲット領域内で、デバイス上の x のコピーの値は 1 ずつ増加されます。 ターゲット領域の終了時に、x はマップ・タイプ TOFROM に従ってホスト環境にマップし戻され、ホストから x の値が 2 になるように出力されます。