OpenMP可以用于GPU吗?

And*_*ida 24 multithreading fortran gpu openmp openacc

我一直在网上搜索,但我仍然对此话题感到困惑.谁能更清楚地解释这个?我来自航空航天工程背景(不是计算机科学专业),所以当我在网上阅读有关OpenMP/CUDA等的内容时.和多线程我真的不太了解所说的很多内容.

我目前正在尝试并行化用FORTRAN编写的内部CFD软件.这些是我的疑惑:

  1. OpenMP使用来自CPU的多个线程共享工作负载.它可以用来让GPU也能完成一些工作吗?

  2. 我读过OpenACC.它是否类似于OpenMP(易于使用)?

我也读过有关CUDA和内核的内容,但我对并行编程没有太多经验,而且我对内核的内容并不了解.

  1. 对于FORTRAN,是否有一种简单易用的方式与GPU共享我的工作负载(如果OpenMP不这样做而OpenACC不可移植)?

你能给我一个"傻瓜"类型的答案吗?

Jef*_*eff 8

是。OpenMP 4目标构造被设计为支持各种加速器。对于NVIDIA GPU的编译器支持可从GCC 7+(参见12,尽管后者还没有被更新,以反映OpenMP的4 GPU支持),锵(见345),和Cray。英特尔C / C ++编译器提供了对英特尔GPU的编译器支持(例如参见6)。

可从https://github.com/clang-ykt获得IBM为NVIDIA GPU开发的OpenMP 4+的Clang / LLVM实现。在“用于CORAL / OpenPower异构系统的OpenMP编译器”中提供了构建配方。

Cray编译器支持NVIDIA GPU的OpenMP目标。从Cray Fortran参考手册(8.5)

支持将OpenMP 4.5 target指令用于NVIDIA GPU或当前CPU目标。必须加载适当的加速器目标模块才能使用目标指令。

Intel编译器支持C / C ++的Intel Gen图形的OpenMP目标,但不支持Fortran。此外,不支持teamsand 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];
}
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

  • IBM正在开发两个OpenMP编译器。一种是Clang / LLVM一种。另一个是XL编译器。对于Fortran,XL Fortran编译器从版本[15.1.5](https://www.ibm.com/support/knowledgecenter/SSAT4T_15.1.5/com.ibm开始)支持将OpenMP 4.5的很大一部分卸载到NVIDIA GPU。 xlf1515.lelinux.doc / getstart / omp_v1315v1515.html)。今年和明年将添加更多功能,以期在2018年获得完全支持。如果您使用的是POWER,则可以加入Beta版计划以获取最新功能。 (2认同)
  • 这是一个非常有用的答案。谢谢!在CPU上,“ simd”子句通常不是很有用,但在GPU上,它似乎起了很大的作用(使用GCC)。请参阅[此答案](/sf/answers/3440410501/)的末尾。 (2认同)

小智 6

  1. OpenMP 4.0标准包括对加速器(GPU,DSP,Xeon Phi等)的支持,但我不知道任何存在执行的OpenMP 4.0标准的GPU,只有早期的经验.

  2. OpenACC确实类似于OpenMP并且易于使用.好的OpenACC教程:第1 部分第2部分.

不幸的是,我认为至少现在没有CPU和GPU的可移植解决方案(OpenCL除外,但与OpenMP和OpenACC相比,它的级别太低).

如果您需要便携式解决方案,可以考虑使用Intel Xeon Phi加速器而不是GPU.英特尔Fortran(和C/C++)编译器包括对CPU和Xeon Phi的OpenMP支持.

此外,要创建一个真正可移植的解决方案,使用合适的并行技术是不够的.您必须修改程序才能提供足够的并行度.有关可能方法的示例,请参见" 结构化并行编程 "或类似书籍.


Raf*_*rob 5

补充一下上述其他平台上的支持:IBM 正在为两个 OpenMP 4.5 编译器做出贡献:一个是开源 Clang/LLVM 编译器。另一个是IBM 的XL 编译器。两个编译器共享相同的帮助程序 OpenMP 卸载库,但编译器的代码生成和 GPU 优化不同。对于 Fortran,XL Fortran 编译器支持从版本15.1.5开始将大量 OpenMP 4.5 卸载到 NVIDIA GPU 。(以及XL C/C++版本13.1.5)。今年和明年将添加更多功能,目标是在 2018 年提供完整支持。如果您使用 POWER,您可以加入 XL 编译器测试版计划,以访问我们最新的 Fortran 和 C/C++ OpenMP 卸载功能.