CUDA nicht kompatibel mit meiner gcc-Version

102

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

fbielejec
quelle
4
Für zukünftige Leser: Stellen Sie sicher, dass Sie die neueste Version von CUDA verwenden (es sei denn, Sie müssen unbedingt eine frühe Version verwenden). NVIDIA erweitert die maximal unterstützte Compilerversion mit fast jeder Version.
Einpoklum
Dies kann für Benutzer
Douglas Daseeco

Antworten:

114

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

Gearoid Murphy
quelle
1
Der Befehl "update-alternatives" kann ebenfalls hilfreich sein, insbesondere bei der Installation von CUDA 5.0
phoad
4
Ich musste auch einen symbolischen Link zur richtigen Version von g ++ hinzufügen.
Auron
17
Ich musste auch auf g ++ verlinken. Andernfalls nvccfunktionieren einfache Aufrufe, aber wenn Sie sich makeauf die CUDA-Beispiele beziehen, werden in Kürze Aufrufe angezeigt, beginnend mit : nvcc -ccbin g++. Für mich habe ich sudo ln -s /usr/bin/gcc-4.9 /usr/local/cuda/bin/gccund verwendet sudo ln -s /usr/bin/g++-4.9 /usr/local/cuda/bin/g++.
user2023370
8
Wenn Sie mit kompilieren cmake .. && make, können Sie es versuchen cmake -D CUDA_NVCC_FLAGS="-ccbin gcc-4.4" .. && make . Wenn Sie Plain verwenden Makefile, können Sie es versuchen make CXX=g++-4.4 CC=gcc-4.4 .
patryk.beza
1
Wenn ich diesen Befehl versuche, heißt es "Datei existiert" und führt den Link nicht aus. Irgendeine Hilfe ?
Sentient07
58

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-bindirder 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-bindirSie 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

  • Ab der CUDA 4.1-Version wird gcc 4.5 jetzt unterstützt. gcc 4.6 und 4.7 werden nicht unterstützt.
  • Ab der CUDA 5.0-Version wird gcc 4.6 jetzt unterstützt. gcc 4.7 wird nicht unterstützt.
  • Ab der CUDA 6.0-Version wird gcc 4.7 jetzt unterstützt.
  • Ab der CUDA 7.0-Version wird gcc 4.8 vollständig unterstützt, wobei 4.9 unter Ubuntu 14.04 und Fedora 21 unterstützt wird.
  • Ab der CUDA 7.5-Version wird gcc 4.8 vollständig unterstützt, wobei 4.9 unter Ubuntu 14.04 und Fedora 21 unterstützt wird.
  • Ab der CUDA 8-Version wird gcc 5.3 unter Ubuntu 16.06 und Fedora 23 vollständig unterstützt.
  • Ab der CUDA 9-Version wird gcc 6 unter Ubuntu 16.04, Ubuntu 17.04 und Fedora 25 vollständig unterstützt.
  • Die CUDA 9.2-Version bietet Unterstützung für gcc 7
  • Die CUDA 10.1-Version bietet Unterstützung für gcc 8

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.

Talonmien
quelle
Irgendeine Idee, was für CUDA 7.5 verwendet wird?
GuySoft
2
Ich benutze CUDA 7.5 mit gcc 4.9.3auf SLES 11 SP3 ohne Probleme.
Peter VARGA
3
Was? Wie soll ein Code nicht mit höheren Versionen kompiliert werden (außer natürlich mit fest codierten Einschränkungen) ? Das einzige, woran ich denken kann, ist, dass C11 / C ++ 11 in einigen Versionen standardmäßig aktiviert ist. Wenn dies jedoch ein Problem mit einem alten Code verursacht, kann dies mit einem Befehlszeilenschalter leicht umgangen werden.
Hi-Angel
2
Seconding @ Hi-Angel. #talonmies was bedeutet "die Einschränkung ist nicht verhandelbar" überhaupt? Neuere Versionen von gcc und gdb unterstützen ältere binäre Header für Objektdateien, da sie "immer" (irgendwie) vorhanden sind. Es gibt keinen Grund, warum neuere gcc-Versionen nicht funktionieren sollten. Abgesehen von den Symlinking-Lösungen ist jedes andere Problem höchstwahrscheinlich die Einstellung eines Versionsflags für die Präprozessorversion. Wenn der Test der gcc-Version in einem Cuda-Header als Teil einer Definition oder eines Makros "fest codiert" ist, kann er leicht behoben werden. Die Ausnahme könnte der cuda gpu-Compiler selbst sein.
Beracah
1
Dies ist keine Frage zur binären Kompatibilität. Die CUDA-Toolchain erfordert, dass nvcc und der GPU-Front-End-Parser verschiedene Compiler- und libc / libc ++ - interne Header abfangen und überladen können, um Host- und Gerätecode zu kompilieren und zusammen zu integrieren. Der CUDA-Parser muss unter anderem in der Lage sein, die internen gcc-Header korrekt zu analysieren. Ungetestete gcc-Versionen können und können fehlschlagen, unabhängig von den in die NVIDIA-Header integrierten Präprozessor-Schutzvorrichtungen. Sie können mir entweder glauben (als jemand, der seit fast 10 Jahren die CUDA-Toolchain hackt) oder nicht. Zu diesem Zeitpunkt habe ich nicht wirklich
Talonmies
55
  1. Überprüfen Sie die maximal unterstützte GCC-Version für Ihre CUDA-Version:

     | CUDA version | max supported GCC version |
     |--------------|---------------------------|
     |      11      |             9             |
     |  10.1, 10.2  |             8             |
     |   9.2, 10.0  |             7             |
     |   9.0, 9.1   |             6             |
     |       8      |            5.3            |
     |       7      |            4.9            |
     |    5.5, 6    |            4.8            |
     |    4.2, 5    |            4.6            |
     |      4.1     |            4.5            |
     |      4.0     |            4.4            |
    
  2. Legen Sie eine env var für diese GCC-Version fest. Zum Beispiel für CUDA 10.2:

     MAX_GCC_VERSION=8
  3. Stellen Sie sicher, dass Sie diese Version installiert haben:

     sudo apt install gcc-$MAX_GCC_VERSION g++-$MAX_GCC_VERSION
  4. Hinzufügen von Symlinks in CUDA-Ordnern:

     sudo ln -s /usr/bin/gcc-$MAX_GCC_VERSION /usr/local/cuda/bin/gcc 
     sudo ln -s /usr/bin/g++-$MAX_GCC_VERSION /usr/local/cuda/bin/g++
    

    (oder ersetzen Sie /usr/local/cudaIhren CUDA-Installationspfad, falls dieser nicht vorhanden ist)

Weitere Informationen zur CUDA-GCC-Kompatibilitätstabelle finden Sie in dieser GitHub-Übersicht .

bryant1410
quelle
3
Rettete mein Leben lol Konfiguration Albtraum! Danke. Ich habe dies auf cuda 10 mit gcc- und g ++ 7-Systemverknüpfungen angewendet. Für alle, die darauf stoßen.
Thekevshow
Soll ich die Ordner /usr/bin/gccund /usr/bin/g++und /usr/local/cuda/bin/gccselbst erstellen ?
Josh Desmond
@JoshDesmond Der Symlink für die von Ihnen genannten Dateien wird in Schritt 4 erstellt.
bryant1410
@ bryant1410 Als ich die Befehle in Schritt 4 ausführte, erinnere ich mich an einen Fehler wie "Fehler: Verzeichnis / usr / local / cuda / bin / gcc existiert nicht, Abbruch" oder ähnliches. Ich stelle jetzt fest (nachdem ich die Details der Frage gelesen habe), dass Ihre Antwort einen von OP erwähnten Schritt 0 annimmt: "Ich habe das CUDA-Toolkit installiert, dann endlich das SDK". Ich habe versucht, die Installation mit NVIDIAs cuda_10.2.89_440.33.01_linux.runAssistenten-Ding durchzuführen, das zur Laufzeit einfach mit einer Beschwerde über die gcc-Kompatibilität fehlgeschlagen ist.
Josh Desmond
1
Wenn Sie NVCC mit [ana | mini] conda (conda-forge-Paket cudatoolkit-dev) installiert haben , müssen Sie in Ihrem env like ln -s /usr/bin/gcc-8 /home/user/miniconda3/envs/your_env/bin/gccundln -s /usr/bin/g++-8 /home/user/miniconda3/envs/your_env/bin/g++
Diego Ferri
25

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:

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++
Nicu Stiurca
quelle
11

Für CUDA7.5 funktionieren diese Zeilen:

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++
neouyghur
quelle
9

Lesen Sie, wie Sie "Update-Alternativen" verwenden , um dieses Problem zu umgehen:

... Wenn Sie gcc 4.6 installieren, können Sie auch den Befehl update-alternatives verwenden, um einfach zwischen Versionen wechseln zu können. Dies kann konfiguriert werden mit:

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
Akanes
quelle
6

Wenn cmakefü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.

Markroxor
quelle
haha Ich wollte versuchen, deine Antwort von der anderen Frage hier zu verlinken, weil ich dachte, dass sie in diesen Thread aufgenommen werden muss. Wieder gute Arbeit! Vielen Dank
MikeDoho
Man sollte es unterlassen, doppelte Antworten auf SO zu veröffentlichen, aber ich hatte keine Option. :)
Markroxor
5

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 CCund CXXumgebungsvariablen, mit denen Sie andere C- bzw. C ++ - Compiler angeben können. Also schlage ich etwas vor wie:

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

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.

Mathematik
quelle
3

Dies funktioniert für Fedora 23. Die kompatiblen gcc-Repositorys unterscheiden sich je nach Fedora-Version geringfügig.

Wenn Sie die folgenden Repositorys installieren:

sudo yum install compat-gcc-34-c++-3.4.6-37.fc23.x86_64 compat-gcc-34-3.4.6-37.fc23.x86_64 

Stellen Sie nun die oben genannten Softlinks her, vorausgesetzt, Ihr Cuda Bin-Ordner befindet sich in /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++

Sie sollten jetzt in der Lage sein, nvccohne den gcc-Versionsfehler zu kompilieren .

Chris Chaffin
quelle
2

Die Lösung von Gearoid Murphy wirkt wie ein Zauber. Für mich hatte ich zwei Verzeichnisse für cuda -

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

Die Softlinks mussten nur zu dem unten genannten Verzeichnis hinzugefügt werden -

/usr/local/cuda 

Außerdem waren sowohl g ++ als auch gcc Softlinks erforderlich, wie von SchighSchagh erwähnt.

Arpwal
quelle
2

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

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_):

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.

Ewerton
quelle
Ich schlage vor, dies zu tun, aber den Pfad zu einem Verzeichnis zu zeigen, in dem g ++ mit der richtigen gcc-Version verknüpft ist (besonders nützlich, wenn Ihre Distribution eine unterstützte gcc-Version bereitstellt). Zum Beispiel:mkdir /usr/local/bin/cuda-hack && ln -s /usr/bin/g++-5 /usr/local/bin/cuda-hack
Sami Liedes
2

Für Leute wie mich, die während der Verwendung verwirrt sind cmake, FindCUDA.cmakeüberschreibt das Skript einige der Inhalte von nvcc.profile. Sie können den nvccHost-Compiler angeben, indem Sie ihn CUDA_HOST_COMPILERgemäß http://public.kitware.com/Bug/view.php?id=13674 einstellen .

cheshirekow
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/gccIch habe die Gromacs mit GPU-Unterstützung erfolgreich installiert.
Pengchy
2

Ich musste die älteren Versionen von gcc, g ++ installieren.

    sudo apt-get install gcc-4.4
    sudo apt-get install g++-4.4

Ü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:

    sudo ln -s /usr/bin/gcc-4.4 /opt/cuda/bin/gcc
    sudo ln -s /usr/bin/g++-4.4 /opt/cuda/bin/g++
Reiseknochen
quelle
Wenn ich diesen Befehl versuche, heißt es "Datei existiert" und führt den Link nicht aus. Irgendeine Hilfe ?
Sentient07
Ich fürchte, ich bin zu weit davon entfernt, darüber nachzudenken, um zu wissen, was ich sagen soll. Hoffentlich können andere helfen.
Travellingbones
2

In $CUDA_HOME/include/host_config.hfinden Zeilen wie diese (leicht zwischen verschiedenen CUDA - Version können variieren):

//...
#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) <]
//...

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,5

oder

--std=c++11 für CUDA> = 7,0.

Kh40tiK
quelle
Wo fügen wir die --std=c++Option hinzu?
Asgs
1

Wenn Sie auf diesen Fehler stoßen, lesen Sie bitte die Protokolldatei:

$ cat /var/log/cuda-installer.log 
[INFO]: Driver installation detected by command: apt list --installed | grep -e nvidia-driver-[0-9][0-9][0-9] -e nvidia-[0-9][0-9][0-9]
[INFO]: Cleaning up window
[INFO]: Complete
[INFO]: Checking compiler version...
[INFO]: gcc location: /usr/bin/gcc

[INFO]: gcc version: gcc version 9.2.1 20191008 (Ubuntu 9.2.1-9ubuntu2) 

[ERROR]: unsupported compiler version: 9.2.1. Use --override to override this check.

Folgen Sie einfach dem Vorschlag in der Protokolldatei:

sudo sh cuda_<version>_linux.run --override

Job erledigt :)

Ich habe gerade CUDA 10.2 mit gcc 9.2 auf Kubuntu 19.10 mit der --overrideOption installiert .

Vanessa Deagan
quelle
0

Um die CUDA 8.0-Beispiele unter Ubuntu 16.10 zu kompilieren, habe ich Folgendes getan:

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

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

Gleichnamig
quelle
0

Dies löste mein Problem:

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++
Sherzod
quelle
0

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 .

ulatekh
quelle
0

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 cudaund 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:

sudo apt-get purge libcudart9.1 nvidia-cuda-dev nvidia-cuda-doc \
                                nvidia-cuda-gdb nvidia-cuda-toolkit

Stellen Sie sicher, dass die Paketnamen mit der Version übereinstimmen, die Sie aus Ihrer Installation entfernen möchten.

Ich musste cmakeaus einem leeren BUILDVerzeichnis erneut ausführen , um alle #includeund Bibliotheken auf die SDK-Version umzuleiten (da die alten Pfade in der vorhandenen Build-Umgebung gebacken wurden).

Alexis Wilke
quelle
-1

Dies geschieht, weil Ihre aktuelle CUDA-Version Ihre aktuelle GCC-Version nicht unterstützt. Sie müssen Folgendes tun:

  1. Finden Sie die unterstützte GCC-Version (in meinem Fall 5 für CUDA 9)

    • CUDA 4.1: GCC 4.5
    • CUDA 5.0: GCC 4.6
    • CUDA 6.0: GCC 4.7
    • CUDA 7.0: GCC 4.8
    • CUDA 7.5: GCC 4.8
    • CUDA 8: GCC 5.3
    • CUDA 9: GCC 5.5
    • CUDA 9.2: GCC 7
    • CUDA 10.1: GCC 8
  2. Installieren Sie die unterstützte GCC-Version

    sudo apt-get install gcc-5
    sudo apt-get install g++-5
  3. Ändern Sie die Softlinks für GCC im /usr/binVerzeichnis

    cd /usr/bin
    sudo rm gcc
    sudo rm g++
    sudo ln -s /usr/bin/gcc-5 gcc
    sudo ln -s /usr/bin/g++-5 g++
  4. Ändern Sie die Softlinks für GCC im /usr/local/cuda-9.0/binVerzeichnis

    cd /usr/local/cuda-9.0/bin
    sudo rm gcc
    sudo rm g++
    sudo ln -s /usr/bin/gcc-5 gcc
    sudo ln -s /usr/bin/g++-5 g++
  5. In -DCUDA_HOST_COMPILER=/usr/bin/gcc-5auf Ihre setup.pyDatei, für die Kompilierung verwendet

    if torch.cuda.is_available() and CUDA_HOME is not None:
        extension = CUDAExtension
        sources += source_cuda
        define_macros += [("WITH_CUDA", None)]
        extra_compile_args["nvcc"] = [
            "-DCUDA_HAS_FP16=1",
            "-D__CUDA_NO_HALF_OPERATORS__",
            "-D__CUDA_NO_HALF_CONVERSIONS__",
            "-D__CUDA_NO_HALF2_OPERATORS__",
            "-DCUDA_HOST_COMPILER=/usr/bin/gcc-5"
        ]
  6. Entfernen Sie das alte Build-Verzeichnis

    rm -rd build/
  7. Kompilieren Sie erneut durch Einstellen CUDAHOSTCXX=/usr/bin/gcc-5

    CUDAHOSTCXX=/usr/bin/gcc-5 python setup.py build develop

Hinweis: Wenn gcc: error trying to exec 'cc1plus': execvp: no such file or directorynach den folgenden Schritten immer noch der Fehler auftritt, installieren Sie den GCC erneut wie folgt und kompilieren Sie ihn erneut:

sudo apt-get install --reinstall gcc-5
sudo apt-get install --reinstall g++-5

Credits: https://github.com/facebookresearch/maskrcnn-benchmark/issues/25#issuecomment-433382510

tsveti_iko
quelle