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

16 ответов


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


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

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


редактировать:

обратите внимание, что этот вопрос и ответ относятся к CUDA 4. Поскольку это было написано, NVIDIA продолжала расширять поддержку более поздних версий gcc в более новой версии CUDA toolchain

  • по состоянию на выпуск 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.
  • As из выпуска 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 9) нет поддержки 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++

обновление:

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

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

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


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

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

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

/usr/local/cuda 

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


другой способ настройки nvcc для использования определенной версии gcc (gcc-4.4, например) - изменить nvcc.профиль и alter путь чтобы включить путь к 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.профиль варьируется, но он должен быть в том же каталоге, что и nvcc сам исполняемый файл.

Это немного взломать, как nvcc.профиль не предназначен для конфигурации пользователя в соответствии с руководством nvcc, но это было решение, которое лучше всего работало для меня.


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


мне пришлось установить более старые версии 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 для меня ни один из хаков редактирования файлов и ссылок не работал, поэтому я скомпилировал с помощью флагов, которые указывают версию gcc/g++.
cmake -DCMAKE_C_COMPILER=gcc-6 -DCMAKE_CXX_COMPILER=g++-6 ..

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


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


на $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

или

--std=c++11 для CUDA>=7.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+)/.*][]'`
# 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

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