CUDA jest niezgodna z moją wersją gcc

102

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

fbielejec
źródło
4
Dla przyszłych czytelników: upewnij się, że używasz najnowszej wersji CUDA (chyba że absolutnie musisz używać wczesnej wersji). NVIDIA zwiększa maksymalną obsługiwaną wersję kompilatora w prawie każdym wydaniu.
einpoklum
Może to być pomocne dla osób z CUDA 10 i otrzymujących błąd zbyt wysokiej wersji łańcucha kompilatora gnu: stackoverflow.com/questions/53344283/ ...
Douglas Daseeco

Odpowiedzi:

114

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

Gearoid Murphy
źródło
2
Polecenie „update-alternatives” również może pomóc, szczególnie podczas instalacji CUDA 5.0
phoad
4
Musiałem też dodać dowiązanie symboliczne do poprawnej wersji g ++.
Auron,
17
Musiałem również połączyć się z g ++. W przeciwnym razie, proste nvccwywołania pracować, ale mówią, stosując makedo próbek CUDA, szybko przynosi inwokacji zaczynające się od: nvcc -ccbin g++. Dla mnie użyłem sudo ln -s /usr/bin/gcc-4.9 /usr/local/cuda/bin/gcci sudo ln -s /usr/bin/g++-4.9 /usr/local/cuda/bin/g++.
user2023370
8
Jeśli kompilujesz cmake .. && make, możesz spróbować cmake -D CUDA_NVCC_FLAGS="-ccbin gcc-4.4" .. && make . Jeśli używasz zwykłego Makefile, możesz spróbować make CXX=g++-4.4 CC=gcc-4.4 .
patryk.beza
1
kiedy próbuję tego polecenia, wyświetla komunikat „Plik istnieje” i nie wykonuje łącza. Jakaś pomoc ?
Sentient 07
59

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-bindirktó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-bindiropcji, 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

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

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.

talonmies
źródło
Masz jakiś pomysł, co jest używane w CUDA 7.5?
GuySoft
2
Używam CUDA 7.5 z gcc 4.9.3SLES 11 SP3 bez żadnego problemu.
Peter VARGA
3
Co? W jaki sposób kod nie powinien się kompilować z wyższymi wersjami (z wyjątkiem oczywiście zakodowanych ograniczeń) ? Jedyne, co przychodzi mi do głowy, to to, że ponieważ niektóre wersje C11 / C ++ 11 są domyślnie włączone, ale jeśli powoduje to problem ze starym kodem, można to łatwo obejść za pomocą przełącznika wiersza poleceń.
Hi-Angel,
2
Oddelegowanie @ Hi-Angel. #talonmies Co w ogóle oznacza „ograniczenie nie podlega negocjacji”? Nowsze wersje gcc i gdb obsługują starsze nagłówki binarne dla plików obiektowych, ponieważ mają one "zawsze" (w pewnym sensie), nie ma powodu, dla którego nowsze wersje gcc nie powinny działać. Pomijając rozwiązania z linkami symbolicznymi, innym problemem jest najprawdopodobniej ustawienie flagi wersji preprocesora ac, a jeśli test wersji gcc jest zakodowany na stałe w jakimś nagłówku CUDA jako część definicji lub makra, jest to łatwe do naprawienia. Wyjątkiem może być sam kompilator cuda gpu.
Beracah
1
To nie jest kwestia zgodności binarnej. Łańcuch narzędzi CUDA wymaga, aby nvcc i zewnętrzny parser GPU mogły przechwytywać i przeciążać różne wewnętrzne nagłówki kompilatora i libc / libc ++, aby skompilować kod hosta i urządzenia i zintegrować je razem. Parser CUDA musi między innymi być w stanie poprawnie przeanalizować wewnętrzne nagłówki gcc. Niesprawdzone wersje gcc mogą zawieść i zawodzą, niezależnie od zabezpieczeń preprocesora wbudowanych w nagłówki NVIDIA. Możesz mi uwierzyć (jako ktoś, kto hakuje zestaw narzędzi CUDA od prawie 10 lat) lub nie. W tym momencie naprawdę nie
talonmies
57
  1. Sprawdź maksymalną obsługiwaną wersję GCC dla swojej wersji CUDA:

     | 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. Ustaw zmienną env dla tej wersji GCC. Na przykład dla CUDA 10.2:

     MAX_GCC_VERSION=8
  3. Upewnij się, że masz zainstalowaną tę wersję:

     sudo apt install gcc-$MAX_GCC_VERSION g++-$MAX_GCC_VERSION
  4. Dodaj linki symboliczne w folderach CUDA:

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

    (lub /usr/local/cudazastą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 .

Bryant1410
źródło
3
Uratowałem moje życie koszmar konfiguracji lol !!!! Dziękuję Ci. Zastosowałem to do CUDA 10 z linkami systemowymi gcc i g ++ 7. Dla każdego, kto się z tym spotka.
thekevshow
Czy powinienem sam utworzyć foldery /usr/bin/gcci /usr/bin/g++lub /usr/local/cuda/bin/gcc?
Josh Desmond
@JoshDesmond link symboliczny do wspomnianych plików jest tworzony w kroku 4.
bryant1410
@ bryant1410 Kiedy wykonałem polecenia w kroku czwartym, pamiętam, że wystąpił błąd w rodzaju: „Błąd: katalog / usr / local / cuda / bin / gcc nie istnieje, przerywanie” lub coś podobnego. Zdaję sobie teraz sprawę (po przeczytaniu szczegółów pytania), że Twoja odpowiedź zakłada krok 0 wspomniany przez OP: „Zainstalowałem zestaw narzędzi CUDA, a na koniec SDK”. Próbowałem przeprowadzić instalację za pomocą cuda_10.2.89_440.33.01_linux.runkreatora 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: P
Josh Desmond
1
Jeśli zainstalowałeś NVCC z [ana | mini] conda (pakiet conda-forge cudatoolkit-dev), musisz umieścić link w swoim env jak ln -s /usr/bin/gcc-8 /home/user/miniconda3/envs/your_env/bin/gcciln -s /usr/bin/g++-8 /home/user/miniconda3/envs/your_env/bin/g++
Diego Ferri
25

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

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
źródło
11

W przypadku 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++
neouyghur
źródło
9

Sprawdź, jak korzystać z „alternatyw-aktualizacji”, aby obejść ten problem:

... Jeśli zainstalujesz gcc 4.6, możesz także użyć polecenia update-alternatives, aby umożliwić łatwe przełączanie między wersjami. Można to skonfigurować 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
Akanes
źródło
6

Jeśli cmakew 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.

markroxor
źródło
haha miałem zamiar połączyć twoją odpowiedź z innym pytaniem, ponieważ pomyślałem, że trzeba je umieścić w tym wątku. Znowu dobra robota! Dzięki
MikeDoho
Należy powstrzymać się od umieszczania podwójnych odpowiedzi na SO, ale nie miałem opcji. :)
markroxor
5

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 CCi CXX, które pozwalają określić odpowiednio inne kompilatory C i C ++. Więc proponuję coś takiego:

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

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.

matematyka
źródło
3

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:

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 folder cuda bin jest 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ś teraz móc kompilować z nvccbez błędu wersji gcc.

Chris Chaffin
źródło
2

Rozwiązanie Gearoid Murphy działa jak urok. U 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 

Ponadto wymagane były zarówno miękkie linki g ++, jak i gcc, o czym wspomniał SchighSchagh.

arpwal
źródło
2

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

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

Ewerton
źródło
Sugeruję zrobienie tego, ale wskazanie ścieżki do katalogu z dowiązaniem symbolicznym g ++ do poprawnej wersji gcc (szczególnie przydatne, jeśli twoja dystrybucja zapewnia obsługiwaną wersję gcc). Na przykład:mkdir /usr/local/bin/cuda-hack && ln -s /usr/bin/g++-5 /usr/local/bin/cuda-hack
Sami Liedes
2

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

Cheshirekow
ź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/gccZ powodzeniem zainstalowałem gromacs z obsługą GPU.
pengchy
2

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 znajduje się w / usr / bin / i to samo dla g ++ Następnie 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++
kości podróżne
źródło
Kiedy próbuję wykonać to polecenie, wyświetla komunikat „Plik istnieje” i nie wykonuje połączenia. Jakaś pomoc ?
Sentient 07
Obawiam się, że jestem zbyt daleko od myślenia o tym, żeby wiedzieć, co powiedzieć. Miejmy nadzieję, że inni mogą pomóc.
travellingbones
2

W programie $CUDA_HOME/include/host_config.hznajdź takie wiersze (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 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,5

lub

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

Kh40tiK
źródło
gdzie dodamy --std=c++opcję do?
asgs
1

Jeśli napotkasz ten błąd, przeczytaj plik dziennika:

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

Po prostu postępuj zgodnie z sugestią w pliku dziennika:

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

Zadanie wykonane :)

Właśnie zainstalowałem CUDA 10.2 z gcc 9.2 na Kubuntu 19.10 używając --overrideopcji.

Vanessa Deagan
źródło
0

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 plików binarnych (co może powodować problemy z łączeniem bibliotek).

Tytułowy
źródło
0

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++
Sherzod
źródło
0

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 .

ulatekh
źródło
0

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

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

Sprawdź, czy nazwy pakietów odpowiadają wersji, którą chcesz usunąć z instalacji.

Musiałem ponownie uruchomić cmakez pustego BUILDkatalogu, aby przekierować wszystkie #includebiblioteki i do wersji SDK (ponieważ stare ścieżki zostały wypieczone w istniejącym środowisku kompilacji).

Alexis Wilke
źródło
-1

Dzieje się tak, ponieważ Twoja aktualna wersja CUDA nie obsługuje Twojej aktualnej wersji GCC. Musisz wykonać następujące czynności:

  1. Znajdź obsługiwaną wersję GCC (w moim przypadku 5 dla 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. Zainstaluj obsługiwaną wersję GCC

    sudo apt-get install gcc-5
    sudo apt-get install g++-5
  3. Zmień linki programowe dla GCC w /usr/binkatalogu

    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. Zmień linki programowe dla GCC w /usr/local/cuda-9.0/binkatalogu

    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. Dodaj -DCUDA_HOST_COMPILER=/usr/bin/gcc-5do swojego setup.pypliku, używanego do kompilacji

    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. Usuń stary katalog kompilacji

    rm -rd build/
  7. Skompiluj ponownie, ustawiając CUDAHOSTCXX=/usr/bin/gcc-5

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

Uwaga: jeśli gcc: error trying to exec 'cc1plus': execvp: no such file or directorypo wykonaniu tych kroków nadal pojawia się błąd, spróbuj ponownie zainstalować GCC w ten sposób, a następnie ponownie skompilować:

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

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

tsveti_iko
źródło