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