29

I've been searching the web but I'm still very confused about this topic. Can anyone explain this more clearly? I come from an Aerospace Engineering background (not from a Computer Science one), so when I read online about OpenMP/CUDA/etc. and multithreading I don't really understand a great deal of what is being said.

I'm currently trying to parallelize an in-house CFD software written in FORTRAN. These are my doubts:

  1. OpenMP shares the workload using multiple threads from the CPU. Can it be used to allow the GPU to get some of the work too?

  2. I've read about OpenACC. Is it similar to OpenMP (easy to use)?

I've also read about CUDA and kernels, but I don't have any much experience in parallel programming and I don't have the faintest idea of what a kernel is.

  1. Is there an easy and portable way to share my workload with the GPU, for FORTRAN (if OpenMP doesn't do that and OpenACC is not portable)?

Can you give me a "for dummies" type of answer?

4

4 回答 4

14

是的。OpenMP 4 目标结构旨在支持各种加速器。GCC 7+(参见12,尽管后者尚未更新以反映 OpenMP 4 GPU 支持)、Clang(参见3、4、5Cray提供了对 NVIDIA GPU 的编译器支持。英特尔 C/C++ 编译器中提供了对英特尔 GPU 的编译器支持(参见示例6)。

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

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

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

Intel 编译器支持 C/C++ 的 Intel Gen 图形的 OpenMP 目标,但不支持 Fortran。此外,不支持teamsanddistribute子句,因为它们没有必要/不合适。下面是一个简单的示例,展示了 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
于 2017-07-27T21:32:23.323 回答
9
  1. OpenMP 4.0 标准包括对加速器(GPU、DSP、Xeon Phi 等)的支持,但我不知道 GPU 的 OpenMP 4.0 标准是否存在任何实现,只有早期经验

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

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

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

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

于 2015-03-11T07:13:18.780 回答
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 卸载功能.

于 2017-07-29T18:44:27.813 回答
2

上一个答案涵盖了大部分内容,但是由于您谈到了也为 GPU 提供了一些工作您可能需要查看异构计算框架(同时使用 CPU + GPU),例如StarPU

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

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

于 2015-03-12T00:24:05.970 回答