Ich habe Probleme beim Kompilieren einiger Beispiele, die mit dem CUDA SDK geliefert wurden. Ich habe den Entwicklertreiber (Version 270.41.19) und das CUDA-Toolkit installiert, dann endlich das SDK (beide Version 4.0.17).
Anfangs wurde es überhaupt nicht kompiliert und gab:
error -- unsupported GNU version! gcc 4.5 and up are not supported!
Ich fand die verantwortliche Zeile in 81: /usr/local/cuda/include/host_config.h und änderte sie in:
//#if __GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ > 4)
#if __GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ > 6)
Von diesem Zeitpunkt an habe ich nur noch einige Beispiele zum Kompilieren. Es hört auf mit:
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
Da einige der Beispiele kompiliert werden, ist dies meines Erachtens kein Treiberproblem, sondern muss etwas mit einer nicht unterstützten gcc-Version zu tun haben. Ein Downgrade ist keine Option, da gcc4.6 zu diesem Zeitpunkt ein ganzes System als Abhängigkeit hat ...
Antworten:
Wie bereits erwähnt, hängt nvcc von gcc 4.4 ab. Es ist möglich, nvcc so zu konfigurieren, dass die richtige Version von gcc verwendet wird, ohne dass Compilerparameter übergeben werden, indem dem mit der nvcc-Installation erstellten bin-Verzeichnis Softlinks hinzugefügt werden.
Das Standard-Binärverzeichnis von cuda (der Standard für die Installation) ist / usr / local / cuda / bin. Das Hinzufügen eines Softlinks zur richtigen Version von gcc aus diesem Verzeichnis ist ausreichend:
sudo ln -s /usr/bin/gcc-4.4 /usr/local/cuda/bin/gcc
quelle
nvcc
funktionieren einfache Aufrufe, aber wenn Sie sichmake
auf die CUDA-Beispiele beziehen, werden in Kürze Aufrufe angezeigt, beginnend mit :nvcc -ccbin g++
. Für mich habe ichsudo ln -s /usr/bin/gcc-4.9 /usr/local/cuda/bin/gcc
und verwendetsudo ln -s /usr/bin/g++-4.9 /usr/local/cuda/bin/g++
.cmake .. && make
, können Sie es versuchencmake -D CUDA_NVCC_FLAGS="-ccbin gcc-4.4" .. && make
. Wenn Sie Plain verwendenMakefile
, können Sie es versuchenmake CXX=g++-4.4 CC=gcc-4.4
.gcc 4.5 und 4.6 werden von CUDA nicht unterstützt - Code wird nicht kompiliert und der Rest der Toolchain, einschließlich cuda-gdb, funktioniert nicht richtig. Sie können sie nicht verwenden und die Einschränkung ist nicht verhandelbar.
Ihre einzige Lösung besteht darin, eine gcc 4.4-Version als zweiten Compiler zu installieren (die meisten Distributionen erlauben dies). Es gibt eine Option für nvcc, mit
--compiler-bindir
der auf einen alternativen Compiler verwiesen werden kann. Erstellen Sie ein lokales Verzeichnis und stellen Sie dann symbolische Links zu den unterstützten ausführbaren Dateien der gcc-Version her. Übergeben--compiler-bindir
Sie dieses lokale Verzeichnis über die Option an nvcc , und Sie sollten in der Lage sein, CUDA-Code zu kompilieren, ohne den Rest Ihres Systems zu beeinträchtigen.EDIT :
Beachten Sie, dass sich diese Frage und Antwort auf CUDA 4 bezieht.
Seit dem Schreiben hat NVIDIA die Unterstützung für spätere gcc-Versionen in der neueren CUDA-Toolchain-Version weiter ausgebaut
Derzeit gibt es (ab CUDA 10.1) keine gcc 9-Unterstützung in CUDA.
Beachten Sie, dass NVIDIA kürzlich eine sehr nützliche Tabelle hinzugefügt hat, die den unterstützten Compiler und die Betriebssystemmatrix für die aktuelle CUDA-Version enthält.
quelle
gcc 4.9.3
auf SLES 11 SP3 ohne Probleme.Überprüfen Sie die maximal unterstützte GCC-Version für Ihre CUDA-Version:
Legen Sie eine env var für diese GCC-Version fest. Zum Beispiel für CUDA 10.2:
Stellen Sie sicher, dass Sie diese Version installiert haben:
Hinzufügen von Symlinks in CUDA-Ordnern:
(oder ersetzen Sie
/usr/local/cuda
Ihren CUDA-Installationspfad, falls dieser nicht vorhanden ist)Weitere Informationen zur CUDA-GCC-Kompatibilitätstabelle finden Sie in dieser GitHub-Übersicht .
quelle
/usr/bin/gcc
und/usr/bin/g++
und/usr/local/cuda/bin/gcc
selbst erstellen ?cuda_10.2.89_440.33.01_linux.run
Assistenten-Ding durchzuführen, das zur Laufzeit einfach mit einer Beschwerde über die gcc-Kompatibilität fehlgeschlagen ist.cudatoolkit-dev
) installiert haben , müssen Sie in Ihrem env likeln -s /usr/bin/gcc-8 /home/user/miniconda3/envs/your_env/bin/gcc
undln -s /usr/bin/g++-8 /home/user/miniconda3/envs/your_env/bin/g++
Die Lösung von Gearoid Murphy funktioniert für mich besser, da sich gcc-4.4 und gcc-4.6 in meiner Distribution (Ubuntu 11.10) im selben Verzeichnis befinden, sodass --compiler-bindir keine Hilfe ist. Die einzige Einschränkung ist, dass ich auch g ++ - 4.4 installieren und es auch symlinken musste:
quelle
Für CUDA7.5 funktionieren diese Zeilen:
quelle
Lesen Sie, wie Sie "Update-Alternativen" verwenden , um dieses Problem zu umgehen:
quelle
Wenn
cmake
für mich keiner der Hacks zum Bearbeiten der Dateien und Verknüpfen funktioniert hat, habe ich mit den Flags kompiliert, die die gcc / g ++ - Version angeben.cmake -DCMAKE_C_COMPILER=gcc-6 -DCMAKE_CXX_COMPILER=g++-6 ..
Arbeitete wie Charme.
quelle
Bei den meisten Distributionen haben Sie die Möglichkeit, neben einem aktuellen Compiler wie gcc-4.7 eine weitere gcc- und g ++ - Version zu installieren. Darüber hinaus kennen die meisten Build-Systeme die Variablen
CC
undCXX
umgebungsvariablen, mit denen Sie andere C- bzw. C ++ - Compiler angeben können. Also schlage ich etwas vor wie:Für Makefiles sollte es einen ähnlichen Weg geben. Ich empfehle nicht, benutzerdefinierte Symlinks in / usr / local festzulegen, es sei denn, Sie wissen, was Sie tun.
quelle
Dies funktioniert für Fedora 23. Die kompatiblen gcc-Repositorys unterscheiden sich je nach Fedora-Version geringfügig.
Wenn Sie die folgenden Repositorys installieren:
Stellen Sie nun die oben genannten Softlinks her, vorausgesetzt, Ihr Cuda Bin-Ordner befindet sich in
/usr/local/cuda/
Sie sollten jetzt in der Lage sein,
nvcc
ohne den gcc-Versionsfehler zu kompilieren .quelle
Die Lösung von Gearoid Murphy wirkt wie ein Zauber. Für mich hatte ich zwei Verzeichnisse für cuda -
Die Softlinks mussten nur zu dem unten genannten Verzeichnis hinzugefügt werden -
Außerdem waren sowohl g ++ als auch gcc Softlinks erforderlich, wie von SchighSchagh erwähnt.
quelle
Eine andere Möglichkeit, nvcc für die Verwendung einer bestimmten Version von gcc (z. B. gcc-4.4) zu konfigurieren , besteht darin, nvcc.profile zu bearbeiten und PATH so zu ändern , dass der Pfad zu dem gcc enthalten ist, den Sie zuerst verwenden möchten.
Zum Beispiel (gcc-4.4.6 installiert in / opt):
Der Speicherort von nvcc.profile ist unterschiedlich, sollte sich jedoch im selben Verzeichnis befinden wie die ausführbare Datei von nvcc .
Dies ist ein kleiner Hack, da nvcc.profile nicht für die Benutzerkonfiguration gemäß dem nvcc-Handbuch vorgesehen ist, aber es war die Lösung, die für mich am besten funktioniert hat.
quelle
mkdir /usr/local/bin/cuda-hack && ln -s /usr/bin/g++-5 /usr/local/bin/cuda-hack
CUDA ist nach einigen Header-Änderungen mit gcc4.7 und möglicherweise einer höheren Version kompatibel: https://www.udacity.com/wiki/cs344/troubleshoot_gcc47
quelle
Für Leute wie mich, die während der Verwendung verwirrt sind
cmake
,FindCUDA.cmake
überschreibt das Skript einige der Inhalte vonnvcc.profile
. Sie können dennvcc
Host-Compiler angeben, indem Sie ihnCUDA_HOST_COMPILER
gemäß http://public.kitware.com/Bug/view.php?id=13674 einstellen .quelle
cmake .. -DCMAKE_INSTALL_PREFIX=/InstallPos_GPU/ -DCMAKE_C_COMPILER="/gcc-8.3.0/bin/gcc" -DCMAKE_CXX_COMPILER="/gcc-8.3.0/bin/g++" -DGMX_GPU=ON -DCUDA_TOOLKIT_ROOT_DIR=/cuda-7.5/ -D NVCCFLAGS=" -ccbin /cuda-7.5/bin/" -DCUDA_HOST_COMPILER=/cuda-7.5/bin/gcc
Ich habe die Gromacs mit GPU-Unterstützung erfolgreich installiert.Ich musste die älteren Versionen von gcc, g ++ installieren.
Überprüfen Sie, ob sich gcc-4.4 in / usr / bin / befindet und dasselbe für g ++. Dann könnte ich die obige Lösung verwenden:
quelle
In
$CUDA_HOME/include/host_config.h
finden Zeilen wie diese (leicht zwischen verschiedenen CUDA - Version können variieren):Entfernen oder ändern Sie sie entsprechend Ihrem Zustand.
Beachten Sie, dass diese Methode möglicherweise unsicher ist und Ihren Build beschädigen kann. Beispielsweise verwendet gcc 5 standardmäßig C ++ 11, dies ist jedoch für nvcc ab CUDA 7.5 nicht der Fall. Eine Problemumgehung ist das Hinzufügen
--Xcompiler="--std=c++98"
für CUDA <= 6,5oder
--std=c++11
für CUDA> = 7,0.quelle
--std=c++
Option hinzu?Wenn Sie auf diesen Fehler stoßen, lesen Sie bitte die Protokolldatei:
Folgen Sie einfach dem Vorschlag in der Protokolldatei:
Job erledigt :)
Ich habe gerade CUDA 10.2 mit gcc 9.2 auf Kubuntu 19.10 mit der
--override
Option installiert .quelle
Um die CUDA 8.0-Beispiele unter Ubuntu 16.10 zu kompilieren, habe ich Folgendes getan:
Dies hat den Vorteil, dass nicht das gesamte System geändert oder Symlinks nur zu den Binärdateien erstellt werden (dies kann zu Problemen bei der Bibliotheksverknüpfung führen.)
quelle
Dies löste mein Problem:
quelle
Für CUDA 6.5 (und anscheinend 7.0 und 7.5) habe ich eine Version des RPM-Pakets gcc 4.8.5 (unter Fedora Core 30) erstellt, mit der diese Version von gcc neben dem aktuellen GCC Ihres Systems installiert werden kann.
All diese Informationen finden Sie hier .
quelle
In meinem Fall hatte ich CUDA bereits von der Ubuntu-Version installiert und cmake würde diese anstelle der neu installierten Version mit dem NVidia SDK Manager erkennen.
Ich lief
dpkg -l | grep cuda
und konnte beide Versionen sehen.Ich musste die alte CUDA (in meinem Fall Version 9.1) deinstallieren und die neue Version (Version 10.2) in Ruhe lassen. Ich habe den Befehl zum Löschen folgendermaßen verwendet:
Stellen Sie sicher, dass die Paketnamen mit der Version übereinstimmen, die Sie aus Ihrer Installation entfernen möchten.
Ich musste
cmake
aus einem leerenBUILD
Verzeichnis erneut ausführen , um alle#include
und Bibliotheken auf die SDK-Version umzuleiten (da die alten Pfade in der vorhandenen Build-Umgebung gebacken wurden).quelle
Dies geschieht, weil Ihre aktuelle CUDA-Version Ihre aktuelle GCC-Version nicht unterstützt. Sie müssen Folgendes tun:
Finden Sie die unterstützte GCC-Version (in meinem Fall 5 für CUDA 9)
Installieren Sie die unterstützte GCC-Version
Ändern Sie die Softlinks für GCC im
/usr/bin
VerzeichnisÄndern Sie die Softlinks für GCC im
/usr/local/cuda-9.0/bin
VerzeichnisIn
-DCUDA_HOST_COMPILER=/usr/bin/gcc-5
auf Ihresetup.py
Datei, für die Kompilierung verwendetEntfernen Sie das alte Build-Verzeichnis
Kompilieren Sie erneut durch Einstellen
CUDAHOSTCXX=/usr/bin/gcc-5
Hinweis: Wenn
gcc: error trying to exec 'cc1plus': execvp: no such file or directory
nach den folgenden Schritten immer noch der Fehler auftritt, installieren Sie den GCC erneut wie folgt und kompilieren Sie ihn erneut:Credits: https://github.com/facebookresearch/maskrcnn-benchmark/issues/25#issuecomment-433382510
quelle