2017-09-10 6 views
0

Je souhaite exécuter le code OpenMP4 + sur mon GPU Nvidia en utilisant LLVM/Clang. J'ai téléchargé et compilé les bibliothèques llvm/clang/omp à partir du tronc en suivant les instructions trouvées ici: https://clang.llvm.org/get_started.html et ici: https://openmp.llvm.org/. Je n'ai pas compilé Compiler-RT et libcxx, mais je ne pense pas que cela ferait une différence.Erreurs du lieur lors de la compilation de la directive OpenMP `target` en utilisant Clang 6 (tronc) avec la cible nvptx

Ma commande CMake était le suivant: cmake -G "Unix Makefiles" ../llvm -DCMAKE_BUILD_TYPE=Release -DOPENMP_ENABLE_LIBOMPTARGET=ON

J'ai écrit un programme très simple, avec une seule directive OpenMP target:

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

Et je compilez avec ceci: /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

En cas vous demandez: Oui, je n'ai pas mis en place mes chemins pour le compilateur mais je me suis assuré que mes points LD_LIBRARY_PATH où se trouve le libomptarget.

Et voici la sortie/erreur que je reçois après l'exécution de la commande ci-dessus (Les dernières lignes ~ 10 montrent l'erreur):

<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) 

Toute idée quelle bibliothèque est censé avoir ces __kmpc* symboles? Je essayé de courir:

nm libomptarget.so | grep __kmpc_kernel_parallel

et

nm libomptarget.rtl.cuda.so | grep __kmpc_kernel_parallel,

mais les deux commandes retournent rien.

Enfin, si je supprime -fopenmp-targets=nvptx64-nvidia-cuda de mes drapeaux de compilation, je n'obtiens aucune erreur de lien. Mais bien sûr, dans ce cas, aucun code CUDA n'est généré.

Tous les commentaires qui pourraient m'aider à comprendre ce qui se passe, où ces symboles sont censés être situés et pourquoi ils ne sont pas là, sont plus que bienvenus.

+0

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

+0

@talonmies merci pour cela. Cependant, cela me rend plus confus. En effet, l'ancien dépôt de libomptarget génèrerait une bibliothèque appelée libomptarget-nvptx. Et en effet, dans mon cas, nvlinker ajoute -lomptarget-nvptx. Cependant, libomptarget fait maintenant partie de llvm et il n'est pas nécessaire de télécharger libomptarget à partir du repo de github cité dans le lien que vous m'avez envoyé (à droite?). Bizarrement, cette nouvelle version de libomptarget ne génère pas de librairie libomptarget-nvptx (j'ai même grevé tous les fichiers CMakeLists.txt). Est-ce que je me trompe? – AstrOne

+0

Lire la toute fin - Je vais deviner que la cible de construction sm_20 est le problème. – talonmies

Répondre

2

Malheureusement, la prise en charge de déchargement de cible OMP pour le périphérique nvptx n'a pas encore été montée en amont. Une branche récente est disponible sur github avec des instructions de construction sur le wiki https://github.com/clang-ykt/clang/wiki

+0

Merci pour votre précisions. J'ai essayé de compiler le code du dépôt GitHub que vous avez fourni (en suivant les instructions de la page GitHub) mais j'ai l'erreur 'clang-4.0: erreur: impossible de trouver l'installation de CUDA. Fournissez son chemin via --cuda-path ... blah blah'. Existe-t-il des indicateurs CMake que je peux utiliser pour définir le chemin cuda? Je l'ai installé, mais ce n'est pas dans un endroit standard. Merci. – AstrOne

+0

Avez-vous cette erreur lors de la compilation d'un programme OpenMP ou lors de la construction du compilateur? Pourriez-vous joindre le journal entier pour obtenir plus de contexte concernant l'erreur? –