CUDA incompatible avec ma version gcc

J’ai du mal à comstackr certains des exemples fournis avec CUDA SDK. J’ai installé le pilote des développeurs (version 270.41.19) et le toolkit CUDA, puis enfin le SDK (tous deux version 4.0.17).

Au début, cela 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 en 81: /usr/local/cuda/include/host_config.h et l’ai changé en:

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

à partir de là, je n’ai plus que quelques exemples à comstackr, 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 exemples comstacknt, je pense que ce n’est pas un problème de pilote, mais plutôt un problème avec une version gcc non supscope. La rétrogradation n’est pas une option car gcc4.6 a tout un système en tant que dépendance à ce stade …

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 transmettre de parameters de compilation en ajoutant des liens vers le répertoire bin créé avec l’installation nvcc.

Le répertoire binary par défaut de cuda (la valeur par défaut de l’installation) est / usr / local / cuda / bin, l’ajout d’un softlink à la version correcte de gcc depuis ce répertoire suffit:

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

gcc 4.5 et 4.6 ne sont pas supportés avec CUDA – le code ne comstackra pas et le rest de la chaîne d’outils, y compris cuda-gdb, ne fonctionnera pas correctement. Vous ne pouvez pas les utiliser et la ressortingction est non négociable.

Votre seule solution est d’installer une version de gcc 4.4 en tant que deuxième compilateur (la plupart des dissortingbutions le permettent). Il existe une option pour nvcc --comstackr-bindir qui peut être utilisée pour pointer vers un autre compilateur. Créez un répertoire local, puis créez des liens symboliques vers les exécutables de la version gcc pris en charge. Transmettez ce répertoire local à nvcc via l’option --comstackr-bindir et vous devriez être capable de comstackr du code CUDA sans affecter le rest de votre système.


EDIT :

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

  • Depuis la version CUDA 4.1, gcc 4.5 est désormais pris en charge. gcc 4.6 et 4.7 ne sont pas pris en charge.
  • Depuis la version CUDA 5.0, gcc 4.6 est désormais pris en charge. gcc 4.7 n’est pas pris en charge.
  • Depuis la version CUDA 6.0, gcc 4.7 est désormais pris en charge.
  • Depuis la version CUDA 7.0, gcc 4.8 est entièrement pris en charge, avec un support 4.9 sur Ubuntu 14.04 et Fedora 21.
  • Depuis la version CUDA 7.5, gcc 4.8 est entièrement pris en charge, avec un 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.
  • À partir de 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 le support pour gcc 7

Il n’y a actuellement (à partir de CUDA 9) aucun support de gcc 8 dans CUDA.

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

La solution de Gearoid Murphy fonctionne mieux pour moi puisque sur ma dissortingbution (Ubuntu 11.10), gcc-4.4 et gcc-4.6 sont dans le même répertoire, donc –comstackr-bindir n’est d’aucune aide. La seule mise en garde est que je devais aussi installer g ++ – 4.4 et créer un lien symbolique 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++ 

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 gcc et g ++ 6 installés en premier:

 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 avoir gcc et g ++ 5 installés en premier:

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

Découvrez comment utiliser “update-alternatives” pour contourner ce problème:

… Si vous installez gcc 4.6, vous pouvez également utiliser la commande update-alternatives 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 dissortingbutions, 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. De plus, la plupart des systèmes de construction connaissent les variables d’environnement CC et CXX , qui vous permettent de spécifier respectivement les autres compilateurs C et C ++. Donc, je suggère quelque chose comme:

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

Pour les 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 repositorys de gcc de compat seront légèrement différents basés sur 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 

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 comstackr avec nvcc sans l’erreur de version de 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 

De plus, les liens logiciels g ++ et gcc étaient tous deux requirejs, comme mentionné par SchighSchagh.

Une autre façon de configurer nvcc pour utiliser une version spécifique de gcc (gcc-4.4, par exemple) consiste à éditer nvcc.profile et à modifier PATH pour inclure le chemin d’access 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 se trouver dans le même répertoire que l’exécutable nvcc lui-même.

C’est un peu un hack, car nvcc.profile n’est pas destiné à la configuration utilisateur selon le manuel nvcc, mais c’était la solution qui me convenait le mieux.

CUDA est après quelques modifications d’en-tête compatibles 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 ++ Alors 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++ 

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

Si vous utilisez cmake pour moi, aucun des outils d’édition des fichiers et de liaison n’a fonctionné, j’ai donc compilé en utilisant les indicateurs qui spécifient la version de gcc / g ++.
cmake -DCMAKE_C_COMPILER=gcc-6 -DCMAKE_CXX_COMPILER=g++-6 ..

A travaillé comme du charme.

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

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

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

ou

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

Pour comstackr 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 comstackr HOST_COMPILER=g++-5 make 

Cela a pour avantage de ne pas modifier le système entier ou de créer des liens symboliques vers les fichiers binarys (ce qui pourrait entraîner des problèmes de liaison avec la bibliothèque).