はい。OpenMP 4 ターゲット コンストラクトは、幅広いアクセラレータをサポートするように設計されています。NVIDIA GPU のコンパイラ サポートは、GCC 7+ ( 1および2を参照。ただし、後者は OpenMP 4 GPU サポートを反映するように更新されていません)、Clang (3、4、5 を参照) 、およびCrayから利用できます。Intel GPU のコンパイラ サポートは、Intel C/C++ コンパイラで利用できます (例6を参照)。
IBM が開発した NVIDIA GPU 用の OpenMP 4+ の Clang/LLVM 実装は、https://github.com/clang-yktから入手できます。ビルドレシピは「CORAL/OpenPower Heterogeneous Systems向けOpenMPコンパイラ」で提供されています。
Cray コンパイラは、NVIDIA GPU の OpenMP ターゲットをサポートしています。Cray Fortran リファレンス マニュアル (8.5)から:
OpenMP 4.5 ターゲット ディレクティブは、NVIDIA GPU または現在の CPU ターゲットをターゲットにするためにサポートされています。ターゲット ディレクティブを使用するには、適切なアクセラレータ ターゲット モジュールをロードする必要があります。
Intel コンパイラは、C/C++ の Intel Gen グラフィックスの OpenMP ターゲットをサポートしていますが、Fortran はサポートしていません。さらに、teams
anddistribute
句は必要/適切ではないため、サポートされていません。以下は、OpenMP ターゲット機能がさまざまな環境でどのように機能するかを示す簡単な例です。
void vadd2(int n, float * a, float * b, float * c)
{
#pragma omp target map(to:n,a[0:n],b[0:n]) map(from:c[0:n])
#if defined(__INTEL_COMPILER) && defined(__INTEL_OFFLOAD)
#pragma omp parallel for simd
#else
#pragma omp teams distribute parallel for simd
#endif
for(int i = 0; i < n; i++)
c[i] = a[i] + b[i];
}
Intel と GCC のコンパイラ オプションは次のとおりです。NVIDIA GPU 用の GCC セットアップはありませんが、適切なオプションについてはドキュメントを参照してください。-foffload
$ icc -std=c99 -qopenmp -qopenmp-offload=gfx -c vadd2.c && echo "SUCCESS" || echo "FAIL"
SUCCESS
$ gcc-7 -fopenmp -c vadd2.c && echo "SUCCESS" || echo "FAIL"
SUCCESS