2017-09-10 137 views
0

我想使用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

回答

2

不幸的是,對於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程序或構建編譯器時會發生此錯誤嗎?你可以附上整個日誌以獲得有關錯誤的更多上下文嗎? –