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 имеет целую систему в качестве зависимости ...

Fbielejec
источник
4
Для будущих читателей: убедитесь, что вы используете последнюю версию CUDA (если вам не обязательно использовать раннюю версию). NVIDIA увеличивает максимально поддерживаемую версию компилятора почти с каждым выпуском.
einpoklum 03 авг.15,
Это может быть полезно для тех, кто использует CUDA 10 и получает ошибку слишком высокой версии цепочки компилятора gnu: stackoverflow.com/questions/53344283/…
Дуглас Дасеко

Ответы:

114

Как уже отмечалось, nvcc зависит от gcc 4.4. Можно настроить nvcc для использования правильной версии gcc без передачи каких-либо параметров компилятора, добавив программные ссылки в каталог bin, созданный при установке nvcc.

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

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

Героид Мерфи
источник
2
Команда "update-alternatives" также может помочь, особенно при установке CUDA 5.0
phoad
4
Мне также пришлось добавить символическую ссылку на правильную версию g ++.
Auron
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) в CUDA нет поддержки gcc 9.

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

талонмы
источник
Есть идеи, что используется для CUDA 7.5?
GuySoft
2
Я gcc 4.9.3без проблем использую CUDA 7.5 на SLES 11 SP3.
Питер ВАРГА
3
Какой? Как предполагается, что код не будет компилироваться с более высокими версиями (конечно, за исключением жестко заданных ограничений) ? Единственное, о чем я могу думать, это то, что, поскольку в некоторых версиях C11 / C ++ 11 включены по умолчанию, но если это вызывает проблему со старым кодом, это можно легко обойти с помощью переключателя командной строки.
Hi-Angel
2
Второй @ Hi-Angel. #talonmies что вообще означает «ограничение не подлежит обсуждению»? Новые версии gcc и gdb поддерживают старые двоичные заголовки для объектных файлов, поскольку они «всегда» (вроде) имеют, нет причин, по которым новые версии gcc не должны работать. Помимо символьных ссылок, любая другая проблема, скорее всего, связана с установкой флага версии препроцессора ac, и если тест версии gcc «жестко запрограммирован» в каком-то заголовке cuda как часть определения или макроса, это достаточно легко исправить. Исключением может быть сам компилятор cuda gpu.
Beracah
1
Это не вопрос двоичной совместимости. Инструментальная цепочка CUDA требует, чтобы nvcc и интерфейсный парсер графического процессора могли перехватывать и перегружать различные внутренние заголовки компилятора и libc / libc ++ для компиляции кода хоста и устройства и их интеграции. Парсер CUDA, помимо прочего, должен иметь возможность правильно анализировать внутренние заголовки gcc. Непроверенные версии gcc могут терпеть неудачу, независимо от средств защиты препроцессора, встроенных в заголовки NVIDIA. Вы можете либо поверить мне (как человеку, который взламывает инструментарий CUDA почти 10 лет), либо нет. На данный момент я не совсем
talonmies
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 для этой версии 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 .

bryant1410
источник
3
Спасла мне жизнь конфигурация lol кошмар !!!! Спасибо. Я применил это к 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, упомянутый OP: «Я установил инструментарий CUDA, а затем, наконец, SDK». Я пытался выполнить установку с помощью cuda_10.2.89_440.33.01_linux.runмастера NVIDIA , который просто не удался во время выполнения с жалобой на совместимость с gcc. Я закончил тем, что просто решил удалить gcc 9: P
Джош Десмонд,
1
Если вы установили NVCC с помощью [ana | mini] conda (пакет conda-forge 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++
Diego Ferri
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++
Neouyghur
источник
9

Узнайте, как использовать «альтернативы обновления», чтобы обойти эту проблему:

... Если вы устанавливаете gcc 4.6, вы также можете использовать команду update-alternatives, чтобы упростить переключение между версиями. Это можно настроить с помощью:

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

Работал как шарм.

Markroxor
источник
ха-ха, я собирался попытаться связать ваш ответ с другим вопросом здесь, потому что подумал, что его нужно разместить в этой теме. И снова хорошая работа! Спасибо
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

Для Makefile должен быть аналогичный способ. Я не рекомендую устанавливать собственные символические ссылки в / usr / local, если вы не знаете, что делаете.

математика
источник
3

Это работает для Fedora 23. Совместимые репозитории 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

Решение Героида Мерфи работает как шарм. Для меня у меня было два каталога cuda -

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

Программные ссылки нужно было добавить только в каталог, указанный ниже -

/usr/local/cuda 

Кроме того, как упоминал SchighSchagh, требовались программные ссылки как g ++, так и gcc.

Arpwal
источник
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Я успешно установил громаки с поддержкой GPU.
pengchy
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,
Боюсь, я слишком далек от мыслей об этом, чтобы знать, что сказать. Надеюсь, другие могут помочь.
Travelbones
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.

Х40ТИК
источник
куда мы добавляем --std=c++опцию?
asgs 05
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/issues/25#issuecomment-433382510

tsveti_iko
источник