Cuda incompatible avec ma version gcc
J'ai du mal à compiler certains des exemples livrés avec le SDK CUDA. J'ai installé le pilote des développeurs (version 270.41.19) et la boîte à outils CUDA, puis enfin le SDK (à la fois la version 4.0.17).
Initialement, il ne compilait pas du tout en donnant:
error -- unsupported GNU version! gcc 4.5 and up are not supported!
J'ai trouvé la ligne responsable dans 81: / usr / local / cuda / include / host_config.h et l'a changé en:
//#if __GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ > 4)
#if __GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ > 6)
À Partir de ce moment j'ai que quelques exemples pour compiler, il s'arrête avec:
In file included from /usr/include/c++/4.6/x86_64-linux-gnu/bits/gthr.h:162:0,
from /usr/include/c++/4.6/ext/atomicity.h:34,
from /usr/include/c++/4.6/bits/ios_base.h:41,
from /usr/include/c++/4.6/ios:43,
from /usr/include/c++/4.6/ostream:40,
from /usr/include/c++/4.6/iterator:64,
from /usr/local/cuda/include/thrust/iterator/iterator_categories.h:38,
from /usr/local/cuda/include/thrust/device_ptr.h:26,
from /usr/local/cuda/include/thrust/device_malloc_allocator.h:27,
from /usr/local/cuda/include/thrust/device_vector.h:26,
from lineOfSight.cu:37:
/usr/include/c++/4.6/x86_64-linux-gnu/bits/gthr-default.h:251:1: error: pasting "__gthrw_" and "/* Android's C library does not provide pthread_cancel, check for
`pthread_create' instead. */" does not give a valid preprocessing token
make[1]: *** [obj/x86_64/release/lineOfSight.cu.o] Error 1
Comme certains des les exemples compilent je pense que ce n'est pas un problème de pilote, mais doit plutôt avoir quelque chose à voir avec une version non prise en charge de gcc. Le déclassement n'est pas une option car gcc4.6 a tout un système en tant que dépendance à ce stade...
16 réponses
Comme déjà souligné, nvcc dépend de gcc 4.4. Il est possible de configurer nvcc pour utiliser la version correcte de gcc sans passer de paramètres de compilateur en ajoutant softlinks au répertoire bin créé avec l'installation de nvcc.
Le répertoire binaire Cuda par défaut (la valeur par défaut de l'installation) est /usr / local / Cuda / bin, l'ajout d'un softlink à la version correcte de gcc à partir de ce répertoire est suffisant:
sudo ln -s /usr/bin/gcc-4.4 /usr/local/cuda/bin/gcc
Gcc 4.5 et 4.6 ne sont pas pris en charge avec CUDA-le code ne sera pas compilé et le reste de la chaîne d'outils, y compris cuda-gdb, ne fonctionnera pas correctement. Vous ne pouvez pas les utiliser, et la restriction est non négociable.
Votre seule solution consiste à installer une version de gcc 4.4 en tant que deuxième compilateur (la plupart des distributions le permettront). Il existe une option pour nvcc --compiler-bindir
qui peut être utilisée pour pointer vers un compilateur alternatif. Créez un répertoire local puis créez des liens symboliques vers gcc pris en charge exécutables de version. Passez ce répertoire local à nvcc via l'option --compiler-bindir
, et vous devriez être capable de compiler du code CUDA sans affecter le reste de votre système.
Modifier :
Notez que cette question, et la réponse, se rapportent à CUDA 4. Depuis qu'il a été écrit, NVIDIA a continué à étendre le support pour les versions ultérieures de gcc dans la nouvelle version de CUDA toolchain
- depuis la version Cuda 4.1, gcc 4.5 est maintenant pris en charge. gcc 4.6 et 4.7 sont supporté.
- depuis la version Cuda 5.0, gcc 4.6 est maintenant pris en charge. gcc 4.7 est pas pris en charge.
- depuis la version CUDA 6.0, gcc 4.7 est maintenant pris en charge.
- depuis la version 7.0 de CUDA, gcc 4.8 est entièrement pris en charge, avec le support 4.9 sur Ubuntu 14.04 et Fedora 21.
- à partir de la version Cuda 7.5, gcc 4.8 est entièrement pris en charge, avec le support 4.9 sur Ubuntu 14.04 et Fedora 21.
- depuis la version CUDA 8, gcc 5.3 est entièrement pris en charge sur Ubuntu 16.06 et Fedora 23.
- depuis la version CUDA 9, gcc 6 est entièrement pris en charge sur Ubuntu 16.04, Ubuntu 17.04 et Fedora 25.
- la version CUDA 9.2 ajoute la prise en charge de gcc 7
Il n'y a actuellement (à partir de CUDA 9) aucun support gcc 8 dans CUDA.
Notez que NVIDIA a récemment ajouté une table très utile ici qui contient le compilateur pris en charge et la matrice du système d'exploitation pour la version actuelle de CUDA.
La solution de Gearoid Murphy fonctionne mieux pour moi puisque sur ma distribution (Ubuntu 11.10), gcc-4.4 et gcc-4.6 sont dans le même répertoire, donc --compiler-bindir n'est pas utile. La seule mise en garde est que j'ai aussi dû installer g++-4.4 et le lier symboliquement:
sudo ln -s /usr/bin/gcc-4.4 /usr/local/cuda/bin/gcc
sudo ln -s /usr/bin/g++-4.4 /usr/local/cuda/bin/g++
Mise à Jour:
Pour CUDA 9:
sudo ln -s /usr/bin/gcc-6 /usr/local/cuda/bin/gcc
sudo ln -s /usr/bin/g++-6 /usr/local/cuda/bin/g++
Vous devez d'abord installer gcc et G++ 6:
sudo apt install gcc-6 g++-6
Vieille réponse:
Pour CUDA 8:
sudo ln -s /usr/bin/gcc-5 /usr/local/cuda/bin/gcc
sudo ln -s /usr/bin/g++-5 /usr/local/cuda/bin/g++
Vous devez d'abord installer gcc et G++ 5:
sudo apt install gcc-5 g++-5
Pour CUDA7. 5 ces lignes fonctionnent:
sudo ln -s /usr/bin/gcc-4.9 /usr/local/cuda/bin/gcc
sudo ln -s /usr/bin/g++-4.9 /usr/local/cuda/bin/g++
Consultez Comment utiliser "update-alternatives" pour contourner ce problème:
... Si vous installez gcc 4.6, vous pouvez également utiliser update-alternatives commande pour permettre de basculer facilement entre les versions. Cela peut être configuré avec:
sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-4.6 60 --slave /usr/bin/g++ g++ /usr/bin/g++-4.6 sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-4.7 40 --slave /usr/bin/g++ g++ /usr/bin/g++-4.7 sudo update-alternatives --config gcc
Sur la plupart des distributions, vous avez la possibilité d'installer une autre version de gcc et G++ à côté d'un compilateur le plus récent comme gcc-4.7. En outre, la plupart des systèmes de construction connaissent les variables d'environnement CC
et CXX
, qui vous permettent de spécifier d'autres compilateurs C et c++ respectivement. Donc, je suggère quelque chose comme:
CC=gcc-4.4 CXX=g++-4.4 cmake path/to/your/CMakeLists.txt
Pour Makefiles, il devrait y avoir une manière similaire. Je ne recommande pas de définir des liens symboliques personnalisés dans/usr / local sauf si vous savez ce que vous faites.
Cela fonctionne Pour fedora 23. Les dépôts compat gcc seront légèrement différents en fonction de votre version de fedora.
Si vous installez les dépôts suivants:
sudo yum install compat-gcc-34-c++-3.4.6-37.fc23.x86_64 compat-gcc-34-3.4.6-37.fc23.x86_64
Maintenant, faites les liens logiciels comme mentionné ci-dessus en supposant que votre dossier Cuda bin est dans /usr/local/cuda/
sudo ln -s /usr/bin/gcc-34 /usr/local/cuda/bin/gcc
sudo ln -s /usr/bin/g++-34 /usr/local/cuda/bin/g++
Vous devriez maintenant pouvoir compiler avec nvcc
sans l'erreur de version gcc.
La solution de Gearoid Murphy fonctionne comme un charme. Pour moi, j'avais deux répertoires pour cuda -
/usr/local/cuda
/usr/local/cuda-5.0
Les liens logiciels devaient être ajoutés uniquement au répertoire mentionné ci-dessous -
/usr/local/cuda
En outre, les liens logiciels G++ et gcc étaient requis comme mentionné par SchighSchagh.
Une autre façon de configurer nvcc pour utiliser une version spécifique de gcc (gcc-4.4, par exemple), est d'éditer nvcc.profile {[3] } et alter PATH pour inclure le chemin d'accès au gcc que vous souhaitez utiliser en premier.
Par exemple (gcc-4.4.6 installé dans /opt):
PATH += /opt/gcc-4.4.6/lib/gcc/x86_64-unknown-linux-gnu/4.4.6:/opt/gcc-4.4.6/bin:$(TOP)/open64/bin:$(TOP)/share/cuda/nvvm:$(_HERE_):
L'emplacement de nvcc.profile varie, mais il doit être dans le même répertoire que l'exécutable nvcc lui-même.
C'est un peu un hack, comme nvcc.profil de n'est pas destiné à l'utilisateur configuration selon le manuel nvcc, mais c'était la solution qui fonctionnait le mieux pour moi.
CUDA est après quelques modifications d'en-tête compatible avec gcc4. 7 et peut-être version supérieure: https://www.udacity.com/wiki/cs344/troubleshoot_gcc47
J'ai dû installer les anciennes versions de gcc, g++.
sudo apt-get install gcc-4.4
sudo apt-get install g++-4.4
Vérifiez que gcc-4.4 est dans / usr / bin/, et même pour g++ Ensuite, je pourrais utiliser la solution ci-dessus:
sudo ln -s /usr/bin/gcc-4.4 /opt/cuda/bin/gcc
sudo ln -s /usr/bin/g++-4.4 /opt/cuda/bin/g++
Si vous utilisez cmake
pour moi, aucun des hacks d'édition des fichiers et de liaison n'a fonctionné, donc j'ai compilé en utilisant les drapeaux qui spécifient la version gcc/g++.cmake -DCMAKE_C_COMPILER=gcc-6 -DCMAKE_CXX_COMPILER=g++-6 ..
Travaillé comme charme.
Pour les gens comme moi qui sont confus en utilisant cmake
, le script FindCUDA.cmake
remplace certaines des choses de nvcc.profile
. Vous pouvez spécifier le compilateur hôte nvcc
en définissant CUDA_HOST_COMPILER
selon http://public.kitware.com/Bug/view.php?id=13674 .
Dans $CUDA_HOME/include/host_config.h
, Trouvez des lignes comme celles-ci (peuvent légèrement varier entre les différentes versions de CUDA):
//...
#if __GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ > 9)
#error -- unsupported GNU version! gcc versions later than 4.9 are not supported!
#endif [> __GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ > 9) <]
//...
Supprimez ou modifiez les correspondant à votre condition.
Notez que cette méthode est potentiellement dangereuse et peut casser votre build. Par exemple, gcc 5 utilise C++11 par défaut, mais ce n'est pas le cas pour nvcc à partir de CUDA 7.5. Une solution de contournement consiste à ajouter
--Xcompiler="--std=c++98"
pour CUDA
Ou
--std=c++11
pour CUDA > = 7.0.
Pour compiler les exemples CUDA 8.0 sur Ubuntu 16.10, j'ai fait:
sudo apt-get install gcc-5 g++-5
cd /path/to/NVIDIA_CUDA-8.0_Samples
# Find the path to the library (this should be in NVIDIA's Makefiles)
LIBLOC=`find /usr/lib -name "libnvcuvid.so.*" | head -n1 | perl -pe 's[/usr/lib/(nvidia-\d+)/.*][$1]'`
# Substitute that path into the makefiles for the hard-coded, incorrect one
find . -name "*.mk" | xargs perl -pi -e "s/nvidia-\d+/$LIBLOC/g"
# Make using the supported compiler
HOST_COMPILER=g++-5 make
Cela a l'avantage de ne pas modifier l'ensemble du système ou de créer des liens symboliques vers les binaires (ce qui pourrait causer des problèmes de liaison de bibliothèque.)