CUDA несумісний з моєю версією gcc


102

У мене виникають проблеми зі складанням деяких прикладів, поставлених із CUDA SDK. Я встановив драйвер розробників (версія 270.41.19) та інструментарій CUDA, потім нарешті SDK (обидві версії 4.0.17).

Спочатку він взагалі не збирався, даючи:

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

Я знайшов рядок відповідальним у 81: /usr/local/cuda/include/host_config.h і змінив його на:

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

з цього моменту я мав лише кілька прикладів для компіляції, і це зупиняється на:

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

Оскільки деякі з прикладів компілюються, я вважаю, що це не проблема драйвера, а, скоріше, має мати щось спільне з непідтримуваною версією gcc. Пониження рейтингу не є можливим, оскільки gcc4.6 на даний момент має цілу систему як залежність ...


4
Для майбутніх читачів: переконайтеся, що ви використовуєте останню версію CUDA (якщо вам не доведеться використовувати ранню версію). Практично кожну версію NVIDIA підвищує максимально підтримувану версію компілятора.
einpoklum

Це може бути корисно для тих , хто з CUDA 10 і отримую помилку при дуже високій версії гну компілятор ланцюга: stackoverflow.com/questions/53344283 / ...
Дуглас Daseeco

Відповіді:


114

Як уже зазначалося, nvcc залежить від gcc 4.4. Можна налаштувати nvcc на використання правильної версії gcc, не передаючи жодних параметрів компілятора, додавши softlinks до каталогу bin, створеного при встановленні nvcc.

Бінарний каталог cuda за замовчуванням (за замовчуванням встановлення) - / usr / local / cuda / bin, достатньо додати програмне посилання до правильної версії gcc з цього каталогу:

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


2
Команда "update-alternative" також може допомогти, особливо при встановленні CUDA 5.0
foad

4
Мені також довелося додати символічне посилання на правильну версію g ++.
Аврон

17
Мені довелося також посилатися на g ++. В іншому випадку, прості nvccвиклики працюють, але кажуть, застосовуючи makeдо зразків CUDA, незабаром приносять закляття , починаючи з: nvcc -ccbin g++. Для мене я використав 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++.
user2023370

8
Якщо ви компілюєте, cmake .. && makeви можете спробувати cmake -D CUDA_NVCC_FLAGS="-ccbin gcc-4.4" .. && make . Якщо ви використовуєте звичайну, Makefileви можете спробувати make CXX=g++-4.4 CC=gcc-4.4 .
patryk.beza

1
коли я намагаюся виконати цю команду, вона говорить "Файл існує" і не виконує посилання. Будь-яка допомога?
Sentient07,

59

gcc 4.5 та 4.6 не підтримуються CUDA - код не компілюється, а решта набору інструментів, включаючи cuda-gdb, не працюватиме належним чином. Ви не можете ними користуватися, а обмеження не підлягає обговоренню.

Ваше єдине рішення - встановити версію gcc 4.4 як другий компілятор (більшість дистрибутивів це дозволить). Існує опція nvcc, --compiler-bindirяку можна використовувати для вказівки на альтернативний компілятор. Створіть локальний каталог, а потім зробіть символічні посилання на підтримувані виконувані файли gcc. Передайте цей локальний каталог у nvcc через --compiler-bindirопцію, і ви зможете скласти код CUDA, не впливаючи на решту вашої системи.


РЕДАГУВАТИ :

Зауважте, що це питання та відповідь стосуються CUDA 4.

З моменту написання, NVIDIA продовжує розширювати підтримку більш пізніх версій gcc у новій версії інструментів CUDA

  • На момент випуску CUDA 4.1 тепер підтримується gcc 4.5. gcc 4.6 та 4.7 не підтримуються.
  • На момент випуску CUDA 5.0 тепер підтримується gcc 4.6. gcc 4.7 не підтримується.
  • На момент випуску CUDA 6.0 тепер підтримується gcc 4.7.
  • На момент випуску CUDA 7.0 повністю підтримується gcc 4.8 з підтримкою 4.9 на Ubuntu 14.04 та Fedora 21.
  • На момент випуску CUDA 7.5 повністю підтримується gcc 4.8 з підтримкою 4.9 на Ubuntu 14.04 та Fedora 21.
  • На момент випуску CUDA 8 gcc 5.3 повністю підтримується на Ubuntu 16.06 та Fedora 23.
  • На момент випуску CUDA 9, gcc 6 повністю підтримується на Ubuntu 16.04, Ubuntu 17.04 та Fedora 25.
  • Випуск CUDA 9.2 додає підтримку gcc 7
  • Випуск CUDA 10.1 додає підтримку gcc 8

В даний час (станом на CUDA 10.1) підтримка gcc 9 у CUDA відсутня.

Зверніть увагу , що NVIDIA недавно додала дуже корисну таблицю тут , який містить підтримуваний компілятор і ОС матрицю для поточної версії CUDA.


Будь-яка ідея, що використовується для CUDA 7.5?
GuySoft

2
Я gcc 4.9.3без проблем використовую CUDA 7.5 на SLES 11 SP3.
Пітер ВАРГА

3
Що? Як код не повинен компілюватися з більш високими версіями (за винятком жорстко закодованих обмежень) ? Єдине, що я можу придумати, так це те, що, оскільки деякі версії C11 / C ++ 11 увімкнені за замовчуванням, але якщо це спричиняє проблему зі старим кодом, це можна легко обійти за допомогою перемикача командного рядка.
Привіт-Ангел

2
Відкриття @ Привіт-Ангел. #talonmies що взагалі означає "обмеження не підлягає обговоренню"? Новіші версії gcc та gdb підтримують старі бінарні заголовки для об’єктних файлів, оскільки вони "завжди" (подібні) мають, тому нові версії gcc не повинні працювати. Якщо не брати до уваги рішення, будь-яка інша проблема - це, швидше за все, встановлення прапорця версії препроцесора змінного струму, і якщо тест версії gcc "жорстко закодований" в якомусь заголовку Cuda як частина визначення або макросу, це досить легко виправити. Винятком може бути сам компілятор cuda gpu.
Берака

1
Це не питання бінарної сумісності. Набір інструментів CUDA вимагає, щоб nvcc та інтерфейсний синтаксичний аналізатор графічного процесора могли перехоплювати та перевантажувати різні компілятори та внутрішні заголовки libc / libc ++ для компіляції хосту та коду пристрою та інтегрувати їх разом. Аналізатор CUDA повинен вміти правильно розбирати внутрішні заголовки gcc, серед іншого. Неперевірені версії gcc можуть і не спрацьовувати незалежно від захисних пристроїв препроцесора, вбудованих у заголовки NVIDIA. Ви можете або повірити мені (як тому, хто зламує інструментарій CUDA майже 10 років), або ні. На даний момент я не дуже
талонії

57
  1. Перевірте максимально підтримувану версію GCC для своєї версії 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. Встановіть env var для цієї версії GCC. Наприклад, для CUDA 10.2:

     MAX_GCC_VERSION=8
  3. Переконайтесь, що у вас встановлена ​​така версія:

     sudo apt install gcc-$MAX_GCC_VERSION g++-$MAX_GCC_VERSION
  4. Додайте символьні посилання в папки 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++

    (або замініть /usr/local/cudaсвоїм контуром установки CUDA, якщо його немає)

Дивіться цей суть GitHub для отримання додаткової інформації про таблицю сумісності CUDA-GCC .


3
Врятував моє життя коханий конфігурацію !!!! спасибі. Я застосував це до Cuda 10 із системними посиланнями gcc та g ++ 7. Для кожного, хто стикається з цим.
thekevshow

Чи слід створювати папки /usr/bin/gccта /usr/bin/g++або /usr/local/cuda/bin/gccсамостійно?
Джош Десмонд

@JoshDesmond символічне посилання для згаданих вами файлів створено на кроці 4.
bryant1410

@ bryant1410 Коли я запускав команди на четвертому кроці, я пам’ятаю, що я отримав помилку в рядку: «Помилка: каталог / usr / local / cuda / bin / gcc не існує, перервавшись» або щось подібне. Зараз я розумію, (прочитавши подробиці запитання), що ваша відповідь передбачає крок 0, згаданий ОП: "Я встановив інструментарій CUDA, потім нарешті SDK". Я намагався виконати інсталяцію за допомогою cuda_10.2.89_440.33.01_linux.runмайстра NVIDIA , який просто не вдався під час виконання роботи зі скаргою на сумісність gcc. Я нарешті вирішив видалити gcc 9: P
Джош Десмонд

1
Якщо ви встановили NVCC за допомогою [ana | mini] conda (conda-forge package cudatoolkit-dev), тоді вам потрібно зв’язати всередині вашого env, як ln -s /usr/bin/gcc-8 /home/user/miniconda3/envs/your_env/bin/gccіln -s /usr/bin/g++-8 /home/user/miniconda3/envs/your_env/bin/g++
Дієго Феррі

25

Рішення Gearoid Murphy для мене працює краще, оскільки в моєму дистрибутиві (Ubuntu 11.10) gcc-4.4 і gcc-4.6 знаходяться в одному каталозі, тому --compiler-bindir не допоможе. Єдине застереження: я також повинен був встановити 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++

11

Для CUDA7.5 працюють ці рядки:

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

9

Дізнайтеся, як використовувати "альтернативи оновлення", щоб обійти цю проблему:

... Якщо ви встановите gcc 4.6, ви також можете скористатися командою update-alternative, щоб легко переходити між версіями. Це можна налаштувати за допомогою:

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

6

Якщо при використанні cmakeдля мене жодна злом редагування файлів та посилань не спрацювала, тому я скомпілював, використовуючи прапори, які визначають версію gcc / g ++.
cmake -DCMAKE_C_COMPILER=gcc-6 -DCMAKE_CXX_COMPILER=g++-6 ..

Працював як шарм.


ха-ха, я збирався спробувати пов’язати вашу відповідь з іншим питанням тут, тому що я вважав, що потрібно поставити цю тему. Гарна робота ще раз! Спасибі
MikeDoho

Слід утримуватися від розміщення повторних відповідей на SO, але у мене не було можливості. :)
markroxor

5

У більшості дистрибутивів у вас є можливість встановити іншу версію gcc та g ++ поруч із останнім компілятором, таким як gcc-4.7. Крім того, більшість систем побудови обізнані зі змінними середовища CCта CXXоточення, які дозволяють вказати вам відповідно інші компілятори C та C ++. Так що я пропоную щось на кшталт:

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

Для Makefiles має бути подібний спосіб. Я не рекомендую встановлювати спеціальні посилання в / usr / local, якщо ви не знаєте, що ви робите.


3

Це працює для fedora 23. Репозиторії compat gcc дещо відрізнятимуться від вашої версії Fedora.

Якщо ви встановите такі сховища:

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

Тепер зробіть м'які посилання, як згадувалося вище, припускаючи, що ваша папка cuda bin /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++

Тепер ви зможете компілювати nvccбез помилки версії gcc.


2

Рішення Gearoid Мерфі працює як шарм. Для мене у мене були два каталоги для cuda -

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

М’які посилання потрібно було додати лише до каталогу, згаданому нижче -

/usr/local/cuda 

Також, як згадував SchighSchagh, потрібні і м'які посилання g ++, і gcc.


2

Іншим способом налаштування nvcc для використання певної версії gcc (наприклад, gcc-4.4) є редагування nvcc.profile та зміна PATH, щоб включити шлях до gcc, який ви хочете використовувати спочатку.

Наприклад (gcc-4.4.6 встановлено в / 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_):

Розташування nvcc.profile варіюється, але воно повинно бути в тому ж каталозі, що і сам виконуваний файл nvcc .

Це трохи зламано , оскільки nvcc.profile не призначений для конфігурації користувача відповідно до інструкції nvcc, але саме для мене це рішення працювало найкраще.


Я пропоную зробити це, але вказати шлях до каталогу із g ++, що має символічне посилання на правильну версію gcc (особливо корисно, якщо ваш дистрибутив надає підтримувану версію gcc). Наприклад:mkdir /usr/local/bin/cuda-hack && ln -s /usr/bin/g++-5 /usr/local/bin/cuda-hack
Самі Лідес


2

Для таких людей, як я, які плутаються під час використання cmake, FindCUDA.cmakeсценарій замінює деякі речі nvcc.profile. Ви можете вказати nvccхост-компілятор, встановивши CUDA_HOST_COMPILERвідповідно до http://public.kitware.com/Bug/view.php?id=13674 .


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Я успішно встановив gromacs з підтримкою GPU.
пенгі

2

Мені довелося встановити старіші версії gcc, g ++.

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

Переконайтесь, що gcc-4.4 знаходиться в / usr / bin /, і те саме для g ++ Тоді я міг би використати рішення вище:

    sudo ln -s /usr/bin/gcc-4.4 /opt/cuda/bin/gcc
    sudo ln -s /usr/bin/g++-4.4 /opt/cuda/bin/g++

Коли я спробую цю команду, вона говорить "Файл існує" і посилання не виконує. Будь-яка допомога?
Sentient07,

Боюся, що я занадто далеко віддалений від думки про це, щоб знати, що сказати. Сподіваємось, інші можуть допомогти.
подорожні

2

В $CUDA_HOME/include/host_config.h, знайти такі рядки (може злегка відрізнятися від іншою версією 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) <]
//...

Видаліть або змініть їх відповідно до вашої умови.

Зауважте, що цей метод потенційно небезпечний і може порушити вашу збірку. Наприклад, gcc 5 використовує C ++ 11 за замовчуванням, проте це не так для nvcc станом на CUDA 7.5. Допомогти потрібно вирішити

--Xcompiler="--std=c++98" для CUDA <= 6,5

або

--std=c++11 для CUDA> = 7,0.


куди ми додаємо --std=c++опцію?
asgs

1

Якщо ви виявили цю помилку, прочитайте файл журналу:

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

Просто дотримуйтесь пропозицій у файлі журналу:

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

Робота виконана :)

Щойно я встановив CUDA 10.2 з gcc 9.2 на Kubuntu 19.10 за допомогою --overrideпараметра.


0

Щоб скласти приклади CUDA 8.0 на 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

Це має перевагу в тому, що не змінювати всю систему або створювати посилання на бінарні файли (це може спричинити проблеми зв’язку бібліотеки.)


0

Це вирішило мою проблему:

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

Для CUDA 6.5 (і, очевидно, 7.0 та 7.5), я створив версію пакета RPM gcc 4.8.5 (під Fedora Core 30), що дозволяє встановлювати цю версію gcc поряд із поточним GCC вашої системи.

Ви можете знайти всю цю інформацію тут .


0

У моєму випадку у мене вже була встановлена ​​CUDA з версії Ubuntu, і cmake виявив би її замість щойно встановленої версії за допомогою NVidia SDK Manager.

Я побіг dpkg -l | grep cudaі міг побачити обидві версії.

Що мені довелося зробити - це видалити стару CUDA (у моєму випадку версія 9.1) і залишити нову версію в спокої (версія 10.2). Я використовував команду очищення так:

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

Переконайтесь, що імена пакетів відповідають версії, яку ви хочете видалити з інсталяції.

Мені довелося переключитися cmakeз пустого BUILDкаталогу, щоб перенаправити всі #includeбібліотеки та бібліотеки до версії SDK (оскільки старі шляхи були випечені в існуючому середовищі збирання).


-1

Це відбувається тому, що ваша поточна версія CUDA не підтримує поточну версію GCC. Вам потрібно зробити наступне:

  1. Знайдіть підтримувану версію GCC (у моєму випадку 5 для 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. Встановіть підтримувану версію GCC

    sudo apt-get install gcc-5
    sudo apt-get install g++-5
  3. Змініть програмні посилання для GCC у /usr/binкаталозі

    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. Змініть програмні посилання для GCC у /usr/local/cuda-9.0/binкаталозі

    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. Додайте -DCUDA_HOST_COMPILER=/usr/bin/gcc-5до свого setup.pyфайлу, який використовується для компіляції

    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. Видаліть старий каталог збірки

    rm -rd build/
  7. Знову компілюйте, встановивши CUDAHOSTCXX=/usr/bin/gcc-5

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

Примітка. Якщо gcc: error trying to exec 'cc1plus': execvp: no such file or directoryпісля виконання цих кроків ви все одно отримуєте помилку, спробуйте перевстановити GCC таким чином, а потім знову скомпілювати:

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

Кредити: https://github.com/facebookresearch/maskrcnn-benchmark/isissue/25#issuecomment-433382510

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.