【问题标题】:Can OpenMP be used for GPUs?OpenMP 可以用于 GPU 吗?
【发布时间】:2015-03-10 11:33:27
【问题描述】:

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

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

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

  2. 我读过关于 OpenACC 的文章。是不是和 OpenMP 类似(好用)?

我也读过关于 CUDA 和内核的文章,但我在并行编程方面没有太多经验,而且我对内核是什么一无所知。

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

你能给我一个“傻瓜式”的答案吗?

【问题讨论】:

标签: multithreading fortran gpu openmp openacc


【解决方案1】:

是的。 OpenMP 4 目标结构旨在支持各种加速器。 GCC 7+ 提供了对 NVIDIA GPU 的编译器支持(请参阅 12,尽管后者尚未更新以反映 OpenMP 4 GPU 支持)、Clang(请参阅 345 ) 和克雷。英特尔 C/C++ 编译器中提供了对英特尔 GPU 的编译器支持(参见例如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 目标指令。一个 必须加载适当的加速器目标模块才能使用目标指令。

英特尔编译器支持 C/C++ 的英特尔代图形的 OpenMP 目标,但不支持 Fortran。此外,不支持 teamsdistribute 子句,因为它们没有必要/不合适。下面是一个简单示例,展示了 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 设置,但您可以查看 documentation 以获得适当的 -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

【讨论】:

  • 这个问题专门针对 Fortran。
  • IBM 正在开发两个 OpenMP 编译器。一种是 Clang/LLVM 之一。另一个是 XL 编译器。对于 Fortran,XL Fortran 编译器支持将大量 OpenMP 4.5 卸载到 NVIDIA GPU,从版本 15.1.5 开始。今年和明年将添加更多功能,目标是在 2018 年获得全面支持。如果您使用 POWER,则可以加入 Beta 计划以访问最新功能。
  • @VladimirF 问题说考虑了 CUDA。 CUDA 是 C/C++ 的衍生产品,因此英特尔 C/C++ 中的 OpenMP 4 支持同样适用。此外,Fortran 2003 中的 C 互操作性特性意味着 Fortran 应用程序开发不会与基于或仅限于 C/C++(例如 OpenCL)的加速器模型相互排斥。
  • @RafikZurob 您应该将其发布为问题的答案,因为它可能会在此处作为评论被遗漏。我为英特尔工作,所以我无法评估或评论 POWER 生态系统。我在 x86 上使用了 Clang/LLVM 实现,这就是我评论它的原因。
  • 这是一个非常有用的答案。谢谢!在 CPU 上,simd 子句通常不是很有帮助,但在 GPU 上它似乎有很大的不同(使用 GCC)。见this answer的结尾。
【解决方案2】:
  1. OpenMP 4.0 标准包括对加速器(GPU、DSP、Xeon Phi 等)的支持,但我不知道 GPU 的 OpenMP 4.0 标准是否存在任何实现,只有 early experience

  2. OpenACC 确实类似于 OpenMP 并且易于使用。不错的 OpenACC 教程:part 1part 2

不幸的是,我认为至少目前还没有针对 CPU 和 GPU 的便携式解决方案(OpenCL 除外,但与 OpenMP 和 OpenACC 相比,它的级别太低了)。

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

此外,要创建真正可移植的解决方案,仅使用合适的并行技术是不够的。您必须修改程序才能提供足够的并行度。有关可能方法的示例,请参阅“Structured Parallel Programming”或类似书籍。

【讨论】:

  • 哪个更好?在 CPU 或 GPU 上运行程序的计算量大的部分?当然要看具体的硬件,但一般情况下呢?
  • 一般来说,最好在 GPU(或 Xeon Phi 或 FPGA 等其他加速器)上运行计算密集型部件。现代加速器的性能至少是 CPU 性能的 5 倍。
【解决方案3】:

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

【讨论】:

    【解决方案4】:

    前面的答案涵盖了大部分内容,但是由于您谈到要让 GPU 完成一些工作以及,您可能想看看异构计算框架(CPU + GPU 同时),比如StarPU

    由于 StarPU 仅适用于 C/C++,因此您有 ForOpenCL 用于 Fortran。

    在任何情况下,您都必须考虑权衡性能和便利性。

    【讨论】:

    • 你注意到 Fortran 标签了吗?
    • StarPU 看起来很酷,但如果我没看错的话,它只适用于 C。
    • 此响应甚至没有尝试回答问题。
    猜你喜欢
    • 2016-01-05
    • 1970-01-01
    • 1970-01-01
    • 2021-09-23
    • 1970-01-01
    • 2021-10-10
    • 2021-05-04
    • 2017-11-24
    • 2015-02-16
    相关资源
    最近更新 更多