GCC 中的 OpenMP 4.0:将工作转移到 nVidia GPU

13

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

如果是这样,那么我做错了什么?(下面有描述)。


我正在运行 Ubuntu 14.04.2 LTS

我已经检出了最新的 GCC trunk(日期为2015年3月25日)。

我已根据 在Ubuntu上入门 指南安装了 CUDA 7.0 工具包。CUDA示例成功运行,即 deviceQuery 检测到我的 GeForce GT 730。

我按照 https://gcc.gnu.org/wiki/Offloadinghttps://gcc.gnu.org/install/specific.html#nvptx-x-none 的说明进行操作。

我已经安装了 nvptx-toolsnvptx-newlib(使用 configuremakesudo make install 命令),并使用 ln -s 在GCC的trunk目录中链接了newlib。

然后我构建了 target accelerator 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
@talonmies,CUDA示例成功运行,检测到我的nVidia GPU。 - Marc Andreson
抱歉,但我必须问一下。你无法想象有多少人来这里问为什么他们的代码不起作用,而根本原因是他们没有安装有效的CUDA。 - talonmies
@talonmies 没问题,请删除您的评论。 - Marc Andreson
1
我已经创建了一个逐步指南,用于构建OpenMP GPU卸载的GCC和Clang(请参见https://github.com/pc2/OMP-Offloading),因为我今年在德国帕德博恩大学讲授了这个主题。我推荐使用Clang(在github上的开发版本),因为根据我的测试,它比GCC和其他版本的Clang更少出现错误。顺便说一下,GCC对于每个团队的线程数有限制,这完全破坏了GPU的性能。 - xin
@xin 太棒了!! - Marc Andreson
1个回答

14
TL;DR - GCC(trunk)已经支持将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],但尚未开始实施。 更新于2017年:GCC 7.1现在支持将OpenMP 4.5卸载到NVidia GPU。[3]

哦,那么这个手册是指什么?这是否意味着需要配置nvptx-none目标编译器才能使OpenACC工作,而不是我之前认为的OpenMP4?或者还有其他先决条件可以通过OpenACC将工作卸载到GPU上吗? - Marc Andreson
2
是的,OpenACC->PTX(以及OpenMP->PTX,当它被支持时)需要nvptx-none目标编译器。我会在维基页面上添加OpenMP->PTX尚未支持的说明,以避免混淆。据我所知,这份手册关于OpenACC->PTX是完整的,但我自己还没有尝试过。 - Ilya Verbin
哦,这对我来说是个坏消息。您是否知道何时可以在GCC(或像clang这样的任何其他编译器)中实现nvidia offload? - Marc Andreson
2
GCC 5.x 肯定不支持此功能,至于 GCC 6.x - 我不知道。在 GPU 上实现 OpenMP 的某些子集相对容易,但是在目标区域中支持各种指示符似乎相当困难(请参见上面的 2 个链接)。目前 IBM 正在使用 clang 对 OpenMP 进行 GPU 卸载:http://openmp.org/sc14/Booth-Sam-IBM.pdf - Ilya Verbin
谢谢!我会检查一下Clang的分支,也许它已经可以工作了(至少在我需要的基本程度上)。 - Marc Andreson

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接