En utilisant OpenMP avec clang
J'ai des problèmes de compilation OpenMP code à l'aide de clang (les deux 3.6 et 3.8 ToT).
J'ai suivi ce blog http://blog.llvm.org/2015/05/openmp-support_22.html , mais le problème est que le programme compilé est exécutée sur un seul thread.
J'utilise ubuntu 15.04 x64, j'ai à la fois libgomp et libiopmp installé et que je compile mon code avec la commande suivante:
clang test.c -o test -fopenmp -L/usr/lib/gcc/x86_64-linux-gnu/5.1.1
Lorsque j'utilise gcc au lieu de cela, tout fonctionne bien: gcc test.c -o test -fopenmp
J'ai aussi essayé de lancer export LD_LIBRARY_PATH=/usr/lib/gcc/x86_64-linux-gnu/5.1.1:$LD_LIBRARY_PATH
mais il n'a pas aidé.
`
Des suggestions?
OriginalL'auteur kuhar | 2015-10-26
Vous devez vous connecter pour publier un commentaire.
Mise à jour
La construction de la dernière malle de LLVM/Clang (clang-3.8), l'installation de libiomp5, et en précisant l'emplacement de la gomp omp fichiers d'en-tête travaillé. Notez que le paquet Ubuntu pour libiomp5 n'est pas tout à fait correct, de sorte que vous aurez besoin d'ajouter un lien symbolique dans /usr/lib /usr/lib/libiomp5.donc dans /usr/lib/libiomp5..5.
J'utilise g++-5.1 et clang++-3.6 sur Linux Mint 17.2 (essentiellement Ubuntu trusty) et je vois les mêmes résultats avec le code suivant.
L'exécution de ce sous ltrace révèle la question:
g++
clang
Vous pouvez voir immédiatement le problème: clang++ n'appelle jamais GOMP_parallel, de sorte que vous obtenez toujours un thread. C'est fou le comportement de la part de clang. Avez-vous essayé de construire et d'utiliser le "spécial" La version OpenMP de clang?
Quand vous regardez l'généré IR (
-S -emit-llvm
) vous pouvez voir clairement que seuls les omp spécifiques des appels de fonction sont générés en parallèle de code correspondant à openmp est pragmas est nulle part pour être trouvée.Merci, vous avez eu raison sur l'utilisation de ToT clang et en précisant omp bibliothèque différente de libgomp. En fait, j'ai aussi eu à travailler sur mon raspberry pi 2, à l'aide de l'auto-construction libomp: openmp.llvm.org.
"Notez que le paquet Ubuntu pour libiomp5 n'est pas tout à fait correct" semble être erronée. Vous devez installer le
libiomp-dev
package si vous souhaitez les en-têtes et la capacité de liaison à l'encontre de la bibliothèqueOriginalL'auteur Tim
Quelques commentaires supplémentaires:
1) Vous devez utiliser -fopenmp=libomp pour permettre OpenMP en clang. -fopenmp juste des liens libgomp, mais ignore tous les pragmas. Bizarre, je sais -- et sera changé dans le tronc bientôt.
2) 3.7 est la première version qui prend en charge OpenMP. 3.6 n'est pas.
3) clang est seulement capable de travailler avec libomp. Ne mettez pas libgomp (en-têtes ou à la bibliothèque) dans la façon de libomp! clang utilise Intel API, non pris en charge par libgomp. -fopenmp=libomp doit établir des liens appropriés de la bibliothèque.
Vôtre,
Andrey Bokhanko
Ingénieur Logiciel
Intel
demo.cpp
utilisant OpenMP s'il vous plaît? Je veux dire le plein de ligne de commande s'il vous plaît?Bokhanko je suis en train d'essayer avec clang 4.0 et CMake 3.7 avec
SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -std=c++11 -fopenmp=libomp") find_package(OpenMP REQUIRED)
mais toujours "impossible de trouver le OpenMP"J'ai le même problème avec clang 3.8. Quelqu'un à trouver une solution pour cela?
Utiliser CMake 3.9 et la caisse de la docs. Il devrait fonctionner correctement avec Clang si vous utilisez le
OpenMP::OpenMP_CXX
cible. Vous ne pouvez pas utiliser Apple Clang, même si, comme de la High Sierra / Xcode 9.0. Vous devez utiliserbrew install llvm
et configurer l'environnement pour que le compilateur.OriginalL'auteur Andrey Bokhanko
Je l'ai fait travailler sur Linux Mint 17.2. (essentiellement Ubuntu 14.04) avec:
paquets: libiomp-dev clang-3.8
Drapeau de compilation:
-fopenmp
De l'éditeur de liens drapeau:
-fopenmp=libiomp5
Maintenant, il compile et utilise plusieurs threads.
Ici est modifié FindOpenMP.cmake
libiomp-dev
. Je n'ai pas utiliser n'importe quel drapeau.OriginalL'auteur veio
OMP_NUM_THREADS variable d'environnement est probablement ce que vous voulez. Vous pouvez également définir par programmation.
https://gcc.gnu.org/onlinedocs/libgomp/Environment-Variables.html
Et même pour clang.
Le
num_threads(4)
clause remplaceOMP_NUM_THREADS
.Cela ne fonctionne pas depuis clang n'émet pas de code pour omp pragmas.
OriginalL'auteur Jack Wasey