GCC 中的 OpenMP 4.0:卸载到 nVidia GPU

OpenMP 4.0 in GCC: offload to nVidia GPU

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

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


我正在 运行宁 Ubuntu 14.04.2 LTS.

我查看了最新的 GCC t运行k(2015 年 3 月 25 日)。

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

我已按照 https://gcc.gnu.org/wiki/Offloading as well as https://gcc.gnu.org/install/specific.html#nvptx-x-none

的说明进行操作

我已经安装了 nvptx-toolsnvptx-newlib (configure, make, sudo make install), newlib 也在 GCC 的 t运行k 目录中链接 ln -s.

然后我构建了目标加速器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 个文件。

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

TL;DR - Does GCC (trunk) already support OpenMP 4.0 offloading to 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]