CUDA niezgodne z moją wersją gcc

Mam problemy z kompilacją niektórych przykładów dostarczanych z CUDA SDK. Zainstalowałem sterownik programistów (Wersja 270.41.19) i zestaw narzędzi CUDA, następnie w końcu SDK (zarówno w wersji 4.0.17).

Początkowo nie kompilował się w ogóle 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ł 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, kończy 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

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

Author: talonmies, 2011-07-08

16 answers

Jak już wspomniano, nvcc zależy od gcc 4.4. Możliwe jest skonfigurowanie nvcc do używania poprawnej wersji gcc bez przekazywania jakichkolwiek parametrów kompilatora poprzez dodanie softlinków do katalogu bin utworzonego przy instalacji NVCC.

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

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

 88
Author: Gearoid Murphy,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-11-24 17:44:02

Gcc 4.5 i 4.6 nie są obsługiwane przez CUDA-kod nie będzie kompilowany, a reszta zestawu narzędzi, w tym cuda-gdb, nie będzie działać poprawnie. Nie można ich używać, a ograniczenie nie podlega negocjacjom.

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


EDIT :

Zauważ, że to pytanie i odpowiedź odnoszą się do CUDA 4. Od czasu jego napisania, NVIDIA nadal rozszerza wsparcie dla późniejszych wersji gcc w nowszym wydaniu CUDA toolchain
  • od wydania CUDA 4.1, gcc 4.5 jest teraz obsługiwany. gcc 4.6 i 4.7 to bez wsparcia.
  • od wydania CUDA 5.0, gcc 4.6 jest teraz obsługiwany. gcc 4.7 nie jest obsługiwane.
  • od wydania CUDA 6.0, gcc 4.7 jest teraz obsługiwany.
  • [16]}od wydania CUDA 7.0, gcc 4.8 jest w pełni obsługiwany, z obsługą 4.9 na Ubuntu 14.04 i Fedorze 21. [16]}od wydania CUDA 7.5, gcc 4.8 jest w pełni wspierany, z obsługą 4.9 na Ubuntu 14.04 i Fedorze 21.
  • od wydania CUDA 8, gcc 5.3 jest w pełni obsługiwany na Ubuntu 16.06 i Fedora 23.
  • GCC 6 jest w pełni obsługiwane przez Ubuntu 16.04, Ubuntu 17.04 i Fedorę 25.
  • CUDA 9.2 wersja dodaje wsparcie dla gcc 7

Obecnie (od CUDA 9) nie ma wsparcia dla gcc 8 w CUDA.

Zauważ, że NVIDIA niedawno dodała bardzo przydatną tabelę tutaj , która zawiera obsługiwany kompilator i macierz OS dla bieżącego wydania CUDA.

 43
Author: talonmies,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-08-02 09:34:18

Rozwiązanie Gearoid Murphy ' ego działa dla mnie lepiej, ponieważ na mojej dystrybucji (Ubuntu 11.10), gcc-4.4 i gcc-4.6 są w tym samym katalogu ,więc -- compiler-bindir nie pomaga. Jedyne zastrzeżenie jest to, że musiałem zainstalować g++-4.4 i połączyć go symlinkiem:

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
Author: Nicu Stiurca,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-01-23 09:40:27

Update:

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

Najpierw musisz mieć zainstalowane 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++

Najpierw musisz mieć zainstalowane gcc i g++ 5:

sudo apt install gcc-5 g++-5
 21
Author: bryant1410,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-10-29 21:03:50

Dla CUDA7. 5 działają te linie:

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
Author: neouyghur,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-04-21 14:20:17

Sprawdź Jak użyć opcji "update-alternatives" , aby obejść ten problem:

... Jeśli zainstalujesz gcc 4.6 możesz również użyć opcji update-alternatives polecenie umożliwiające łatwe przełączanie między wersjami. Może to być skonfigurowany z:

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
Author: Akanes,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-11-08 10:27:22

Na 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ć inne kompilatory C i C++. Więc proponuję coś w stylu:

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

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

 5
Author: math,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-01-16 12:17:17

To działa dla Fedory 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 wykonaj 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++

Powinieneś być teraz w stanie skompilować z nvcc bez błędu wersji gcc.

 3
Author: Chris Chaffin,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-12-04 23:16:35

Rozwiązanie Gearoida Murphy ' ego działa jak urok. Dla mnie miałem dwa katalogi cuda -

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

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

/usr/local/cuda 

Również, zarówno g++ i GCC miękkie linki były wymagane, jak wspomniano przez SchighSchagh.

 2
Author: arpwal,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-02-13 07:44:50

Innym sposobem skonfigurowania nvcc do używania określonej wersji gcc (na przykład gcc-4.4), jest edycja nvcc.profile i alter PATH aby włączyć ścieżkę do gcc, której chcesz użyć jako pierwszy.

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.profil jest różny, ale powinien znajdować się w tym samym katalogu co sam plik wykonywalny nvcc.

To jest trochę hack, jak nvcc.profil nie jest przeznaczony dla użytkownika konfiguracja zgodnie z instrukcją nvcc, ale to rozwiązanie działało najlepiej dla mnie.

 2
Author: Ewerton,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-03-31 03:59:32

CUDA jest po pewnych modyfikacjach nagłówka kompatybilnych z gcc4. 7 i może wyższej wersji: https://www.udacity.com/wiki/cs344/troubleshoot_gcc47

 2
Author: 42n4,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-05-23 13:35:34

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 to samo dla g++ Wtedy przydałoby mi się rozwiązanie powyżej:

    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
Author: travelingbones,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-11-18 16:52:04

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

Zadziałało jak urok.
 2
Author: markroxor,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-07-20 11:00:10

Dla ludzi takich jak ja, którzy są zdezorientowani podczas korzystania z cmake, skrypt FindCUDA.cmake nadpisuje niektóre rzeczy z nvcc.profile. Możesz określić kompilator hosta nvcc, ustawiając {[4] } zgodnie z http://public.kitware.com/Bug/view.php?id=13674 .

 1
Author: cheshirekow,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-07-29 00:30:05

W $CUDA_HOME/include/host_config.h Znajdź linie takie jak te (mogą się nieznacznie różnić między różnymi wersjami 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 pasujące do twojego stanu.

Uwaga ta metoda jest potencjalnie niebezpieczna i może złamać kompilację. Na przykład, gcc 5 używa C++11 jako domyślne, jednak nie jest to w przypadku NVCC od CUDA 7.5. Obejście polega na dodaniu

--Xcompiler="--std=c++98" dla CUDA

Lub

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

 0
Author: Kh40tiK,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-09-13 20:29:21

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

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 binariów (co może powodować problemy z linkowaniem bibliotek.)

 0
Author: Eponymous,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-03-26 13:04:13