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 ]

97 голосов
/ 01 января 2012

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

47 голосов
/ 08 июля 2011

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

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

30 голосов
/ 23 сентября 2017

Для 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
24 голосов
/ 23 января 2012

Решение 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++
11 голосов
/ 21 апреля 2016

Для 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++
8 голосов
/ 16 апреля 2013

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

... Если вы установите 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
5 голосов
/ 16 января 2014

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

4 голосов
/ 20 июля 2018

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

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

3 голосов
/ 05 декабря 2015

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

2 голосов
/ 13 февраля 2013

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

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

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

/usr/local/cuda 

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

...