Eu tenho problemas para compilar alguns dos exemplos fornecidos com CUDA SDK. Instalei o driver de desenvolvedores (versão 270.41.19) e o kit de ferramentas CUDA e, finalmente, o SDK (ambos na versão 4.0.17).
Inicialmente, ele não compilou, dando:
error -- unsupported GNU version! gcc 4.5 and up are not supported!
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)
daquele ponto em diante, tenho apenas alguns dos 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 compilam, acho que este não é um problema de driver, mas deve ter algo a ver com uma versão do gcc não suportada. O downgrade não é uma opção, pois o gcc4.6 tem um sistema inteiro como uma dependência neste ponto ...
Respostas:
Como já apontado, 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 cuda padrão (o padrão de instalação) é / usr / local / cuda / bin, adicionar um softlink para a versão correta do gcc a partir deste diretório é suficiente:
sudo ln -s /usr/bin/gcc-4.4 /usr/local/cuda/bin/gcc
fonte
nvcc
invocações trabalhar, mas dizem que, aplicando-semake
às amostras CUDA, logo traz invocações começando com:nvcc -ccbin g++
. Para mim eu useisudo ln -s /usr/bin/gcc-4.9 /usr/local/cuda/bin/gcc
esudo ln -s /usr/bin/g++-4.9 /usr/local/cuda/bin/g++
.cmake .. && make
você pode tentarcmake -D CUDA_NVCC_FLAGS="-ccbin gcc-4.4" .. && make
. Se você usar simples,Makefile
pode tentarmake CXX=g++-4.4 CC=gcc-4.4
.gcc 4.5 e 4.6 não são suportados com CUDA - o código não compilará e o resto da cadeia de ferramentas, incluindo 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 um segundo compilador (a maioria das distribuições permite 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 faça links simbólicos para os executáveis da versão gcc com suporte. Passe esse diretório local para nvcc por meio da--compiler-bindir
opção e você poderá compilar o código CUDA sem afetar o resto do seu sistema.EDITAR :
Observe que esta pergunta e resposta referem-se a CUDA 4.
Desde que foi escrito, a NVIDIA continuou a expandir o suporte para versões posteriores do gcc na versão mais recente do conjunto de ferramentas CUDA
Atualmente (a partir do CUDA 10.1) não há suporte para gcc 9 no CUDA.
Observe que a NVIDIA adicionou recentemente uma tabela muito útil aqui, que contém o compilador compatível e a matriz do sistema operacional para a versão CUDA atual.
fonte
gcc 4.9.3
no SLES 11 SP3 sem nenhum problema.Verifique a versão GCC máxima suportada para sua versão CUDA:
Defina um env var para essa versão do GCC. Por exemplo, para CUDA 10.2:
Certifique-se de ter essa versão instalada:
Adicione links simbólicos nas pastas CUDA:
(ou substitua
/usr/local/cuda
pelo caminho de instalação do CUDA, se não estiver lá)Consulte esta gist GitHub para obter mais informações sobre a tabela de compatibilidade CUDA-GCC .
fonte
/usr/bin/gcc
e/usr/bin/g++
ou/usr/local/cuda/bin/gcc
sozinho?cuda_10.2.89_440.33.01_linux.run
wizard da NVIDIA , que simplesmente falhou no tempo de execução com uma reclamação sobre compatibilidade do gcc. Acabei decidindo desinstalar o gcc 9: Pcudatoolkit-dev
), então você precisa conectar dentro do seu ambienteln -s /usr/bin/gcc-8 /home/user/miniconda3/envs/your_env/bin/gcc
eln -s /usr/bin/g++-8 /home/user/miniconda3/envs/your_env/bin/g++
A solução de Gearoid Murphy funciona melhor para mim, já que na minha distro (Ubuntu 11.10), gcc-4.4 e 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:
fonte
Para CUDA7.5 estas linhas funcionam:
fonte
Veja como usar "alternativas de atualização" para contornar esse problema:
fonte
Se estiver usando
cmake
para mim, nenhum dos hacks de edição de arquivos e vinculação funcionou, então compilei usando os sinalizadores que especificam a versão gcc / g ++.cmake -DCMAKE_C_COMPILER=gcc-6 -DCMAKE_CXX_COMPILER=g++-6 ..
Funcionou como charme.
fonte
Na maioria das distribuições, você tem a possibilidade de instalar outra versão do gcc e g ++ ao lado do compilador mais recente como o gcc-4.7. Além disso, a maioria dos sistemas de construção está ciente das variáveis de ambiente
CC
eCXX
, que permitem especificar outros compiladores C e C ++, respectivamente. Portanto, sugiro algo como:Para Makefiles, deve haver uma maneira semelhante. Eu não recomendo definir links simbólicos personalizados em / usr / local a menos que você saiba o que está fazendo.
fonte
Isso funciona para o fedora 23. Os repositórios compat gcc serão ligeiramente diferentes com base na sua versão do fedora.
Se você instalar os seguintes repositórios:
Agora faça os links virtuais conforme mencionado acima, assumindo que sua pasta cuda bin está
/usr/local/cuda/
Agora você deve ser capaz de compilar
nvcc
sem o erro de versão do gcc.fonte
A solução de Gearoid Murphy funciona perfeitamente. Para mim, eu tinha dois diretórios para cuda -
Os links virtuais tiveram que ser adicionados apenas ao diretório mencionado abaixo -
Além disso, ambos os soft links g ++ e gcc foram necessários conforme mencionado por SchighSchagh.
fonte
Outra maneira de configurar o nvcc para usar uma versão específica do gcc (gcc-4.4, por exemplo) é editar nvcc.profile e alterar o PATH para incluir o caminho para o gcc que você deseja usar primeiro.
Por exemplo (gcc-4.4.6 instalado em / opt):
A localização de nvcc.profile varia, mas deve estar no mesmo diretório que o próprio executável nvcc .
Isso é um pouco um hack, já que nvcc.profile não se destina à configuração do usuário conforme o manual do nvcc, mas foi a solução que funcionou melhor para mim.
fonte
mkdir /usr/local/bin/cuda-hack && ln -s /usr/bin/g++-5 /usr/local/bin/cuda-hack
CUDA é após algumas modificações de cabeçalho compatíveis com gcc4.7 e talvez uma versão superior: https://www.udacity.com/wiki/cs344/troubleshoot_gcc47
fonte
Para pessoas como eu, que ficam confusas durante o uso
cmake
, oFindCUDA.cmake
script substitui algumas das coisas donvcc.profile
. Você pode especificar onvcc
compilador de host configurandoCUDA_HOST_COMPILER
conforme http://public.kitware.com/Bug/view.php?id=13674 .fonte
cmake .. -DCMAKE_INSTALL_PREFIX=/InstallPos_GPU/ -DCMAKE_C_COMPILER="/gcc-8.3.0/bin/gcc" -DCMAKE_CXX_COMPILER="/gcc-8.3.0/bin/g++" -DGMX_GPU=ON -DCUDA_TOOLKIT_ROOT_DIR=/cuda-7.5/ -D NVCCFLAGS=" -ccbin /cuda-7.5/bin/" -DCUDA_HOST_COMPILER=/cuda-7.5/bin/gcc
Eu instalei com sucesso o gromacs com suporte para GPU.Tive que instalar as versões anteriores do gcc, g ++.
Verifique se gcc-4.4 está em / usr / bin / e o mesmo para g ++. Então, eu poderia usar a solução acima:
fonte
Em
$CUDA_HOME/include/host_config.h
, encontre linhas como estas (podem variar ligeiramente entre as diferentes versões do CUDA):Remova ou altere-os de acordo com sua condição.
Observe que este método é potencialmente inseguro e pode interromper sua construção. Por exemplo, o gcc 5 usa C ++ 11 como padrão, entretanto este não é o caso do nvcc a partir do CUDA 7.5. Uma solução alternativa é adicionar
--Xcompiler="--std=c++98"
para CUDA <= 6,5ou
--std=c++11
para CUDA> = 7,0.fonte
--std=c++
opção?Se você encontrar esse erro, leia o arquivo de log:
Basta seguir a sugestão do arquivo de log:
Tarefa concluída :)
Acabei de instalar o CUDA 10.2 com gcc 9.2 no Kubuntu 19.10 usando a
--override
opção.fonte
Para compilar os exemplos do CUDA 8.0 no Ubuntu 16.10, eu fiz:
Isso tem a vantagem de não modificar todo o sistema ou criar links simbólicos apenas para os binários (o que pode causar problemas de vinculação de bibliotecas).
fonte
Isso resolveu meu problema:
fonte
Para CUDA 6.5 (e aparentemente 7.0 e 7.5), criei uma versão do pacote gcc 4.8.5 RPM (no Fedora Core 30) que permite que essa versão do gcc seja instalada junto com o GCC atual do seu sistema.
Você pode encontrar todas essas informações aqui .
fonte
No meu caso, eu já tinha o CUDA instalado a partir da versão Ubuntu e o cmake detectaria esse em vez da versão recém-instalada usando o NVidia SDK Manager.
Eu corri
dpkg -l | grep cuda
e pude ver as duas versões.O que eu tive que fazer é desinstalar o CUDA antigo (versão 9.1 no meu caso) e deixar a nova versão (versão 10.2). Usei o comando purge assim:
Verifique se os nomes dos pacotes correspondem à versão que você deseja remover da instalação.
Tive que executar novamente a
cmake
partir de umBUILD
diretório em branco para redirecionar todas as#include
bibliotecas e para a versão do SDK (já que os caminhos antigos foram criados no ambiente de construção existente).fonte
Isso está acontecendo porque sua versão CUDA atual não suporta sua versão GCC atual. Você precisa fazer o seguinte:
Encontre a versão GCC compatível (no meu caso 5 para CUDA 9)
Instale a versão GCC compatível
Altere os softlinks para GCC no
/usr/bin
diretórioAltere os softlinks para GCC no
/usr/local/cuda-9.0/bin
diretórioAdicione
-DCUDA_HOST_COMPILER=/usr/bin/gcc-5
ao seusetup.py
arquivo, usado para compilaçãoRemova o diretório de construção antigo
Compile novamente definindo
CUDAHOSTCXX=/usr/bin/gcc-5
Observação: se você ainda receber o
gcc: error trying to exec 'cc1plus': execvp: no such file or directory
erro após seguir essas etapas, tente reinstalar o GCC desta forma e compilar novamente:Créditos: https://github.com/facebookresearch/maskrcnn-benchmark/issues/25#issuecomment-433382510
fonte