我一直在网上搜索,但我对这个话题仍感到很困惑。谁能更清楚地解释这个?我来自航空航天工程背景(不是计算机科学专业),所以当我在网上阅读有关OpenMP / CUDA等的内容时。和多线程我真的不太了解所说的很多内容。
我目前正在尝试并行化用FORTRAN编写的内部CFD软件。这些是我的疑惑:
OpenMP使用来自CPU的多个线程共享工作负载。可以用它来让GPU也能完成一些工作吗?
我读过有关OpenACC的文章。它与OpenMP(易于使用)类似吗?
我也读过有关CUDA和内核的内容,但我对并行编程没有太多经验,而且我对内核的内容并不了解。
你能给我一个“傻瓜”类型的答案吗?
答案 0 :(得分:6)
OpenMP 4.0标准包括对加速器(GPU,DSP,Xeon Phi等)的支持,但我不知道GPU的OpenMP 4.0标准是否存在,只有early experience。< / p>
不幸的是,我认为至少现在没有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的编译器支持(请参阅1和2,尽管后者尚未更新以反映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。此外,不支持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,但您可以看到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)