インテル® Fortran コンパイラー 18.0 デベロッパー・ガイドおよびリファレンス

コプロセッサーへの変数と関数の配置

これらの属性は変数および関数がコプロセッサーでも利用できることを保証します。

このトピックは、インテル® メニー・インテグレーテッド・コア (インテル® MIC) アーキテクチャーをターゲットとする場合にのみ適用されます。

offload ディレクティブに続く文は、コプロセッサーで実行するアウトライン関数に変換されます。このコードは、ほかの関数を呼び出すことができます。呼び出された関数がコプロセッサーでも利用できることを保証するには、ATTRIBUTES OFFLOAD ディレクティブを使用して、次のいずれかの特別な関数属性を指定する必要があります。

!DIR$ ATTRIBUTES OFFLOAD: target-name :: routine-name[ , routine-name] ...

!DIR$ ATTRIBUTES OFFLOAD: target-name :: variable-name[ , variable-name] ...

プログラムの関数はすべて、常に CPU 向けにコンパイルされ、CPU で呼び出すことができます。ただし、特定の属性で明示された関数のみ、オフロードコードで呼び出すことができます。また、これらの関数のみ、コプロセッサーで呼び出すことができます。

グローバル変数は同様の方法で扱われます。グローバル変数はすべて、CPU コードに常に存在します。しかし、ターゲット属性を含むグローバル関数のみ、コプロセッサーにオフロードされるバイナリーにコンパイルされます。

ターゲット属性で明示された関数とデータのみインテル® MIC アーキテクチャーのバイナリーにコンパイルすると、コプロセッサーのコードが可能な限り小さくなることが保証されます。

コンパイラーは、ターゲット属性を含まないオフロードコード内で参照された関数とデータに対して警告を出力します。

module offload_test
public

!DIR$ ATTRIBUTES OFFLOAD:mic :: global_value
integer :: global_value

contains
    !DIR$ ATTRIBUTES OFFLOAD:mic :: incr_global
    integer function incr_global
    global_value = global_value + 1
    incr_global = global_value
    return
    end function incr_global
end module offload_test

program main
 use offload_test
  integer i
  i = incr_global()
  print *, "global = ", global_value, "i = ", i, " (should be the same)"

オフロード構造内の関数呼び出しは、関数をターゲットで利用できるように自動的に宣言しません。関数がターゲット上で利用できることを保証するには、関数定義に適切なターゲット属性が含まれていなければなりません。

ターゲット属性を含む変数または関数の定義とすべての宣言は、すべてのコンパイル単位で互いに一致していなければなりません。

関連情報