OpenMP可以用于GPU吗?

时间:2015-03-10 11:33:28

标签: multithreading fortran gpu openmp openacc

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

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

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

  2. 我读过有关OpenACC的文章。它与OpenMP(易于使用)类似吗?

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

    1. 对于FORTRAN,是否有一种简单易用的方式与GPU共享我的工作负载(如果OpenMP不这样做而且OpenACC不可移植)?
    2. 你能给我一个“傻瓜”类型的答案吗?

4 个答案:

答案 0 :(得分:6)

  1. OpenMP 4.0标准包括对加速器(GPU,DSP,Xeon Phi等)的支持,但我不知道GPU的OpenMP 4.0标准是否存在,只有early experience。< / p>

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

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

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

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

答案 1 :(得分:4)

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

IBM开发的用于NVIDIA GPU的OpenMP 4+的Clang / LLVM实现可从6获得。构建配方在https://github.com/clang-ykt中提供。

Cray编译器支持NVIDIA GPU的OpenMP目标。来自"OpenMP compiler for CORAL/OpenPower Heterogeneous Systems"

  

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

英特尔编译器支持针对C / C ++的英特尔Gen图形的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,但您可以看到Cray Fortran Reference Manual (8.5)适用于-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

答案 2 :(得分:3)

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

答案 3 :(得分:1)

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

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

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