CUDA tidak kompatibel dengan versi gcc saya

102

Saya mengalami masalah saat mengumpulkan beberapa contoh yang dikirimkan dengan CUDA SDK. Saya telah menginstal driver pengembang (versi 270.41.19) dan toolkit CUDA, lalu akhirnya SDK (keduanya versi 4.0.17).

Awalnya itu tidak mengkompilasi sama sekali pemberian:

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

Saya menemukan baris yang bertanggung jawab di 81: /usr/local/cuda/include/host_config.h dan mengubahnya menjadi:

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

sejak saat itu saya hanya mendapatkan beberapa contoh untuk dikompilasi, itu berhenti dengan:

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

Seperti beberapa contoh kompilasi, saya rasa ini bukan masalah driver, tetapi harus ada hubungannya dengan versi gcc yang tidak didukung. Menurunkan versi bukanlah suatu opsi karena gcc4.6 memiliki seluruh sistem sebagai dependensi pada saat ini ...

fbielejec.dll
sumber
4
Untuk pembaca selanjutnya: Pastikan Anda menggunakan CUDA versi terbaru (kecuali Anda benar-benar harus menggunakan versi awal). NVIDIA meningkatkan versi kompiler maksimum yang didukung dengan hampir setiap rilis.
einpoklum
Ini mungkin berguna bagi mereka dengan CUDA 10 dan mendapatkan kesalahan versi rantai kompilator gnu yang terlalu tinggi: stackoverflow.com/questions/53344283/…
Douglas Daseeco

Jawaban:

114

Seperti yang sudah dijelaskan, nvcc bergantung pada gcc 4.4. Anda dapat mengonfigurasi nvcc untuk menggunakan versi gcc yang benar tanpa meneruskan parameter compiler apa pun dengan menambahkan tautan lunak ke direktori bin yang dibuat dengan instalasi nvcc.

Direktori biner cuda default (default instalasi) adalah / usr / local / cuda / bin, menambahkan softlink ke versi gcc yang benar dari direktori ini sudah cukup:

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

Gearoid Murphy
sumber
2
Perintah "perbarui-alternatif" juga dapat membantu, terutama saat menginstal CUDA 5.0
memuat
4
Saya juga harus menambahkan tautan simbolis ke versi g ++ yang benar.
Auron
17
Saya juga harus menautkan ke g ++. Jika tidak, sederhana nvccdoa bekerja, tetapi mengatakan, menerapkan makeke Sampel CUDA, segera membawa doa dimulai dengan: nvcc -ccbin g++. Bagi saya, saya menggunakan sudo ln -s /usr/bin/gcc-4.9 /usr/local/cuda/bin/gccdan sudo ln -s /usr/bin/g++-4.9 /usr/local/cuda/bin/g++.
pengguna2023370
8
Jika Anda mengkompilasi dengan cmake .. && makeAnda dapat mencoba cmake -D CUDA_NVCC_FLAGS="-ccbin gcc-4.4" .. && make . Jika Anda menggunakan polos MakefileAnda bisa mencoba make CXX=g++-4.4 CC=gcc-4.4 .
patryk.beza
1
ketika saya mencoba perintah ini, dikatakan "File ada" dan tidak melakukan tautan. Ada bantuan?
Sentient07
59

gcc 4.5 dan 4.6 tidak didukung dengan CUDA - kode tidak dapat dikompilasi dan rantai alat lainnya, termasuk cuda-gdb, tidak akan berfungsi dengan baik. Anda tidak dapat menggunakannya, dan batasannya tidak dapat dinegosiasikan.

Satu-satunya solusi Anda adalah menginstal versi gcc 4.4 sebagai kompiler kedua (sebagian besar distribusi akan mengizinkannya). Ada opsi untuk nvcc --compiler-bindiryang dapat digunakan untuk menunjuk ke kompiler alternatif. Buat direktori lokal dan kemudian buat tautan simbolis ke versi gcc yang dapat dieksekusi. Teruskan direktori lokal itu ke nvcc melalui --compiler-bindiropsi, dan Anda seharusnya dapat mengkompilasi kode CUDA tanpa mempengaruhi sistem Anda yang lain.


EDIT :

Perhatikan bahwa pertanyaan dan jawaban ini berkaitan dengan CUDA 4.

Sejak ditulis, NVIDIA terus memperluas dukungan untuk versi gcc yang lebih baru dalam rilis toolchain CUDA yang lebih baru

  • Pada rilis CUDA 4.1, gcc 4.5 sekarang didukung. gcc 4.6 dan 4.7 tidak didukung.
  • Pada rilis CUDA 5.0, gcc 4.6 sekarang didukung. gcc 4.7 tidak didukung.
  • Pada rilis CUDA 6.0, gcc 4.7 sekarang didukung.
  • Sejak rilis CUDA 7.0, gcc 4.8 didukung penuh, dengan dukungan 4.9 di Ubuntu 14.04 dan Fedora 21.
  • Sejak rilis CUDA 7.5, gcc 4.8 didukung penuh, dengan dukungan 4.9 di Ubuntu 14.04 dan Fedora 21.
  • Pada rilis CUDA 8, gcc 5.3 didukung penuh di Ubuntu 16.06 dan Fedora 23.
  • Pada rilis CUDA 9, gcc 6 didukung penuh di Ubuntu 16.04, Ubuntu 17.04, dan Fedora 25.
  • Rilis CUDA 9.2 menambahkan dukungan untuk gcc 7
  • Rilis CUDA 10.1 menambahkan dukungan untuk gcc 8

Saat ini (mulai CUDA 10.1) tidak ada dukungan gcc 9 di CUDA.

Perhatikan bahwa NVIDIA baru-baru ini menambahkan tabel yang sangat berguna di sini yang berisi compiler yang didukung dan matriks OS untuk rilis CUDA saat ini.

cakar
sumber
Tahu apa yang digunakan untuk CUDA 7.5?
GuySoft
2
Saya menggunakan CUDA 7.5 dengan gcc 4.9.3SLES 11 SP3 tanpa masalah.
Peter VARGA
3
Apa? Bagaimana kode seharusnya tidak dikompilasi dengan versi yang lebih tinggi (kecuali untuk batasan hardcode tentunya) ? Satu-satunya hal yang dapat saya pikirkan adalah karena beberapa versi, ada C11 / C ++ 11 yang diaktifkan secara default, tetapi jika itu menyebabkan masalah dengan kode lama, itu bisa dengan mudah diselesaikan dengan saklar baris perintah.
Hi-Angel
2
Seconding @ Hi-Angel. #talonmies Apa artinya "pembatasan tidak dapat dinegosiasikan"? Versi gcc dan gdb yang lebih baru mendukung header biner yang lebih lama untuk file objek, karena mereka "selalu" (semacam), tidak ada alasan versi gcc yang lebih baru tidak berfungsi. Selain solusi Symlinking, masalah lain apa pun kemungkinan besar adalah setelan tanda versi praprosesor ac, dan jika pengujian versi gcc "di-hardcode" di beberapa header cuda sebagai bagian dari definisi atau makro, itu cukup mudah untuk diperbaiki. Pengecualiannya bisa jadi compiler cuda gpu itu sendiri.
Beracah
1
Ini bukan pertanyaan kompatibilitas biner. Toolchain CUDA mengharuskan nvcc dan parser ujung depan GPU dapat mencegat dan membebani berbagai compiler dan header internal libc / libc ++ untuk mengompilasi host dan kode perangkat serta mengintegrasikannya bersama. Pengurai CUDA harus dapat mengurai header internal gcc dengan benar, antara lain. Versi gcc yang belum teruji dapat dan memang gagal, terlepas dari pelindung preprocessor yang terpasang di header NVIDIA. Anda bisa mempercayai saya (sebagai seseorang yang telah meretas toolchain CUDA selama hampir 10 tahun), atau tidak. Pada titik ini saya tidak benar
cakar
57
  1. Periksa versi GCC maksimum yang didukung untuk versi CUDA Anda:

     | 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. Setel env var untuk versi GCC tersebut. Misalnya, untuk CUDA 10.2:

     MAX_GCC_VERSION=8
  3. Pastikan Anda telah menginstal versi itu:

     sudo apt install gcc-$MAX_GCC_VERSION g++-$MAX_GCC_VERSION
  4. Tambahkan symlink dalam folder 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++

    (atau gantikan /usr/local/cudadengan jalur instalasi CUDA Anda, jika tidak ada)

Lihat inti GitHub ini untuk informasi lebih lanjut tentang tabel kompatibilitas CUDA-GCC .

bryant1410
sumber
3
Menyelamatkan hidup saya konfigurasi lol mimpi buruk !!!! Terima kasih. Saya menerapkan ini ke cuda 10 dengan tautan sistem gcc dan g ++ 7. Untuk siapa pun yang menemukan ini.
thekevshow
Apakah saya harus membuat folder /usr/bin/gccdan /usr/bin/g++atau /usr/local/cuda/bin/gccsendiri?
Josh Desmond
@JoshDesmond symlink untuk file yang Anda sebutkan dibuat pada langkah 4.
bryant1410
@ bryant1410 Ketika saya menjalankan perintah pada langkah empat, saya ingat mendapatkan kesalahan di sepanjang baris, "Kesalahan: direktori / usr / local / cuda / bin / gcc tidak ada, dibatalkan," atau yang serupa. Saya sekarang menyadari, (setelah membaca rincian pertanyaan), bahwa jawaban Anda mengasumsikan langkah 0 yang disebutkan oleh OP: "Saya telah menginstal toolkit CUDA, lalu akhirnya SDK". Saya mencoba melakukan instalasi dengan hal cuda_10.2.89_440.33.01_linux.runwizard NVIDIA , yang gagal saat runtime dengan keluhan tentang kompatibilitas gcc. Saya akhirnya memutuskan untuk menghapus gcc 9: P
Josh Desmond
1
Jika Anda menginstal NVCC dengan [ana | mini] conda (conda-forge package cudatoolkit-dev), maka Anda perlu menautkan di dalam env Anda seperti ln -s /usr/bin/gcc-8 /home/user/miniconda3/envs/your_env/bin/gccdanln -s /usr/bin/g++-8 /home/user/miniconda3/envs/your_env/bin/g++
Diego Ferri
25

Solusi Gearoid Murphy bekerja lebih baik untuk saya karena di distro saya (Ubuntu 11.10), gcc-4.4 dan gcc-4.6 berada di direktori yang sama, jadi --compiler-bindir tidak membantu. Satu-satunya peringatan adalah saya juga harus menginstal g ++ - 4.4 dan menautkannya juga:

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
sumber
11

Untuk CUDA7.5 baris ini berfungsi:

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
sumber
9

Lihat cara menggunakan "pembaruan-alternatif" untuk mengatasi masalah ini:

... Jika Anda menginstal gcc 4.6 Anda juga dapat menggunakan perintah update-alternate agar mudah beralih antar versi. Ini dapat dikonfigurasi dengan:

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
sumber
6

Jika menggunakan cmakeuntuk saya tidak ada peretasan mengedit file dan penautan yang berfungsi, jadi saya mengkompilasi menggunakan bendera yang menentukan versi gcc / g ++.
cmake -DCMAKE_C_COMPILER=gcc-6 -DCMAKE_CXX_COMPILER=g++-6 ..

Bekerja seperti pesona.

markroxor
sumber
haha saya akan mencoba untuk menghubungkan jawaban anda dari pertanyaan yang lain disini karena menurut saya jawaban tersebut perlu ditempatkan di thread ini. Kerja bagus lagi! Terima kasih
MikeDoho
Seseorang harus menahan diri untuk tidak memposting jawaban duplikat di SO tetapi saya tidak punya pilihan. :)
markroxor
5

Pada sebagian besar distribusi, Anda dapat menginstal versi gcc dan g ++ lain di samping kompiler terbaru seperti gcc-4.7. Selain itu, sebagian besar sistem build mengetahui variabel CCdan CXXlingkungan, yang memungkinkan Anda menentukan compiler C dan C ++ lainnya. JADI saya menyarankan sesuatu seperti:

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

Untuk Makefiles harus ada cara serupa. Saya tidak merekomendasikan pengaturan symlink khusus di / usr / local kecuali Anda tahu apa yang Anda lakukan.

matematika
sumber
3

Ini bekerja untuk fedora 23. Repositori compat gcc akan sedikit berbeda berdasarkan versi fedora Anda.

Jika Anda menginstal repositori berikut:

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

Sekarang buat tautan lunak seperti yang disebutkan di atas dengan asumsi folder cuda bin Anda ada di dalamnya /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++

Sekarang Anda seharusnya dapat mengompilasi nvcctanpa kesalahan versi gcc.

Chris Chaffin
sumber
2

Solusi Gearoid Murphy bekerja seperti pesona. Bagi saya, saya memiliki dua direktori untuk cuda -

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

Tautan lunak harus ditambahkan hanya ke direktori yang disebutkan di bawah -

/usr/local/cuda 

Selain itu, tautan lunak g ++ dan gcc diperlukan seperti yang disebutkan oleh SchighSchagh.

arpwal
sumber
2

Cara lain untuk mengkonfigurasi nvcc agar menggunakan versi gcc tertentu (gcc-4.4, misalnya), adalah dengan mengedit nvcc.profile dan mengubah PATH untuk menyertakan jalur ke gcc yang ingin Anda gunakan terlebih dahulu.

Misalnya (gcc-4.4.6 diinstal di / 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_):

Lokasi nvcc.profile bervariasi, tetapi harus berada di direktori yang sama dengan nvcc yang dapat dieksekusi itu sendiri.

Ini sedikit hack, karena nvcc.profile tidak dimaksudkan untuk konfigurasi pengguna sesuai dengan manual nvcc, tetapi itu adalah solusi yang bekerja paling baik untuk saya.

Ewerton
sumber
Saya sarankan melakukan ini, tetapi arahkan jalur ke direktori dengan g ++ yang terhubung ke versi gcc yang benar (sangat berguna jika distribusi Anda menyediakan versi gcc yang didukung). Misalnya:mkdir /usr/local/bin/cuda-hack && ln -s /usr/bin/g++-5 /usr/local/bin/cuda-hack
Sami Liedes
2

Untuk orang-orang seperti saya yang bingung saat menggunakan cmake, FindCUDA.cmakeskrip menimpa beberapa hal dari nvcc.profile. Anda dapat menentukan nvcckompiler host dengan menyetel CUDA_HOST_COMPILERsesuai http://public.kitware.com/Bug/view.php?id=13674 .

cheshirekow
sumber
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/gccSaya telah berhasil menginstal gromacs dengan dukungan GPU.
pengchy
2

Saya harus menginstal versi lama gcc, g ++.

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

Periksa apakah gcc-4.4 ada di / usr / bin /, dan sama untuk g ++ Kemudian saya bisa menggunakan solusi di atas:

    sudo ln -s /usr/bin/gcc-4.4 /opt/cuda/bin/gcc
    sudo ln -s /usr/bin/g++-4.4 /opt/cuda/bin/g++
travelingbones
sumber
Ketika saya mencoba perintah ini, dikatakan "File ada" dan tidak menjalankan tautan. Ada bantuan?
Sentient07
Saya khawatir saya terlalu jauh dari memikirkan hal ini untuk tahu harus berkata apa. Semoga orang lain bisa membantu.
travelingbones
2

Di $CUDA_HOME/include/host_config.h, temukan baris seperti ini (mungkin sedikit berbeda di antara versi CUDA yang berbeda):

//...
#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) <]
//...

Hapus atau ubah sesuai dengan kondisi Anda.

Perhatikan bahwa metode ini berpotensi tidak aman dan dapat merusak build Anda. Misalnya, gcc 5 menggunakan C ++ 11 sebagai default, namun tidak demikian halnya untuk nvcc pada CUDA 7.5. Solusinya adalah menambahkan

--Xcompiler="--std=c++98" untuk CUDA <= 6.5

atau

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

Kh40tiK
sumber
di mana kita menambahkan --std=c++opsi?
asgs
1

Jika Anda mengalami kesalahan ini, harap baca file log:

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

Ikuti saja saran di file log:

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

Pekerjaan selesai :)

Saya baru saja menginstal CUDA 10.2 dengan gcc 9.2 di Kubuntu 19.10 menggunakan --overrideopsi tersebut.

Vanessa Deagan
sumber
0

Untuk mengkompilasi contoh CUDA 8.0 di Ubuntu 16.10, saya melakukan:

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

Keuntungannya adalah tidak memodifikasi keseluruhan sistem atau membuat symlink hanya ke binari (yang dapat menyebabkan masalah penautan pustaka.)

Eponim
sumber
0

Ini memecahkan masalah saya:

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
sumber
0

Untuk CUDA 6.5 (dan ternyata 7.0 dan 7.5), saya telah membuat versi paket gcc 4.8.5 RPM (di bawah Fedora Core 30) yang memungkinkan versi gcc tersebut diinstal bersama GCC sistem Anda saat ini.

Anda dapat menemukan semua informasi itu di sini .

ulatekh
sumber
0

Dalam kasus saya, saya sudah menginstal CUDA dari versi Ubuntu dan cmake akan mendeteksi yang itu alih-alih versi yang baru diinstal menggunakan NVidia SDK Manager.

Saya berlari dpkg -l | grep cudadan bisa melihat kedua versi.

Apa yang harus saya lakukan adalah mencopot pemasangan CUDA lama (versi 9.1 dalam kasus saya) dan membiarkan versi baru (versi 10.2). Saya menggunakan perintah pembersihan seperti ini:

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

Harap verifikasi bahwa nama paket cocok dengan versi yang ingin Anda hapus dari instalasi Anda.

Saya harus menjalankan ulang cmakedari BUILDdirektori kosong untuk mengarahkan semua #includeperpustakaan dan ke versi SDK (karena jalur lama dibuat di lingkungan build yang ada).

Alexis Wilke
sumber
-1

Ini terjadi karena versi CUDA Anda saat ini tidak mendukung versi GCC Anda saat ini. Anda perlu melakukan hal berikut:

  1. Temukan versi GCC yang didukung (dalam kasus saya 5 untuk 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. Instal versi GCC yang didukung

    sudo apt-get install gcc-5
    sudo apt-get install g++-5
  3. Ubah softlink untuk GCC di /usr/bindirektori

    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. Ubah softlink untuk GCC di /usr/local/cuda-9.0/bindirektori

    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. Tambahkan -DCUDA_HOST_COMPILER=/usr/bin/gcc-5ke setup.pyfile Anda , digunakan untuk kompilasi

    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. Hapus direktori build lama

    rm -rd build/
  7. Kompilasi lagi dengan mengatur CUDAHOSTCXX=/usr/bin/gcc-5

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

Catatan: Jika Anda masih mendapatkan gcc: error trying to exec 'cc1plus': execvp: no such file or directorykesalahan setelah mengikuti langkah-langkah ini, coba instal ulang GCC seperti ini lalu kompilasi lagi:

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

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

tsveti_iko
sumber