CUDA incompatível com a minha versão do gcc

Eu tenho problemas para compilar alguns dos exemplos fornecidos com o CUDA SDK. Eu instalei o driver de desenvolvedores (versão 270.41.19) e o kit de ferramentas CUDA, e finalmente o SDK (a versão 4.0.17).

Inicialmente não compilou nada:

error -- unsupported GNU version! gcc 4.5 and up are not supported! 

Eu encontrei a linha responsável em 81: /usr/local/cuda/include/host_config.h e mudei para:

 //#if __GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ > 4) #if __GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ > 6) 

a partir desse ponto, eu tenho apenas alguns exemplos para compilar, ele pára com:

 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 

Como alguns dos exemplos compilados, eu acho que isso não é um problema de driver, mas deve ter algo a ver com uma versão do gcc sem suporte. O downgrade não é uma opção, já que o gcc4.6 tem um sistema inteiro como uma dependência neste momento …

Como já foi dito, o nvcc depende do gcc 4.4. É possível configurar o nvcc para usar a versão correta do gcc sem passar nenhum parâmetro do compilador adicionando softlinks ao diretório bin criado com a instalação do nvcc.

O diretório binário padrão do cuda (o padrão de instalação) é / usr / local / cuda / bin, bastando adicionar um link para a versão correta do gcc deste diretório:

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

O gcc 4.5 e 4.6 não são suportados com o CUDA – o código não será compilado e o restante do conjunto de ferramentas, incluindo o cuda-gdb, não funcionará corretamente. Você não pode usá-los e a restrição não é negociável.

Sua única solução é instalar uma versão do gcc 4.4 como segundo compilador (a maioria das distribuições permitirá isso). Existe uma opção para nvcc --compiler-bindir que pode ser usada para apontar para um compilador alternativo. Crie um diretório local e, em seguida, crie links simbólicos para os executáveis ​​suportados pela versão gcc. Passe o diretório local para nvcc por meio da opção --compiler-bindir e você poderá compilar o código CUDA sem afetar o restante do sistema.


EDITAR :

Note que esta questão, e a resposta, pertencem ao CUDA 4. Desde que foi escrito, a NVIDIA continuou a expandir o suporte para versões posteriores do gcc no mais recente lançamento de toolchain CUDA

  • A partir do lançamento do CUDA 4.1, o gcc 4.5 é agora suportado. gcc 4.6 e 4.7 não são suportados.
  • A partir do lançamento do CUDA 5.0, o gcc 4.6 é agora suportado. O gcc 4.7 não é suportado.
  • A partir do lançamento do CUDA 6.0, o gcc 4.7 é agora suportado.
  • A partir do lançamento do CUDA 7.0, o gcc 4.8 é totalmente suportado, com suporte a 4.9 no Ubuntu 14.04 e no Fedora 21.
  • A partir do lançamento do CUDA 7.5, o gcc 4.8 é totalmente suportado, com suporte a 4.9 no Ubuntu 14.04 e no Fedora 21.
  • A partir do lançamento do CUDA 8, o gcc 5.3 é totalmente suportado no Ubuntu 16.06 e no Fedora 23.
  • A partir do lançamento do CUDA 9, o gcc 6 é totalmente suportado no Ubuntu 16.04, Ubuntu 17.04 e Fedora 25.
  • A versão CUDA 9.2 adiciona suporte para o gcc 7

Atualmente, (a partir de CUDA 9) não há suporte para o gcc 8 no CUDA.

Observe que a NVIDIA recentemente adicionou uma tabela muito útil aqui que contém o compilador suportado e a matriz OS para a versão atual do CUDA.

A solução do Gearoid Murphy funciona melhor para mim já que na minha distro (Ubuntu 11.10), o gcc-4.4 e o gcc-4.6 estão no mesmo diretório, então –compiler-bindir não ajuda. A única ressalva é que eu também tive que instalar o g ++ – 4.4 e criar um link simbólico também:

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

Atualizar:

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

Você precisa ter o gcc e o g ++ 6 instalados primeiro:

 sudo apt install gcc-6 g++-6 

Resposta antiga:

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

Você precisa ter o gcc e g ++ 5 instalado primeiro:

 sudo apt install gcc-5 g++-5 

Para CUDA7.5 estas linhas funcionam:

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

Veja como usar “update-alternatives” para contornar este problema:

… Se você instalar o gcc 4.6, você também pode usar o comando update-alternatives para permitir a troca fácil entre as versões. Isso pode ser configurado com:

 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 

Na maioria das distribuições você tem a possibilidade de instalar outra versão gcc e g ++ ao lado de um compilador mais recente como o gcc-4.7. Além disso, a maioria dos sistemas de compilation está ciente das variables ​​de ambiente CC e CXX , que permitem especificar outros compiladores C e C ++, respectivamente. Então eu sugiro algo como:

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

Para Makefiles, deve haver um caminho semelhante. Não recomendo configurar links simbólicos personalizados em / usr / local, a menos que você saiba o que está fazendo.

Isto funciona para o fedora 23. Os repositorys compat do gcc serão ligeiramente diferentes com base na sua versão do fedora.

Se você instalar os seguintes repositorys:

 sudo yum install compat-gcc-34-c++-3.4.6-37.fc23.x86_64 compat-gcc-34-3.4.6-37.fc23.x86_64 

Agora faça os links como mencionado acima, supondo que sua pasta cuda bin esteja em /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++ 

Agora você deve poder compilar com o nvcc sem o erro da versão do gcc.

A solução do Gearoid Murphy funciona como um encanto. Para mim eu tinha dois diretórios para cuda –

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

Os links de software tinham que ser adicionados apenas ao diretório mencionado abaixo –

 /usr/local/cuda 

Além disso, ambos os soft links g ++ e gcc foram necessários, como mencionado por SchighSchagh.

Outra forma de configurar o nvcc para usar uma versão específica do gcc (gcc-4.4, por exemplo), é editar o nvcc.profile e alterar o PATH para include o caminho para o gcc que você deseja usar primeiro.

Por exemplo (gcc-4.4.6 instalado em / 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_): 

A localização do nvcc.profile varia, mas deve estar no mesmo diretório que o próprio executável do nvcc .

Isso é um pouco complicado , já que o nvcc.profile não é destinado à configuração do usuário de acordo com o manual do nvcc, mas foi a solução que funcionou melhor para mim.

CUDA é depois de algumas modificações de header compatíveis com gcc4.7 e talvez versão superior: https://www.udacity.com/wiki/cs344/troubleshoot_gcc47

Eu tive que instalar as versões mais antigas do gcc, g ++.

  sudo apt-get install gcc-4.4 sudo apt-get install g++-4.4 

Verifique se o gcc-4.4 está em / usr / bin /, e o mesmo para g ++ Então eu poderia usar a solução acima:

  sudo ln -s /usr/bin/gcc-4.4 /opt/cuda/bin/gcc sudo ln -s /usr/bin/g++-4.4 /opt/cuda/bin/g++ 

Para pessoas como eu que se confundem ao usar o cmake , o script FindCUDA.cmake substitui algumas das coisas do nvcc.profile . Você pode especificar o compilador de host CUDA_HOST_COMPILER definindo CUDA_HOST_COMPILER conforme http://public.kitware.com/Bug/view.php?id=13674 .

Se usar o cmake para mim, nenhum dos hacks de edição dos arquivos e links funcionou, então eu compilei usando os flags que especificam a versão gcc / g ++.
cmake -DCMAKE_C_COMPILER=gcc-6 -DCMAKE_CXX_COMPILER=g++-6 ..

Trabalhou como charme.

Em $CUDA_HOME/include/host_config.h , encontre linhas como estas (podem variar ligeiramente entre diferentes versões de 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) <] //... 

Remova ou altere-os de acordo com sua condição.

Observe que esse método é potencialmente inseguro e pode quebrar sua compilation. Por exemplo, o gcc 5 usa o C ++ 11 como padrão, no entanto, este não é o caso do nvcc a partir do CUDA 7.5. Uma solução é adicionar

--Xcompiler="--std=c++98" para CUDA <= 6.5

ou

--std=c++11 para CUDA> = 7.0.

Para compilar os exemplos CUDA 8.0 no Ubuntu 16.10, eu fiz:

 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 

Isso tem a vantagem de não modificar todo o sistema ou criar links simbólicos apenas para os binários (isso pode causar problemas de vinculação de bibliotecas).