当使用Clang 6(trunk)编译OpenMP`target`指令时与nvptx目标编译器连接错误

当使用Clang 6(trunk)编译OpenMP`target`指令时与nvptx目标编译器连接错误

问题描述:

我想使用LLVM/Clang在我的Nvidia GPU上运行OpenMP4 +代码。我按照这里找到的说明下载并编译了从trunk中编译的llvm/clang/omp库:https://clang.llvm.org/get_started.html和here:https://openmp.llvm.org/。我没有编译Compiler-RT和libcxx,但我认为这没有什么区别。当使用Clang 6(trunk)编译OpenMP`target`指令时与nvptx目标编译器连接错误

我的CMake命令是这样的:cmake -G "Unix Makefiles" ../llvm -DCMAKE_BUILD_TYPE=Release -DOPENMP_ENABLE_LIBOMPTARGET=ON

我写了一个非常基本的程序与单一的OpenMP target指令:

int main(void) 
{ 
    #pragma omp target 
    { 
    } 
    return 0; 
} 

而且我这个编译: /home/user/opt/llvm/bin/clang++ -v main.cpp -fopenmp -lomptarget -fopenmp-targets=nvptx64-nvidia-cuda --cuda-path=/home/user/opt/pgi/linux86-64/2017/cuda/8.0

万一你问:是的,我没有为编译器设置路径,但是我确定我的LD_LIBRARY_PATH指向libomptarget所在的位置。

这里是输出/错误执行上面的命令后,我获得(最后〜10行显示错误):

<If this is too much information, just go to the last 10 lines to see the error> 
clang version 6.0.0 (trunk 312875) 
Target: x86_64-unknown-linux-gnu 
Thread model: posix 
InstalledDir: /home/user/opt/llvm/bin 
Found candidate GCC installation: /usr/lib/gcc/i686-linux-gnu/6 
Found candidate GCC installation: /usr/lib/gcc/i686-linux-gnu/6.4.0 
Found candidate GCC installation: /usr/lib/gcc/i686-linux-gnu/7 
Found candidate GCC installation: /usr/lib/gcc/i686-linux-gnu/7.2.0 
Found candidate GCC installation: /usr/lib/gcc/x86_64-linux-gnu/4.8 
Found candidate GCC installation: /usr/lib/gcc/x86_64-linux-gnu/4.8.4 
Found candidate GCC installation: /usr/lib/gcc/x86_64-linux-gnu/4.9 
Found candidate GCC installation: /usr/lib/gcc/x86_64-linux-gnu/4.9.3 
Found candidate GCC installation: /usr/lib/gcc/x86_64-linux-gnu/5 
Found candidate GCC installation: /usr/lib/gcc/x86_64-linux-gnu/5.4.1 
Found candidate GCC installation: /usr/lib/gcc/x86_64-linux-gnu/6 
Found candidate GCC installation: /usr/lib/gcc/x86_64-linux-gnu/6.4.0 
Found candidate GCC installation: /usr/lib/gcc/x86_64-linux-gnu/7 
Found candidate GCC installation: /usr/lib/gcc/x86_64-linux-gnu/7.2.0 
Selected GCC installation: /usr/lib/gcc/x86_64-linux-gnu/7.2.0 
Candidate multilib: .;@m64 
Selected multilib: .;@m64 
Found CUDA installation: /home/user/opt/pgi/linux86-64/2017/cuda/8.0, version 7.0 
"/home/user/opt/llvm/bin/clang-6.0" -cc1 -triple x86_64-unknown-linux-gnu -emit-llvm-bc -emit-llvm-uselists -disable-free -disable-llvm-verifier -discard-value-names -main-file-name main.cpp -mrelocation-model static -mthread-model posix -mdisable-fp-elim -fmath-errno -masm-verbose -mconstructor-aliases -munwind-tables -fuse-init-array -target-cpu x86-64 -dwarf-column-info -debugger-tuning=gdb -v -resource-dir /home/user/opt/llvm/lib/clang/6.0.0 -internal-isystem /usr/lib/gcc/x86_64-linux-gnu/7.2.0/../../../../include/c++/7.2.0 -internal-isystem /usr/lib/gcc/x86_64-linux-gnu/7.2.0/../../../../include/x86_64-linux-gnu/c++/7.2.0 -internal-isystem /usr/lib/gcc/x86_64-linux-gnu/7.2.0/../../../../include/x86_64-linux-gnu/c++/7.2.0 -internal-isystem /usr/lib/gcc/x86_64-linux-gnu/7.2.0/../../../../include/c++/7.2.0/backward -internal-isystem /usr/lib/gcc/x86_64-linux-gnu/7.2.0/../../../../include/c++/7.2.0 -internal-isystem /usr/lib/gcc/x86_64-linux-gnu/7.2.0/../../../../include/x86_64-linux-gnu/c++/7.2.0 -internal-isystem /usr/lib/gcc/x86_64-linux-gnu/7.2.0/../../../../include/x86_64-linux-gnu/c++/7.2.0 -internal-isystem /usr/lib/gcc/x86_64-linux-gnu/7.2.0/../../../../include/c++/7.2.0/backward -internal-isystem /usr/local/include -internal-isystem /home/user/opt/llvm/lib/clang/6.0.0/include -internal-externc-isystem /usr/include/x86_64-linux-gnu -internal-externc-isystem /include -internal-externc-isystem /usr/include -internal-isystem /usr/local/include -internal-isystem /home/user/opt/llvm/lib/clang/6.0.0/include -internal-externc-isystem /usr/include/x86_64-linux-gnu -internal-externc-isystem /include -internal-externc-isystem /usr/include -fdeprecated-macro -fdebug-compilation-dir /tmp -ferror-limit 19 -fmessage-length 190 -fopenmp -fobjc-runtime=gcc -fcxx-exceptions -fexceptions -fdiagnostics-show-option -fcolor-diagnostics -o /tmp/main-be2d35.bc -x c++ main.cpp -fopenmp-targets=nvptx64-nvidia-cuda 
clang -cc1 version 6.0.0 based upon LLVM 6.0.0svn default target x86_64-unknown-linux-gnu 
ignoring nonexistent directory "/include" 
ignoring nonexistent directory "/include" 
ignoring duplicate directory "/usr/lib/gcc/x86_64-linux-gnu/7.2.0/../../../../include/x86_64-linux-gnu/c++/7.2.0" 
ignoring duplicate directory "/usr/lib/gcc/x86_64-linux-gnu/7.2.0/../../../../include/c++/7.2.0" 
ignoring duplicate directory "/usr/lib/gcc/x86_64-linux-gnu/7.2.0/../../../../include/x86_64-linux-gnu/c++/7.2.0" 
ignoring duplicate directory "/usr/lib/gcc/x86_64-linux-gnu/7.2.0/../../../../include/x86_64-linux-gnu/c++/7.2.0" 
ignoring duplicate directory "/usr/lib/gcc/x86_64-linux-gnu/7.2.0/../../../../include/c++/7.2.0/backward" 
ignoring duplicate directory "/usr/local/include" 
ignoring duplicate directory "/home/user/opt/llvm/lib/clang/6.0.0/include" 
ignoring duplicate directory "/usr/include/x86_64-linux-gnu" 
ignoring duplicate directory "/usr/include" 
#include "..." search starts here: 
#include <...> search starts here: 
/usr/lib/gcc/x86_64-linux-gnu/7.2.0/../../../../include/c++/7.2.0 
/usr/lib/gcc/x86_64-linux-gnu/7.2.0/../../../../include/x86_64-linux-gnu/c++/7.2.0 
/usr/lib/gcc/x86_64-linux-gnu/7.2.0/../../../../include/c++/7.2.0/backward 
/usr/local/include 
/home/user/opt/llvm/lib/clang/6.0.0/include 
/usr/include/x86_64-linux-gnu 
/usr/include 
End of search list. 
"/home/user/opt/llvm/bin/clang-6.0" -cc1 -triple nvptx64-nvidia-cuda -aux-triple x86_64-unknown-linux-gnu -S -disable-free -disable-llvm-verifier -discard-value-names -main-file-name main.cpp -mrelocation-model pic -pic-level 2 -mthread-model posix -mdisable-fp-elim -fmath-errno -no-integrated-as -fuse-init-array -mlink-cuda-bitcode /home/user/opt/pgi/linux86-64/2017/cuda/8.0/nvvm/libdevice/libdevice.compute_20.10.bc -target-feature +ptx42 -target-cpu sm_20 -dwarf-column-info -debugger-tuning=gdb -v -resource-dir /home/user/opt/llvm/lib/clang/6.0.0 -internal-isystem /usr/lib/gcc/x86_64-linux-gnu/7.2.0/../../../../include/c++/7.2.0 -internal-isystem /usr/lib/gcc/x86_64-linux-gnu/7.2.0/../../../../include/x86_64-linux-gnu/c++/7.2.0 -internal-isystem /usr/lib/gcc/x86_64-linux-gnu/7.2.0/../../../../include/x86_64-linux-gnu/c++/7.2.0 -internal-isystem /usr/lib/gcc/x86_64-linux-gnu/7.2.0/../../../../include/c++/7.2.0/backward -internal-isystem /usr/lib/gcc/x86_64-linux-gnu/7.2.0/../../../../include/c++/7.2.0 -internal-isystem /usr/lib/gcc/x86_64-linux-gnu/7.2.0/../../../../include/x86_64-linux-gnu/c++/7.2.0 -internal-isystem /usr/lib/gcc/x86_64-linux-gnu/7.2.0/../../../../include/x86_64-linux-gnu/c++/7.2.0 -internal-isystem /usr/lib/gcc/x86_64-linux-gnu/7.2.0/../../../../include/c++/7.2.0/backward -internal-isystem /usr/local/include -internal-isystem /home/user/opt/llvm/lib/clang/6.0.0/include -internal-externc-isystem /usr/include/x86_64-linux-gnu -internal-externc-isystem /include -internal-externc-isystem /usr/include -internal-isystem /usr/local/include -internal-isystem /home/user/opt/llvm/lib/clang/6.0.0/include -internal-externc-isystem /usr/include/x86_64-linux-gnu -internal-externc-isystem /include -internal-externc-isystem /usr/include -fdeprecated-macro -fno-dwarf-directory-asm -fdebug-compilation-dir /tmp -ferror-limit 19 -fmessage-length 190 -fopenmp -fobjc-runtime=gcc -fcxx-exceptions -fexceptions -fdiagnostics-show-option -fcolor-diagnostics -o /tmp/main-7ffbd7.s -x c++ main.cpp -fopenmp-is-device -fopenmp-host-ir-file-path /tmp/main-be2d35.bc 
clang -cc1 version 6.0.0 based upon LLVM 6.0.0svn default target x86_64-unknown-linux-gnu 
ignoring nonexistent directory "/include" 
ignoring nonexistent directory "/include" 
ignoring duplicate directory "/usr/lib/gcc/x86_64-linux-gnu/7.2.0/../../../../include/x86_64-linux-gnu/c++/7.2.0" 
ignoring duplicate directory "/usr/lib/gcc/x86_64-linux-gnu/7.2.0/../../../../include/c++/7.2.0" 
ignoring duplicate directory "/usr/lib/gcc/x86_64-linux-gnu/7.2.0/../../../../include/x86_64-linux-gnu/c++/7.2.0" 
ignoring duplicate directory "/usr/lib/gcc/x86_64-linux-gnu/7.2.0/../../../../include/x86_64-linux-gnu/c++/7.2.0" 
ignoring duplicate directory "/usr/lib/gcc/x86_64-linux-gnu/7.2.0/../../../../include/c++/7.2.0/backward" 
ignoring duplicate directory "/usr/local/include" 
ignoring duplicate directory "/home/user/opt/llvm/lib/clang/6.0.0/include" 
ignoring duplicate directory "/usr/include/x86_64-linux-gnu" 
ignoring duplicate directory "/usr/include" 
#include "..." search starts here: 
#include <...> search starts here: 
/usr/lib/gcc/x86_64-linux-gnu/7.2.0/../../../../include/c++/7.2.0 
/usr/lib/gcc/x86_64-linux-gnu/7.2.0/../../../../include/x86_64-linux-gnu/c++/7.2.0 
/usr/lib/gcc/x86_64-linux-gnu/7.2.0/../../../../include/c++/7.2.0/backward 
/usr/local/include 
/home/user/opt/llvm/lib/clang/6.0.0/include 
/usr/include/x86_64-linux-gnu 
/usr/include 
End of search list. 
"/home/user/opt/pgi/linux86-64/2017/cuda/8.0/bin/ptxas" -m64 -O0 -v --gpu-name sm_20 --output-file /tmp/main-64fc86.cubin /tmp/main-ca9e59.s -c 
ptxas info : 1 bytes gmem, 8 bytes cmem[14] 
ptxas info : Compiling entry function '__omp_offloading_803_18004c0_main_l3' for 'sm_20' 
ptxas info : Function properties for __omp_offloading_803_18004c0_main_l3 
0 bytes stack frame, 0 bytes spill stores, 0 bytes spill loads 
ptxas info : Used 5 registers, 32 bytes cmem[0] 
ptxas info : Function properties for __omp_offloading_803_18004c0_main_l3_worker 
24 bytes stack frame, 8 bytes spill stores, 8 bytes spill loads 
"/home/user/opt/pgi/linux86-64/2017/cuda/8.0/bin/nvlink" -o /tmp/main-f247e3.out -v -arch sm_20 -L/home/user/opt/llvm/lib -lomptarget-nvptx main-64fc86.cubin 
nvlink error : Undefined reference to '__kmpc_kernel_init' in 'main-64fc86.cubin' 
nvlink error : Undefined reference to '__kmpc_kernel_deinit' in 'main-64fc86.cubin' 
nvlink error : Undefined reference to '__kmpc_kernel_parallel' in 'main-64fc86.cubin' 
nvlink error : Undefined reference to '__kmpc_kernel_end_parallel' in 'main-64fc86.cubin' 
nvlink info : 1 bytes gmem, 8 bytes cmem[14] 
nvlink info : Function properties for '__omp_offloading_803_18004c0_main_l3': 
nvlink info : used 18 registers, 24 stack, 0 bytes smem, 32 bytes cmem[0], 0 bytes lmem 
clang-6.0: error: fatbinary command failed with exit code 255 (use -v to see invocation) 

该库是应该有这些__kmpc*符号任何想法? 我试图运行:

nm libomptarget.so | grep __kmpc_kernel_parallel

nm libomptarget.rtl.cuda.so | grep __kmpc_kernel_parallel

但两个命令返回任何结果。

最后,如果我从我的编译标记中删除-fopenmp-targets=nvptx64-nvidia-cuda,则不会收到链接器错误。但是,当然在这种情况下,不会生成CUDA代码。

任何可能帮助我弄清楚发生了什么的反馈,这些符号应该位于何处以及它们为什么不在那里,都是值得欢迎的。

+0

https://parallel-computing.pro/index.php/forum/general-en/17-blog-post-openmp-4-0- on-nvidia-cuda-gpus – talonmies

+0

@talonmies感谢您的支持。但是,它让我更加困惑。事实上,libomptarget的旧版本库会生成一个名为libomptarget-nvptx的库。实际上,就我而言,nvlinker会添加-lomptarget-nvptx。然而,libomptarget现在是llvm的一部分,并且不需要从您发给我的链接中引用的github repo中下载libomptarget(对吗?)。奇怪的是,这个新的libomptarget版本不会生成libomptarget-nvptx库(我甚至会对所有CMakeLists.txt文件进行grep)。我错了吗? – AstrOne

+0

阅读最后 - 我会猜测sm_20构建目标是问题。 – talonmies

不幸的是,对于nvptx设备的OMP目标卸载支持尚未成为流行趋势。最近的分支可在github上获得,并在维基上使用构建指令 https://github.com/clang-ykt/clang/wiki

+0

感谢您澄清这一点。我试图从你提供的GitHub仓库中编译代码(同时遵循GitHub页面的指示),但是我得到错误'clang-4.0:error:找不到CUDA安装。通过--cuda-path ... blah blah'提供路径。有没有可用于定义cuda路径的CMake标志?我已安装它,但它不在标准位置。谢谢。 – AstrOne

+0

编译OpenMP程序或构建编译器时会发生此错误吗?你可以附上整个日志以获得有关错误的更多上下文吗? –