GCC 中的 OpenMP 4.0:卸载到 nVidia GPU

Posted

技术标签:

【中文标题】GCC 中的 OpenMP 4.0:卸载到 nVidia GPU【英文标题】:OpenMP 4.0 in GCC: offload to nVidia GPU 【发布时间】:2015-05-31 14:40:59 【问题描述】:

TL;DR - GCC(主干)是否已经支持将 OpenMP 4.0 卸载到 nVidia GPU?

如果是这样,我做错了什么? (如下说明)。


我正在运行 Ubuntu 14.04.2 LTS

我查看了最新的 GCC 主干(日期为 2015 年 3 月 25 日)。

我已根据Getting Started on Ubuntu 指南安装了 CUDA 7.0 工具包。 CUDA 样本运行成功,即deviceQuery 检测到我的 GeForce GT 730。

我已按照https://gcc.gnu.org/wiki/Offloading 和https://gcc.gnu.org/install/specific.html#nvptx-x-none 的指示进行操作

我已经安装了 nvptx-toolsnvptx-newlib (configure, make, sudo make install),newlib 也在 GCC 的主干目录中链接到 @ 987654329@.

然后我构建了目标加速器nvptx-none编译器:

../../trunk/configure --target=nvptx-none --enable-as-accelerator-for=x86_64-pc-linux-gnu --with-build-time-tools=/usr/local/nvptx-none/bin --disable-sjlj-exceptions --enable-newlib-io-long-long
make -j 9
sudo make install DESTDIR=/install

...以及宿主 GCC 编译器本身:

../trunk/configure --build=x86_64-pc-linux-gnu --host=x86_64-pc-linux-gnu --target=x86_64-pc-linux-gnu --enable-offload-targets=nvptx-none=/install/prefix --with-cuda-driver=/usr/local/cuda --enable-languages=c,c++
make -j 9
sudo make install DESTDIR=/install

我已经相应地设置了 LD_LIBRARY_PATH

export LD_LIBRARY_PATH=/install/usr/local/lib64:/install/usr/local/lib/gcc/nvptx-none/5.0.0/:/usr/local/cuda/lib64:$LD_LIBRARY_PATH

确实,mkoffload 工具已构建:

/install/usr/local/libexec/gcc/x86_64-pc-linux-gnu/5.0.0/accel/nvptx-none/mkoffload

还有目标和宿主编译器:

/install/usr/local/bin/x86_64-pc-linux-gnu-gcc
/install/usr/local/bin/x86_64-pc-linux-gnu-accel-nvptx-none-gcc

但是当我编译一个用omp_get_num_devices()查询设备数量的示例代码时,我得到了0的响应:

$ /install/usr/local/bin/x86_64-pc-linux-gnu-gcc -fopenmp -foffload=nvptx-none main.c
$ ./a.out
0

当我将-v(详细)选项添加到目标编译器的选项时,我得到以下输出:

$ /install/usr/local/bin/x86_64-pc-linux-gnu-gcc -fopenmp -foffload=nvptx-none="-v" main.c

Using built-in specs.
COLLECT_GCC=/install/usr/local/bin/x86_64-pc-linux-gnu-accel-nvptx-none-gcc
Target: nvptx-none
Configured with: ../../trunk/configure --target=nvptx-none --enable-as-accelerator-for=x86_64-pc-linux-gnu --with-build-time-tools=/usr/local/nvptx-none/bin --disable-sjlj-exceptions --enable-newlib-io-long-long
Thread model: single
gcc version 5.0.0 20150325 (experimental) (GCC) 
COLLECT_GCC_OPTIONS='-m64' '-S' '-fmath-errno' '-fsigned-zeros' '-ftrapping-math' '-fno-trapv' '-fno-strict-overflow' '-fno-openacc' '-foffload-abi=lp64' '-fopenmp' '-v' '-v' '-o' '/tmp/cccxIggp.mkoffload'
 /install/usr/local/bin/../libexec/gcc/x86_64-pc-linux-gnu/5.0.0/accel/nvptx-none/lto1 -quiet -dumpbase ccKOW9hi.o -m64 -auxbase-strip /tmp/cccxIggp.mkoffload -version -fmath-errno -fsigned-zeros -ftrapping-math -fno-trapv -fno-strict-overflow -fno-openacc -foffload-abi=lp64 -fopenmp -o /tmp/cccxIggp.mkoffload @/tmp/ccjRDWhp
GNU GIMPLE (GCC) version 5.0.0 20150325 (experimental) (nvptx-none)
    compiled by GNU C version 5.0.0 20150325 (experimental), GMP version 5.1.3, MPFR version 3.1.2-p3, MPC version 1.0.1
GGC heuristics: --param ggc-min-expand=30 --param ggc-min-heapsize=4096
GNU GIMPLE (GCC) version 5.0.0 20150325 (experimental) (nvptx-none)
    compiled by GNU C version 5.0.0 20150325 (experimental), GMP version 5.1.3, MPFR version 3.1.2-p3, MPC version 1.0.1
GGC heuristics: --param ggc-min-expand=30 --param ggc-min-heapsize=4096
COMPILER_PATH=/install/usr/local/bin/../libexec/gcc/x86_64-pc-linux-gnu/5.0.0/accel/nvptx-none/:/install/usr/local/bin/../libexec/gcc/
LIBRARY_PATH=/install/usr/local/bin/../lib/gcc/x86_64-pc-linux-gnu/5.0.0/accel/nvptx-none/:/install/usr/local/bin/../lib/gcc/
COLLECT_GCC_OPTIONS='-m64' '-S' '-fmath-errno' '-fsigned-zeros' '-ftrapping-math' '-fno-trapv' '-fno-strict-overflow' '-fno-openacc' '-foffload-abi=lp64' '-fopenmp' '-v' '-v' '-o' '/tmp/cccxIggp.mkoffload'

所以看起来工具链被调用并创建了.mkoffload文件。

请帮忙。如果它应该有效,我该如何诊断问题所在?

【问题讨论】:

你确定你有一个功能齐全的 CUDA 安装吗? @talonmies CUDA 样本运行成功,检测到我的 nVidia GPU 对不起,我不得不问。你不会相信人们来这里问他们的代码为什么不起作用的次数,根本原因是他们没有安装功能正常的 CUDA。 @talonmies np,请删除你的 cmets 我已经为构建 GCC 以及用于 OpenMP GPU 卸载的 Clang 创建了一个分步指南(请参阅 github.com/pc2/OMP-Offloading),因为我今年在帕德博恩大学讲授了这个主题,德国。我推荐 Clang(github 上的开发版本),因为根据我的测试,它比 GCC 和其他版本的 Clang 错误更少。顺便提一句。 GCC 对每个团队的线程数有限制,这完全破坏了 GPU 上的性能。 【参考方案1】:

TL;DR - GCC(主干)是否已经支持将 OpenMP 4.0 卸载到 nVidia GPU?

没有。

当前 GCC 仅支持将 OpenMP 4.0 卸载到 Intel Xeon Phi (KNL) 和将 OpenACC 2.0 卸载到 nVidia GPU。

有一些想法支持将 OpenMP 4.0 卸载到 nVidia GPU:[1]、[2],但尚未开始实施。

UPD 2017: GCC 7.1 现在支持将 OpenMP 4.5 卸载到 NVidia GPU [3]。

【讨论】:

哦,那么manual 指的是什么?这是否意味着 OpenACC 需要 nvptx-none 目标编译器的配置才能工作,而不是我想的 OpenMP4?或者是否有任何其他先决条件可以通过 OpenACC 将工作卸载到 GPU 上? 是的,OpenACC->PTX 需要 nvptx-none 目标编译器(以及 OpenMP->PTX,当它支持时)。我将在 wiki 页面上添加 OpenMP->PTX 尚不支持,以避免混淆。 AFAIK 这本手册是关于 OpenACC->PTX 的完整的,但是我自己没有尝试过。 哦,这对我来说是个可悲的消息。您是否碰巧知道 GCC 何时可以卸载 nvidia ? (或任何其他编译器,如 clang?) GCC 5.x 肯定不支持这个,至于 GCC 6.x - 我不知道。在 GPU 上实现 OpenMP 的某些子集相对容易,但在目标区域中支持各种 pragma 看起来相当困难(参见上面的 2 个链接)。目前,IBM 在 Clang 中致力于 OpenMP 到 GPU 的卸载:openmp.org/sc14/Booth-Sam-IBM.pdf 谢谢!然后我会检查这个 Clang 的分支,也许它已经工作了(至少部分地,在我需要的基本范围内)

以上是关于GCC 中的 OpenMP 4.0:卸载到 nVidia GPU的主要内容,如果未能解决你的问题,请参考以下文章

使用 OpenMP 4.0 (gcc 4.8.4) 而不是 OpenMP 3.1 (gcc 4.9.2) 时速度会降低

我是不是必须在 Ubuntu 18.04 上从源代码构建 gcc-10 才能卸载 OpenMP GPU 目标?

如何正确升级OpenMP版本?

OpenMP 运行时看不到我的 GPU 设备

存储在数组中的值在OpenMP gcc中更改

使用 OpenMP 将三重指针 (C) 卸载到 NVIDIA GPU