GCC中的OpenMP 4.0:卸载到nVidia GPU

GCC中的OpenMP 4.0:卸载到nVidia GPU,gcc,cuda,openmp,gpgpu,nvidia,Gcc,Cuda,Openmp,Gpgpu,Nvidia,TL;DR-GCC(中继)是否已经支持OpenMP 4.0卸载到nVidia GPU 如果是,我做错了什么?(说明见下文) 我正在运行Ubuntu 14.04.2 LTS 我已查看了最新的GCC主干(日期为2015年3月25日) 我已根据指南安装了CUDA 7.0工具包。CUDA样本成功运行,即deviceQuery检测到我的GeForce GT 730 我遵守了来自以及的指示 我已经安装了nvptx工具和nvptx newlib(configure,make,sudo make instal

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

如果是,我做错了什么?(说明见下文)


我正在运行Ubuntu 14.04.2 LTS

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

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

我遵守了来自以及的指示

我已经安装了nvptx工具nvptx newlib
configure
make
sudo make install
),newlib也在GCC的主干目录中链接了
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_路径:

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\u get\u num\u devices()
查询设备数量时,我得到的响应是
0

$ /install/usr/local/bin/x86_64-pc-linux-gnu-gcc -fopenmp -foffload=nvptx-none main.c
$ ./a.out
0
当我将
-v
(verbose)选项添加到目标编译器的选项时,我得到以下输出:

$ /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-GCC(中继)是否已经支持OpenMP 4.0卸载到nVidia GPU

没有

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

有一些想法支持OpenMP 4.0卸载到nVidia GPU:,但尚未开始实施


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

你确定你有一个功能齐全的CUDA安装吗?@talonmies CUDA示例运行成功检测到我的NVidia GPUSorry,但我不得不问。你不会相信有多少人来这里问为什么他们的代码不起作用,根本原因是他们没有功能性的CUDA安装。@talonmies np,请删除你的评论。我已经为构建GCC和OpenMP GPU卸载创建了一个分步指南(请参阅),因为我今年在德国的帕德伯恩大学就这个问题做了演讲。我推荐Clang(github上的开发版本),因为根据我的测试,它的bug比GCC和其他版本的Clang要少。顺便说一句,GCC对每个团队的线程数量有限制,这完全破坏了GPU的性能。哦,这是指什么?这是否意味着OpenACC工作需要nvptx none目标编译器的配置,而不是像我想的那样OpenMP4?或者,是否有任何其他先决条件通过OpenACC将工作卸载到GPU?是的,OpenACC->PTX(以及OpenMP->PTX,当支持时)需要nvptx无目标编译器。我将把OpenMP->PTX还不受支持的内容添加到wiki页面,以避免混淆。好了,这本关于OpenACC->PTX的手册已经完成了,但是我自己还没有试过。哦,这对我来说是个不幸的消息。您是否知道何时可以使用GCC卸载nvidia?(或者使用任何其他编译器,比如clang?)GCC 5.x肯定不会支持这个,就像GCC 6.x一样——我不知道。在GPU上实现OpenMP的某些子集相对容易,但在目标区域支持各种杂注看起来相当困难(参见上面的2个链接)。目前IBM正在使用OpenMP-to-GPU卸载:谢谢!我会检查一下这个Clang的分支,也许它已经工作了(至少部分工作,达到我需要的基本程度)