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

73
demandé sur talonmies 2011-07-08 13:25:35

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

88
répondu Gearoid Murphy 2015-11-24 17:44:02

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.

43
répondu talonmies 2018-08-02 09:34:18

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++
23
répondu Nicu Stiurca 2012-01-23 09:40:27

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
21
répondu bryant1410 2017-10-29 21:03:50

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++
10
répondu neouyghur 2016-04-21 14:20:17

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
7
répondu Akanes 2015-11-08 10:27:22

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.

5
répondu math 2014-01-16 12:17:17

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.

3
répondu Chris Chaffin 2015-12-04 23:16:35

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.

2
répondu arpwal 2013-02-13 07:44:50

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.

2
répondu Ewerton 2013-03-31 03:59:32

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

2
répondu 42n4 2013-05-23 13:35:34

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++
2
répondu travelingbones 2014-11-18 16:52:04

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.

2
répondu markroxor 2018-07-20 11:00:10

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 .

1
répondu cheshirekow 2013-07-29 00:30:05

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.

0
répondu Kh40tiK 2016-09-13 20:29:21

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

0
répondu Eponymous 2017-03-26 13:04:13