CUDA несовместима с моей версией gcc - PullRequest
80 голосов
/ 08 июля 2011

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

Ответы [ 17 ]

2 голосов
/ 31 марта 2013

Другим способом настройки 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 голосов
/ 18 ноября 2014

Мне пришлось установить более старые версии 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 голосов
/ 23 мая 2013

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

2 голосов
/ 29 июля 2013

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

0 голосов
/ 14 февраля 2019

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

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 голосов
/ 26 марта 2017

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

В $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 </p>

или

--std=c++11 для CUDA> = 7,0.

...