GCC中的OpenMP 4.0:卸载到nVidia GPU

Mar*_*son 13 gcc cuda gpgpu nvidia openmp

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

如果是这样,我做错了什么?(以下描述).


我正在运行Ubuntu 14.04.2 LTS.

我查看了最近的GCC主干(2015年3月25日).

我根据Ubuntu入门指南安装了CUDA 7.0工具包.CUDA样品成功运行,即检测到我的GeForce GT 730.deviceQuery

我已按照https://gcc.gnu.org/wiki/Offloading以及https://gcc.gnu.org/install/specific.html#nvptx-x-none中的说明进行操作

我已经安装了nvptx工具nvptx-newlib(configure,make,sudo make install),newlib还与海湾合作委员会的后备箱目录内的链接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
Run Code Online (Sandbox Code Playgroud)

...和主机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
Run Code Online (Sandbox Code Playgroud)

我已相应地设置了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
Run Code Online (Sandbox Code Playgroud)

当然,构建了mkoffload工具:

/install/usr/local/libexec/gcc/x86_64-pc-linux-gnu/5.0.0/accel/nvptx-none/mkoffload
Run Code Online (Sandbox Code Playgroud)

目标和主机编译器也在那里:

/install/usr/local/bin/x86_64-pc-linux-gnu-gcc
/install/usr/local/bin/x86_64-pc-linux-gnu-accel-nvptx-none-gcc
Run Code Online (Sandbox Code Playgroud)

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

$ /install/usr/local/bin/x86_64-pc-linux-gnu-gcc -fopenmp -foffload=nvptx-none main.c
$ ./a.out
0
Run Code Online (Sandbox Code Playgroud)

当我-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'
Run Code Online (Sandbox Code Playgroud)

因此看起来工具链被调用并且.mkoffload文件被创建.

请帮忙.如果它应该工作,我怎么能诊断出什么是错的?

Ily*_*bin 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],但实现尚未开始.

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

  • 是的,OpenACC-> PTX(以及支持OpenMP-> PTX时)需要nvptx-none目标编译器.我将添加到wiki页面,以支持OpenMP-> PTX,以避免混淆.关于OpenACC-> PTX的AFAIK本手册是完整的,但我自己没有尝试过. (2认同)
  • GCC 5.x肯定不会支持这一点,对于GCC 6.x - 我不知道.在GPU上实现OpenMP的某些子集相对容易,但是在目标区域中支持各种编译指示看起来相当困难(参见上面的2个链接).目前IBM正致力于OpenMP到GPU的卸载:http://openmp.org/sc14/Booth-Sam-IBM.pdf (2认同)