是的。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获取。构建步骤在
"OpenMP compiler for CORAL/OpenPower Heterogeneous Systems"中提供。
Cray编译器支持面向NVIDIA GPU的OpenMP目标。来自
Cray Fortran Reference Manual (8.5):
支持面向NVIDIA GPU或当前CPU目标的OpenMP 4.5目标指令。必须加载适当的加速器目标模块才能使用目标指令。
Intel编译器支持C/C++的Intel Gen图形OpenMP目标,但不支持Fortran。此外,不支持
teams
和
distribute
子句,因为它们不是必要的/适当的。以下是一个简单的示例,展示了不同环境中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
选项的
documentation。
$ 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