it-swarm.com.de

CUDA ist mit meiner gcc-Version nicht kompatibel

Ich habe Probleme beim Kompilieren einiger der mit CUDA SDK gelieferten Beispiele . Ich habe den Entwicklertreiber (Version 270.41.19) und das CUDA-Toolkit Installiert, anschließend das SDK (beide Version 4.0.17).

Anfangs kompilierte es überhaupt nicht:

error -- unsupported GNU version! gcc 4.5 and up are not supported!

Ich habe die Zeile in 81 gefunden: /usr/local/cuda/include/Host_config.h und änderte es 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 ein paar Beispiele zum Kompilieren zusammengestellt.

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 Beispiele kompilieren, denke ich, ist dies kein Treiberproblem, sondern muss etwas mit einer nicht unterstützten gcc-Version zu tun haben. Downgrade ist keine Option, da gcc4.6 zu diesem Zeitpunkt ein ganzes System als Abhängigkeit hat ... 

75
fbielejec

Wie bereits erwähnt, hängt nvcc von gcc 4.4 ab. Sie können nvcc so konfigurieren, dass die korrekte Version von gcc verwendet wird, ohne Compilerparameter zu übergeben, indem Sie dem mit der nvcc-Installation erstellten bin-Verzeichnis Softlinks hinzufügen.

Das standardmäßige binäre Cuda-Verzeichnis (Installationsstandard) ist/usr/local/cuda/bin. Das Hinzufügen eines Softlinks zur korrekten Version von gcc aus diesem Verzeichnis ist ausreichend: 

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

93
Gearoid Murphy

gcc 4.5 und 4.6 werden nicht mit CUDA 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.

Die einzige Lösung ist, eine gcc 4.4-Version als second -Compiler zu installieren (die meisten Distributionen erlauben dies). Es gibt eine Option für nvcc --compiler-bindir, mit 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 Sie dieses lokale Verzeichnis über die --compiler-bindir-Option an nvcc. Sie sollten CUDA-Code kompilieren können, ohne den Rest Ihres Systems zu beeinträchtigen.


EDIT:

Beachten Sie, dass sich diese Frage und Antwort auf CUDA 4 beziehen. Seit ihrer Erstellung hat NVIDIA die Unterstützung für neuere gcc-Versionen in der neueren CUDA-Toolchain-Version erweitert

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

Derzeit gibt es (ab CUDA 10) keine Unterstützung für gcc 8 in CUDA.

Beachten Sie, dass NVIDIA kürzlich eine sehr nützliche Tabelle here hinzugefügt hat, die den unterstützten Compiler und die OS-Matrix für das aktuelle CUDA-Release enthält.

43
talonmies

Update:

Für 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++

Sie müssen zuerst gcc und g ++ 6 installiert haben:

Sudo apt install gcc-6 g++-6

Alte Antwort:

Für 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++

Sie müssen zuerst gcc und g ++ 5 installiert haben:

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

Die Lösung von Gearoid Murphy funktioniert besser für mich, da sich auf meiner Distribution (Ubuntu 11.10) gcc-4.4 und gcc-4.6 im selben Verzeichnis befinden, sodass --compiler-bindir keine Hilfe ist. Der einzige Nachteil ist, dass ich auch g ++ - 4.4 installieren und es auch symbolisieren 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++
23
Nicu Stiurca

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

Check out wie man "Update-Alternativen" benutzt um dieses Problem zu umgehen:

... Wenn Sie gcc 4.6 installieren, können Sie auch die Update-Alternativen .__ verwenden. Befehl, um ein einfaches Umschalten zwischen den Versionen zu ermöglichen. Das kann sein konfiguriert 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
7
Akanes

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. Außerdem kennen die meisten Build-Systeme die Umgebungsvariablen CC und CXX, mit denen Sie jeweils andere C- und C++ - Compiler angeben können. SO Ich schlage so etwas vor:

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

Für Makefiles sollte es einen ähnlichen Weg geben. Es wird nicht empfohlen, benutzerdefinierte Symlinks in/usr/local festzulegen, es sei denn, Sie wissen, was Sie tun.

5
math

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 

Nehmen Sie nun die Softlinks wie oben erwähnt vor, vorausgesetzt, Ihr Ordner cuda bin 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 mit nvcc ohne den gcc-Versionsfehler kompilieren können.

3
Chris Chaffin

Wenn cmake für mich verwendet wurde, funktionierte keiner der Hacks zum Bearbeiten der Dateien und zum Verknüpfen. Daher kompilierte ich die Flags, die die gcc/g ++ - Version angeben.
cmake -DCMAKE_C_COMPILER=gcc-6 -DCMAKE_CXX_COMPILER=g++-6 .. 

Arbeitete wie Charme.

3
markroxor

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

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

Stellen Sie sicher, dass sich gcc-4.4 in/usr/bin/und g ++ befindet. 

    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

Sie können nvcc auch so konfigurieren, dass eine bestimmte Version von gcc (z. B. gcc-4.4) verwendet wird, indem Sie nvcc.profile und alterPATHbearbeiten, um den Pfad zum gewünschten gcc anzugeben Verwenden Sie zuerst.

Zum Beispiel (gcc-4.4.6 in/opt installiert):

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 variiert, sollte sich jedoch in demselben Verzeichnis befinden wie die nvcc executable selbst.

Dies ist ein bisschen ein Hacker, 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 funktionierte.

2
Ewerton

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

2
42n4

Die Lösung von Gearoid Murphy funktioniert 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 in das unten angegebene Verzeichnis eingefügt werden. 

/usr/local/cuda 

Wie von SchighSchagh erwähnt, waren sowohl g ++ - als auch gcc-Softlinks erforderlich. 

2
arpwal

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

1
cheshirekow

Das hat mein Problem gelöst:

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

Um die CUDA 8.0-Beispiele auf 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 wird oder Symlinks nur zu den Binärdateien erstellt werden (dies kann zu Problemen bei der Verknüpfung von Bibliotheken führen.)

0
Eponymous

Suchen Sie in $CUDA_HOME/include/Host_config.h Zeilen wie diese (können sich je nach CUDA-Version leicht unterscheiden):

//...
#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 Ihrer Bedingung.

Beachten Sie, dass diese Methode potenziell unsicher ist und Ihr Build möglicherweise beschädigt wird. Beispielsweise verwendet gcc 5 standardmäßig C++ 11, jedoch ist dies bei CUCC 7.5 nicht der Fall. Eine Problemumgehung ist hinzuzufügen

--Xcompiler="--std=c++98" für CUDA <= 6.5 

oder

--std=c++11 für CUDA> = 7.0.

0
Kh40tiK