Mam problemy ze skompilowaniem niektórych przykładów dostarczonych z CUDA SDK. Zainstalowałem sterownik programisty (wersja 270.41.19) i zestaw narzędzi CUDA, a na końcu SDK (obie wersje 4.0.17).
Początkowo w ogóle się nie kompilował dając:
error -- unsupported GNU version! gcc 4.5 and up are not supported!
Znalazłem odpowiedzialną linię 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, 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
Ponieważ niektóre przykłady kompilują się, uważam, że nie jest to problem ze sterownikiem, ale raczej musi mieć coś wspólnego z nieobsługiwaną wersją gcc. Obniżenie poziomu nie jest opcją, ponieważ gcc4.6 ma w tym momencie zależność całego systemu ...
Odpowiedzi:
Jak już wspomniano, nvcc zależy od gcc 4.4. Możliwe jest skonfigurowanie nvcc tak, aby używał poprawnej wersji gcc bez przekazywania jakichkolwiek parametrów kompilatora przez dodanie linków programowych do katalogu bin utworzonego podczas instalacji nvcc.
Domyślnym katalogiem binarnym cuda (domyślna instalacja) to / usr / local / cuda / bin, wystarczy dodać softlink do poprawnej wersji gcc z tego katalogu:
sudo ln -s /usr/bin/gcc-4.4 /usr/local/cuda/bin/gcc
źródło
nvcc
wywołania pracować, ale mówią, stosującmake
do próbek CUDA, szybko przynosi inwokacji zaczynające się od:nvcc -ccbin g++
. Dla mnie użyłemsudo ln -s /usr/bin/gcc-4.9 /usr/local/cuda/bin/gcc
isudo ln -s /usr/bin/g++-4.9 /usr/local/cuda/bin/g++
.cmake .. && make
, możesz spróbowaćcmake -D CUDA_NVCC_FLAGS="-ccbin gcc-4.4" .. && make
. Jeśli używasz zwykłegoMakefile
, możesz spróbowaćmake CXX=g++-4.4 CC=gcc-4.4
.gcc 4.5 i 4.6 nie są obsługiwane przez CUDA - kod nie będzie się kompilował, a reszta łańcucha narzędzi, w tym cuda-gdb, nie będzie działać poprawnie. Nie możesz ich używać, a ograniczenie nie podlega negocjacjom.
Jedynym rozwiązaniem jest zainstalowanie wersji gcc 4.4 jako drugiego kompilatora (większość dystrybucji na to pozwala). Istnieje opcja nvcc,
--compiler-bindir
której można użyć do wskazania alternatywnego kompilatora. Utwórz katalog lokalny, a następnie utwórz dowiązania symboliczne do obsługiwanych plików wykonywalnych w wersji gcc. Przekaż ten katalog lokalny do nvcc za pomocą--compiler-bindir
opcji, a powinieneś być w stanie skompilować kod CUDA bez wpływu na resztę systemu.EDYCJA :
Zauważ, że to pytanie i odpowiedź odnoszą się do CUDA 4.
Odkąd został napisany, NVIDIA kontynuuje rozszerzanie obsługi późniejszych wersji gcc w nowszej wersji łańcucha narzędzi CUDA
Obecnie (od CUDA 10.1) nie ma obsługi gcc 9 w CUDA.
Zwróć uwagę, że firma NVIDIA dodała ostatnio bardzo przydatną tabelę , która zawiera obsługiwany kompilator i macierz systemu operacyjnego dla bieżącej wersji CUDA.
źródło
gcc 4.9.3
SLES 11 SP3 bez żadnego problemu.Sprawdź maksymalną obsługiwaną wersję GCC dla swojej wersji CUDA:
Ustaw zmienną env dla tej wersji GCC. Na przykład dla CUDA 10.2:
Upewnij się, że masz zainstalowaną tę wersję:
Dodaj linki symboliczne w folderach CUDA:
(lub
/usr/local/cuda
zastąp ścieżką instalacji CUDA, jeśli jej tam nie ma)Więcej informacji na temat tabeli zgodności CUDA-GCC można znaleźć w tym artykule GitHub .
źródło
/usr/bin/gcc
i/usr/bin/g++
lub/usr/local/cuda/bin/gcc
?cuda_10.2.89_440.33.01_linux.run
kreatora NVIDII , który po prostu nie powiódł się w czasie wykonywania z powodu skargi na zgodność z gcc. Skończyło się na tym, że zdecydowałem się odinstalować gcc 9: Pcudatoolkit-dev
), musisz umieścić link w swoim env jakln -s /usr/bin/gcc-8 /home/user/miniconda3/envs/your_env/bin/gcc
iln -s /usr/bin/g++-8 /home/user/miniconda3/envs/your_env/bin/g++
Rozwiązanie Gearoid Murphy działa lepiej dla mnie, ponieważ w 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 też zainstalować g ++ - 4.4 i również to połączyć:
źródło
W przypadku CUDA7.5 te linie działają:
źródło
Sprawdź, jak korzystać z „alternatyw-aktualizacji”, aby obejść ten problem:
źródło
Jeśli
cmake
w moim przypadku żaden z hacków edytowania plików i linkowania nie działał, skompilowałem przy użyciu flag, które określają wersję gcc / g ++.cmake -DCMAKE_C_COMPILER=gcc-6 -DCMAKE_CXX_COMPILER=g++-6 ..
Działało jak urok.
źródło
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 jest świadoma zmiennych środowiskowych
CC
iCXX
, które pozwalają określić odpowiednio inne kompilatory C i C ++. Więc proponuję coś takiego:W przypadku plików Makefile powinien być podobny sposób. Nie polecam ustawiania własnych linków symbolicznych w / usr / local, chyba że wiesz, co robisz.
źródło
Działa to dla fedory 23. Kompatybilne repozytoria gcc będą nieco inne w zależności od twojej wersji fedory.
Jeśli zainstalujesz następujące repozytoria:
Teraz utwórz miękkie linki, jak wspomniano powyżej, zakładając, że folder cuda bin jest w
/usr/local/cuda/
Powinieneś teraz móc kompilować z
nvcc
bez błędu wersji gcc.źródło
Rozwiązanie Gearoid Murphy działa jak urok. U mnie miałem dwa katalogi dla cuda -
Miękkie linki musiały zostać dodane tylko do katalogu wymienionego poniżej -
Ponadto wymagane były zarówno miękkie linki g ++, jak i gcc, o czym wspomniał SchighSchagh.
źródło
Innym sposobem skonfigurowania nvcc do korzystania z określonej wersji gcc (na przykład gcc-4.4) jest edycja nvcc.profile i zmiana PATH tak, aby zawierała ścieżkę do gcc, którego chcesz użyć jako pierwszy.
Na przykład (gcc-4.4.6 zainstalowany w / opt):
Lokalizacja pliku nvcc.profile jest różna, ale powinien znajdować się w tym samym katalogu, co sam plik wykonywalny nvcc .
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.
źródło
mkdir /usr/local/bin/cuda-hack && ln -s /usr/bin/g++-5 /usr/local/bin/cuda-hack
CUDA jest po pewnych modyfikacjach nagłówka kompatybilnych z gcc4.7 i być może wyższą wersją: https://www.udacity.com/wiki/cs344/troubleshoot_gcc47
źródło
Dla ludzi takich jak ja, którzy są zdezorientowani podczas używania
cmake
,FindCUDA.cmake
skrypt zastępuje niektóre elementy znvcc.profile
. Możesz określićnvcc
kompilator hosta, ustawiającCUDA_HOST_COMPILER
zgodnie z http://public.kitware.com/Bug/view.php?id=13674 .źródło
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
Z powodzeniem zainstalowałem gromacs z obsługą GPU.Musiałem zainstalować starsze wersje gcc, g ++.
Sprawdź, czy gcc-4.4 znajduje się w / usr / bin / i to samo dla g ++ Następnie mógłbym użyć powyższego rozwiązania:
źródło
W programie
$CUDA_HOME/include/host_config.h
znajdź takie wiersze (mogą się nieznacznie różnić między różnymi wersjami CUDA):Usuń lub zmień je zgodnie ze swoim stanem.
Pamiętaj, że ta metoda jest potencjalnie niebezpieczna i może spowodować uszkodzenie kompilacji. Na przykład, gcc 5 używa domyślnie C ++ 11, jednak nie dotyczy to nvcc od CUDA 7.5. Obejściem problemu jest dodanie
--Xcompiler="--std=c++98"
dla CUDA <= 6,5lub
--std=c++11
dla CUDA> = 7.0.źródło
--std=c++
opcję do?Jeśli napotkasz ten błąd, przeczytaj plik dziennika:
Po prostu postępuj zgodnie z sugestią w pliku dziennika:
Zadanie wykonane :)
Właśnie zainstalowałem CUDA 10.2 z gcc 9.2 na Kubuntu 19.10 używając
--override
opcji.źródło
Aby skompilować przykłady CUDA 8.0 na Ubuntu 16.10, zrobiłem:
Ma to tę zaletę, że nie modyfikuje całego systemu ani nie tworzy dowiązań symbolicznych tylko do plików binarnych (co może powodować problemy z łączeniem bibliotek).
źródło
To rozwiązało mój problem:
źródło
Dla CUDA 6.5 (i najwyraźniej 7.0 i 7.5) stworzyłem wersję pakietu RPM gcc 4.8.5 (pod Fedorą Core 30), która pozwala na zainstalowanie tej wersji gcc wraz z obecnym GCC twojego systemu.
Wszystkie te informacje znajdziesz tutaj .
źródło
W moim przypadku miałem już zainstalowaną CUDA z wersji Ubuntu i cmake wykryłby ją zamiast nowo zainstalowanej wersji za pomocą NVidia SDK Manager.
Pobiegłem
dpkg -l | grep cuda
i widziałem obie wersje.Musiałem odinstalować starą CUDA (w moim przypadku wersja 9.1) i zostawić nową wersję w spokoju (wersja 10.2). Użyłem polecenia czyszczenia w następujący sposób:
Sprawdź, czy nazwy pakietów odpowiadają wersji, którą chcesz usunąć z instalacji.
Musiałem ponownie uruchomić
cmake
z pustegoBUILD
katalogu, aby przekierować wszystkie#include
biblioteki i do wersji SDK (ponieważ stare ścieżki zostały wypieczone w istniejącym środowisku kompilacji).źródło
Dzieje się tak, ponieważ Twoja aktualna wersja CUDA nie obsługuje Twojej aktualnej wersji GCC. Musisz wykonać następujące czynności:
Znajdź obsługiwaną wersję GCC (w moim przypadku 5 dla CUDA 9)
Zainstaluj obsługiwaną wersję GCC
Zmień linki programowe dla GCC w
/usr/bin
kataloguZmień linki programowe dla GCC w
/usr/local/cuda-9.0/bin
kataloguDodaj
-DCUDA_HOST_COMPILER=/usr/bin/gcc-5
do swojegosetup.py
pliku, używanego do kompilacjiUsuń stary katalog kompilacji
Skompiluj ponownie, ustawiając
CUDAHOSTCXX=/usr/bin/gcc-5
Uwaga: jeśli
gcc: error trying to exec 'cc1plus': execvp: no such file or directory
po wykonaniu tych kroków nadal pojawia się błąd, spróbuj ponownie zainstalować GCC w ten sposób, a następnie ponownie skompilować:Kredyty: https://github.com/facebookresearch/maskrcnn-benchmark/issues/25#issuecomment-433382510
źródło