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 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. Downgrading не является вариантом, так как gcc4.6 имеет целую систему в качестве зависимости на данный момент...

Ответ 1

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

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

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

Ответ 2

GCC 4.5 и 4.6 не поддерживаются с CUDA - код не будет компилироваться, а остальная часть набора инструментов, включая cuda-gdb, не будет работать должным образом. Вы не можете использовать их, и ограничение не подлежит обсуждению.

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


EDIT:

Обратите внимание, что этот вопрос и ответ относятся к 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.

Ответ 3

Для CUDA 10.1:

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

Сначала необходимо установить gcc и g++ 8:

sudo apt install gcc-8 g++-8

Для CUDA 10.0:

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

Сначала необходимо установить gcc и g++ 7:

sudo apt install gcc-7 g++-7

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

Ответ 4

Решение Gearoid Murphy работает лучше для меня, так как на моем дистрибутиве (Ubuntu 11.10) gcc-4.4 и gcc-4.6 находятся в одном каталоге, поэтому -compiler-bindir не помогает. Единственное предостережение - мне также пришлось установить g++ - 4.4 и symlink также:

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

Ответ 5

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

Ответ 6

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

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

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

Ответ 7

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

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

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

Ответ 8

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

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

Ответ 9

Это работает для fedora 23. Хранилища gcc 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.

Ответ 10

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

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

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

/usr/local/cuda 

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

Ответ 11

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

Ответ 13

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

Ответ 14

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

Ответ 15

В $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 использует С++ 11 по умолчанию, однако это не относится к nvcc с CUDA 7.5. Обходным путем является добавление

--Xcompiler="--std=c++98" для CUDA <= 6.5

или

--std=c++11 для CUDA >= 7.0.

Ответ 16

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

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

Ответ 17

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

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