it-swarm.dev

CUDA niezgodne z moją wersją gcc

Mam problemy ze skompilowaniem niektórych przykładów dostarczonych z zestawem CUDA SDK . Zainstalowałem sterownik programisty (wersja 270.41.19) i zestaw narzędzi CUDA, , A następnie SDK (obie wersje 4.0.17).

Początkowo nie kompilował się wcale, dając:

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

Znalazłem linię odpowiedzialną w 81: /usr/local/cuda/include/Host_config.h i zmieniłem ją na:

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

od tego momentu mam tylko kilka przykładów do skompilowania, zatrzymuje się na:

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

Ponieważ niektóre przykłady kompilują, uważam, że nie jest to problem ze sterownikiem, ale raczej musi mieć coś wspólnego z nieobsługiwaną wersją gcc. Upgrade nie jest opcją, ponieważ gcc4.6 ma cały system jako zależność w tym momencie ... 

75
fbielejec

Jak już wspomniano, nvcc zależy od gcc 4.4. Możliwe jest skonfigurowanie nvcc do używania poprawnej wersji gcc bez przekazywania żadnych parametrów kompilatora przez dodanie softlinków do katalogu bin utworzonego za pomocą instalacji nvcc.

Domyślny katalog binarny cuda (domyślna instalacja) to/usr/local/cuda/bin, dodanie wystarczającego linku do poprawnej wersji gcc z tego katalogu jest wystarczające: 

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

93
Gearoid Murphy

gcc 4.5 i 4.6 nie są obsługiwane przez CUDA - kod nie będzie się kompilował, a reszta toolchaina, w tym cuda-gdb, nie będzie działać poprawnie. Nie możesz ich używać, a ograniczenie nie podlega negocjacjom.

Twoim jedynym rozwiązaniem jest zainstalowanie wersji gcc 4.4 jako kompilatora second (większość dystrybucji na to pozwoli). Istnieje opcja nvcc --compiler-bindir, która może być użyta do wskazania alternatywnego kompilatora. Utwórz lokalny katalog, a następnie utwórz dowiązania symboliczne do obsługiwanych plików wykonywalnych wersji gcc. Przekaż ten katalog lokalny do nvcc za pomocą opcji --compiler-bindir i powinieneś być w stanie skompilować kod CUDA bez wpływu na resztę systemu.


EDYTOWAĆ:

Zauważ, że to pytanie i odpowiedź odnoszą się do CUDA 4. Od momentu napisania, NVIDIA kontynuuje rozszerzanie wsparcia dla późniejszych wersji gcc w nowszej wersji CUDA toolchain release

  • Począwszy od wersji CUDA 4.1, gcc 4.5 jest teraz obsługiwane. gcc 4.6 i 4.7 nie są obsługiwane.
  • Począwszy od wersji CUDA 5.0, gcc 4.6 jest teraz obsługiwane. gcc 4.7 nie jest obsługiwany.
  • Począwszy od wersji CUDA 6.0, gcc 4.7 jest teraz obsługiwane.
  • Począwszy od wersji CUDA 7.0, gcc 4.8 jest w pełni obsługiwane, z obsługą 4.9 w Ubuntu 14.04 i Fedorze 21.
  • Począwszy od wersji CUDA 7.5, gcc 4.8 jest w pełni obsługiwane, z obsługą 4.9 w Ubuntu 14.04 i Fedorze 21.
  • Począwszy od wersji CUDA 8, gcc 5.3 jest w pełni obsługiwane w Ubuntu 16.06 i Fedorze 23.
  • Począwszy od wydania CUDA 9, gcc 6 jest w pełni obsługiwany w Ubuntu 16.04, Ubuntu 17.04 i Fedora 25.
  • Wersja CUDA 9.2 dodaje obsługę gcc 7

Obecnie (od CUDA 10) nie ma obsługi gcc 8 w CUDA.

Zauważ, że NVIDIA ostatnio dodała bardzo przydatną tabelę tutaj która zawiera obsługiwany kompilator i macierz systemu operacyjnego dla bieżącej wersji CUDA.

43
talonmies

Aktualizacja:

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

Musisz najpierw zainstalować gcc i g ++ 6:

Sudo apt install gcc-6 g++-6

Stara odpowiedź:

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

Musisz najpierw zainstalować gcc i g ++ 5:

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

Rozwiązanie Gearoid Murphy działa lepiej dla mnie, ponieważ na mojej dystrybucji (Ubuntu 11.10), gcc-4.4 i gcc-4.6 znajdują się w tym samym katalogu, więc --compiler-bindir nie pomaga. Jedynym zastrzeżeniem jest to, że musiałem także zainstalować g ++ - 4.4 i także dowiązać go symlink:

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

Dla CUDA7.5 te linie działają:

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

Sprawdź jak używać „update-alternatives” aby obejść ten problem:

... Jeśli zainstalujesz gcc 4.6, możesz również skorzystać z update-alternatives polecenie pozwalające na łatwe przełączanie między wersjami. To może być skonfigurowany za pomocą:

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

W większości dystrybucji masz możliwość zainstalowania innej wersji gcc i g ++ obok najnowszego kompilatora, takiego jak gcc-4.7. Ponadto większość systemów kompilacji zna zmienne środowiskowe CC i CXX, które pozwalają określić odpowiednio inne kompilatory C i C++. SO Sugeruję coś takiego:

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

W przypadku plików Makefile powinien istnieć podobny sposób. Nie polecam ustawiania niestandardowych dowiązań symbolicznych w/usr/local, chyba że wiesz, co robisz.

5
math

Działa to w Fedorze 23. Repozytoria compat gcc będą nieco inne w zależności od wersji Fedory.

Jeśli zainstalujesz następujące repozytoria:

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

Teraz utwórz miękkie linki, jak wspomniano powyżej, zakładając, że Twój folder cuda bin znajduje się w /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++

Teraz powinieneś być w stanie skompilować się z nvcc bez błędu wersji gcc.

3
Chris Chaffin

Jeśli używasz cmake dla mnie, żaden z haków edycji plików i łączenia nie zadziałał, więc skompilowałem używając flag, które określają wersję gcc/g ++.
cmake -DCMAKE_C_COMPILER=gcc-6 -DCMAKE_CXX_COMPILER=g++-6 .. 

Pracował jak urok.

3
markroxor

Musiałem zainstalować starsze wersje gcc, g ++.

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

Sprawdź, czy gcc-4.4 jest w/usr/bin /, i tym samym dla g ++ Wtedy mógłbym użyć powyższego rozwiązania: 

    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

Innym sposobem skonfigurowania nvcc do używania określonej wersji gcc (na przykład gcc-4.4), jest edycja nvcc.profile i alter ŚCIEŻKA, aby dołączyć ścieżkę do gcc, którą chcesz użyj najpierw.

Na przykład (gcc-4.4.6 zainstalowany w/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_):

Lokalizacja nvcc.profile jest różna, ale powinna znajdować się w tym samym katalogu, co sam plik wykonywalny nvcc.

Jest to trochę hack, ponieważ nvcc.profile nie jest przeznaczony do konfiguracji użytkownika zgodnie z instrukcją nvcc, ale było to rozwiązanie, które działało najlepiej dla mnie.

2
Ewerton

CUDA jest po niektórych modyfikacjach nagłówka zgodnych z wersją gcc4.7 i może wyższą: https://www.udacity.com/wiki/cs344/troubleshoot_gcc47

2
42n4

Rozwiązanie Gearoid Murphy działa jak urok. Dla mnie miałem dwa katalogi dla cuda - 

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

Miękkie linki musiały zostać dodane tylko do katalogu wymienionego poniżej - 

/usr/local/cuda 

Wymagane były również miękkie linki g ++ i gcc, o których wspomniał SchighSchagh. 

2
arpwal

Dla ludzi takich jak ja, którzy są zdezorientowani podczas używania cmake, skrypt FindCUDA.cmake zastępuje niektóre elementy z nvcc.profile. Możesz określić kompilator hosta nvcc, ustawiając CUDA_Host_COMPILER jako na http://public.kitware.com/Bug/view.php?id=13674 .

1
cheshirekow

To rozwiązało mój 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++
0
Sherzod

Aby skompilować przykłady CUDA 8.0 na Ubuntu 16.10:

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

Ma to tę zaletę, że nie modyfikuje całego systemu ani nie tworzy dowiązań symbolicznych tylko do plików binarnych (które mogą powodować problemy z łączeniem bibliotek).

0
Eponymous

W $CUDA_HOME/include/Host_config.h, znajdź takie linie (mogą się nieznacznie różnić w zależności od wersji 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) <]
//...

Usuń lub zmień je zgodnie ze swoim stanem.

Pamiętaj, że ta metoda jest potencjalnie niebezpieczna i może przerwać twoją kompilację. Na przykład gcc 5 używa C++ 11 jako domyślnego, jednak nie dotyczy to nvcc od CUDA 7.5. Rozwiązaniem jest dodanie

--Xcompiler="--std=c++98" dla CUDA <= 6,5 

lub

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

0
Kh40tiK