GCC中的OpenMP 4.0:卸载到nVidia GPU
TL;DR-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
我正在运行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的分支,也许它已经工作了(至少部分工作,达到我需要的基本程度)