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

76
08 июля '11 в 12:25
источник поделиться
17 ответов

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

94
01 янв. '12 в 16:47
источник

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.

43
08 июля '11 в 12:51
источник

Для CUDA 10:

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
25
23 сент. '17 в 17:23
источник

Решение 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++
23
23 янв. '12 в 12:40
источник

Для 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++
10
21 апр. '16 в 17:20
источник

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

... Если вы установите 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
16 апр. '13 в 3:23
источник

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

5
16 янв. '14 в 15:17
источник

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

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

3
20 июля '18 в 14:00
источник

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

3
05 дек. '15 в 1:26
источник

Мне пришлось установить более старые версии 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++
2
18 нояб. '14 в 19:52
источник

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

2
23 мая '13 в 16:35
источник

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

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

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

/usr/local/cuda 

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

2
13 февр. '13 в 10:44
источник

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

2
31 марта '13 в 6:59
источник

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

1
29 июля '13 в 3:30
источник

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

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

0
26 марта '17 в 16:04
источник

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

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
14 февр. '19 в 9:13
источник

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

0
13 сент. '16 в 23:29
источник

Посмотрите другие вопросы по меткам или Задайте вопрос