web-dev-qa-db-fra.com

CUDA incompatible avec ma version gcc

J'ai des difficultés à compiler certains des exemples fournis avec le SDK CUDA . J'ai installé le pilote de développement (version 270.41.19) et le toolkit CUDA, .__, puis le SDK (version 4.0.17).

Au départ, il ne compilait pas du tout ce qui donnait:

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'ai modifiée en:

//#if __GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ > 4)
#if __GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ > 6)

à partir de ce moment, je n'ai plus que quelques exemples à compiler, cela s'arrête à:

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 exemples compilés, je pense que ce n’est pas un problème de pilote, mais doit plutôt avoir quelque chose à voir avec une version de gcc non prise en charge. La rétrogradation n'est pas une option car gcc4.6 a un système entier en tant que dépendance à ce stade ... 

75
fbielejec

Comme déjà indiqué, nvcc dépend de gcc 4.4. Il est possible de configurer nvcc pour utiliser la version correcte de gcc sans transmettre de paramètre de compilateur en ajoutant des liens souples au répertoire bin créé avec l’installation de nvcc.

Le répertoire binaire cuda par défaut (le répertoire d'installation par défaut) est/usr/local/cuda/bin, l'ajout d'un lien virtuel à la version correcte de gcc à partir de ce répertoire suffit: 

Sudo ln -s /usr/bin/gcc-4.4 /usr/local/cuda/bin/gcc

93
Gearoid Murphy

gcc 4.5 et 4.6 ne sont pas supportés par 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 n'est pas négociable.

Votre seule solution consiste à installer une version 4.4 de gcc en tant que compilateur second (la plupart des distributions le permettent). Il existe une option pour nvcc --compiler-bindir qui peut être utilisée pour pointer vers un compilateur de remplacement. Créez un répertoire local, puis créez des liens symboliques vers les exécutables pris en charge de la version gcc. Passez ce répertoire local à nvcc via l’option --compiler-bindir et vous devriez pouvoir compiler le code CUDA sans affecter le reste de votre système.


MODIFIER:

Notez que cette question et la réponse concernent CUDA 4. Depuis sa rédaction, NVIDIA a continué à étendre la prise en charge des versions ultérieures de gcc dans la nouvelle version de la chaîne d'outils CUDA.

  • Depuis la version 4.1 de CUDA, gcc 4.5 est maintenant pris en charge. Les fichiers gcc 4.6 et 4.7 ne sont pas pris en charge.
  • A partir de la version CUDA 5.0, gcc 4.6 est maintenant pris en charge. gcc 4.7 n'est pas supporté.
  • Depuis la version CUDA 6.0, gcc 4.7 est maintenant pris en charge.
  • À partir de la version 7.0 de CUDA, gcc 4.8 est entièrement pris en charge, avec une prise en charge de 4,9 sur Ubuntu 14.04 et Fedora 21.
  • Depuis la version 7.5 de CUDA, gcc 4.8 est entièrement pris en charge, avec une prise en charge de 4.9 sur Ubuntu 14.04 et Fedora 21.
  • À partir de la version CUDA 8, gcc 5.3 est entièrement pris en charge sur Ubuntu 16.06 et Fedora 23.
  • À partir de la version 9 de CUDA, gcc 6 est entièrement pris en charge sur Ubuntu 16.04, Ubuntu 17.04 et Fedora 25.
  • La version 9.2 de CUDA ajoute la prise en charge de gcc 7

Il n’existe actuellement (à partir de CUDA 10) aucun soutien de gcc 8 dans CUDA.

Notez que NVIDIA a récemment ajouté un tableau très utile ici qui contient le compilateur et la matrice de système d’exploitation pris en charge pour la version actuelle de CUDA.

43
talonmies

Mettre à 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 avoir préalablement installé gcc et g ++ 6:

Sudo apt install gcc-6 g++-6

Ancienne 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 avoir préalablement installé gcc et g ++ 5:

Sudo apt install gcc-5 g++-5
24
bryant1410

La solution de Gearoid Murphy fonctionne mieux pour moi car 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 d'aucune aide. Le seul inconvénient est que je devais aussi installer g ++ - 4.4 et le lier symboliquement aussi:

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
Nicu Stiurca

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
neouyghur

Découvrez comment utiliser "update-alternatives" pour résoudre ce problème:

... Si vous installez gcc 4.6, vous pouvez également utiliser les alternatives de mise à jour commande permettant 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
Akanes

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 tel que gcc-4.7. De plus, la plupart des systèmes de compilation connaissent les variables d’environnement CC et CXX, qui permettent de spécifier les autres compilateurs C et C++. SO Je suggère quelque chose comme:

CC=gcc-4.4 CXX=g++-4.4 cmake path/to/your/CMakeLists.txt

Pour Makefiles, il devrait en être de même. Je ne recommande pas de définir des liens symboliques personnalisés dans/usr/local, à moins que vous ne sachiez ce que vous faites.

5
math

Cela fonctionne pour Fedora 23. Les dépôts dépendant de gcc seront légèrement différents selon votre version de Fedora.

Si vous installez les référentiels 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 

Créez maintenant les liens symboliques mentionnés 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
Chris Chaffin

Si vous utilisez cmake, aucune des manipulations liées à la modification des fichiers et à la liaison n'a fonctionné. Nous avons donc compilé en utilisant les indicateurs qui spécifient la version gcc/g ++.
cmake -DCMAKE_C_COMPILER=gcc-6 -DCMAKE_CXX_COMPILER=g++-6 .. 

A travaillé comme un charme.

3
markroxor

Je devais 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 identique pour g ++ Je pourrais alors 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
travelingbones

Un autre moyen de configurer nvcc pour utiliser une version spécifique de gcc (par exemple, gcc-4.4) consiste à éditer nvcc.profile et modifierCHEMINpour inclure le chemin d'accès au gcc que vous souhaitez utiliser. 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 figurer dans le même répertoire que l'exécutable nvcc .

C'est un peu un bidouillage, car nvcc.profile n'est pas destiné à la configuration de l'utilisateur conformément au manuel nvcc, mais c'est la solution qui a fonctionné le mieux pour moi.

2
Ewerton

CUDA est après quelques modifications d'en-tête compatibles avec gcc4.7 et peut-être une version supérieure: https://www.udacity.com/wiki/cs344/troubleshoot_gcc47 }

2
42n4

La solution de Gearoid Murphy fonctionne à merveille. Pour moi, j'avais deux répertoires pour cuda - 

/usr/local/cuda 
/usr/local/cuda-5.0

Les liens symboliques devaient être ajoutés uniquement au répertoire mentionné ci-dessous - 

/usr/local/cuda 

En outre, les liens dynamiques g ++ et gcc étaient nécessaires, comme mentionné par SchighSchagh. 

2
arpwal

Pour les personnes comme moi qui confondent l'utilisation de cmake, le script FindCUDA.cmake remplace certains éléments de nvcc.profile. Vous pouvez spécifier le compilateur d'hôte nvcc en définissant CUDA_Host_COMPILER selon http://public.kitware.com/Bug/view.php?id=13674 .

1
cheshirekow

Cela a résolu mon problème:

Sudo rm /usr/local/cuda/bin/gcc
Sudo rm /usr/local/cuda/bin/g++
Sudo apt install gcc-4.4 g++-4.4
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++
0
Sherzod

Pour compiler les exemples de CUDA 8.0 sur Ubuntu 16.10, j'ai:

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 présente l’avantage de ne pas modifier l’ensemble du système ni de créer des liens symboliques avec uniquement les fichiers binaires (cela pourrait entraîner des problèmes de liaison de bibliothèque.)

0
Eponymous

Dans $CUDA_HOME/include/Host_config.h, recherchez les lignes comme celles-ci (elles peuvent légèrement varier selon les 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 en fonction de votre condition.

Notez que cette méthode est potentiellement dangereuse et peut casser votre construction. 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 consiste à ajouter

--Xcompiler="--std=c++98" pour CUDA <= 6.5 

ou

--std=c++11 pour CUDA> = 7.0.

0
Kh40tiK