CUDA несовместима с моей версией gcc

У меня проблемы с компиляцией некоторых примеров, поставляемых с 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 имеет целую систему в качестве зависимости на этом этапе...

22 ответа

Решение

Как уже указывалось, 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

Обновить:

Для CUDA 9:

sudo ln -s /usr/bin/gcc-6 /usr/local/cuda/bin/gcc 
sudo ln -s /usr/bin/g++-6 /usr/local/cuda/bin/g++

Сначала вам нужно установить gcc и g++ 6:

sudo apt install gcc-6 g++-6

Старый ответ:

Для CUDA 8:

sudo ln -s /usr/bin/gcc-5 /usr/local/cuda/bin/gcc 
sudo ln -s /usr/bin/g++-5 /usr/local/cuda/bin/g++

Сначала вам нужно установить gcc и g++ 5:

sudo apt install gcc-5 g++-5

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) нет поддержки gcc 8 в CUDA.

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

Решение 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++

При использовании cmake для меня ни один из способов редактирования файлов и компоновки не сработал, поэтому я скомпилировал с помощью флагов, которые указывают версию gcc/g++.
cmake -DCMAKE_C_COMPILER=gcc-6 -DCMAKE_CXX_COMPILER=g++-6 ..

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

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

... Если вы устанавливаете 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

Для 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++

В большинстве дистрибутивов у вас есть возможность установить другую версию 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, если вы не знаете, что делаете.

Это работает для 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.

Мне пришлось установить более старые версии 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++

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

CUDA после некоторых модификаций заголовка совместим с gcc4.7 и, возможно, более поздней версией: https://www.udacity.com/wiki/cs344/troubleshoot_gcc47

Другой способ настройки 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, но это было решение, которое работало лучше всего для меня.

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

Если вы столкнулись с этой ошибкой, прочтите файл журнала:

$ 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 вариант.

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

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

Мягкие ссылки должны были быть добавлены только в каталог, упомянутый ниже -

/usr/local/cuda 

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

Для CUDA 6.5 (и, по всей видимости, 7.0 и 7.5) я создал версию RPM-пакета gcc 4.8.5 (в Fedora Core 30), которая позволяет установить эту версию gcc вместе с текущим GCC вашей системы.

Вы можете найти всю эту информацию здесь.

Чтобы скомпилировать примеры 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

Преимущество этого состоит в том, что вы не модифицируете всю систему и не создаете символические ссылки только на двоичные файлы (это может вызвать проблемы со связыванием библиотек).

Это решило мою проблему:

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

В моем случае у меня уже был установлен 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 (поскольку старые пути были запечены в существующей среде сборки).

Это происходит потому, что ваша текущая версия 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

в #debian (должно быть то же самое в #ubuntu):

      $ apt show nvidia-cuda-toolkit
Package: nvidia-cuda-toolkit
Version: 11.8.89~11.8.0-5~deb12u1
[...]

$ dpkg -S nvidia-cuda-toolkit | grep "bin/g"
nvidia-cuda-toolkit: /usr/lib/nvidia-cuda-toolkit/bin/gcc
nvidia-cuda-toolkit: /usr/lib/nvidia-cuda-toolkit/bin/g++

$ gcc -v
[...] 
gcc version 12.2.0 (Debian 12.2.0-14)

$ /usr/lib/nvidia-cuda-toolkit/bin/gcc -v
[...] 
gcc version 11.3.0 (Debian 11.3.0-12)

пакет nvidia-cuda-toolkit предоставляет собственный компилятор gcc

поэтому я только что добавил в свой cmake:

      -D CMAKE_C_COMPILER="/usr/lib/nvidia-cuda-toolkit/bin/gcc" \
-D CMAKE_CXX_COMPILER="/usr/lib/nvidia-cuda-toolkit/bin/g++" 

И все прошло нормально, компиляция

Другие вопросы по тегам