Pregunta CUDA incompatible con mi versión de gcc


Tengo problemas para compilar algunos de los ejemplos enviados con CUDA SDK. He instalado el controlador de los desarrolladores (versión 270.41.19) y el kit de herramientas CUDA, luego, finalmente, el SDK (la versión 4.0.17).

Inicialmente no compiló en absoluto dando:

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

Encontré la línea responsable en 81: /usr/local/cuda/include/host_config.h y la cambié a:

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

a partir de ese momento obtuve solo algunos de los ejemplos para compilar, se detiene con:

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 se compilan algunos ejemplos, creo que esto no es un problema de controlador, sino que debe tener algo que ver con una versión de gcc no compatible. La degradación no es una opción ya que gcc4.6 tiene un sistema completo como dependencia en este punto ...


73
2017-07-08 09:25


origen


Respuestas:


Como ya se señaló, nvcc depende de gcc 4.4. Es posible configurar nvcc para usar la versión correcta de gcc sin pasar ningún parámetro del compilador añadiendo softlinks al directorio bin creado con la instalación de nvcc.

El directorio binario predeterminado de cuda (el valor predeterminado de instalación) es / usr / local / cuda / bin, y es suficiente con agregar un enlace a la versión correcta de gcc desde este directorio:

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


88
2018-01-01 13:47



gcc 4.5 y 4.6 no son compatibles con CUDA: el código no se compilará y el resto de la cadena de herramientas, incluido cuda-gdb, no funcionará correctamente. No puede usarlos, y la restricción no es negociable.

Su única solución es instalar una versión de gcc 4.4 como segundo compilador (la mayoría de las distribuciones lo permitirán). Hay una opción para nvcc --compiler-bindir que se puede usar para apuntar a un compilador alternativo. Cree un directorio local y luego cree enlaces simbólicos a los ejecutables de la versión compatible con gcc. Pase ese directorio local a nvcc a través del --compiler-bindir opción, y usted debería ser capaz de compilar código CUDA sin afectar el resto de su sistema.


EDITAR:

Tenga en cuenta que esta pregunta y respuesta pertenecen a CUDA 4. Desde su creación, NVIDIA ha seguido ampliando el soporte para versiones posteriores de gcc en la versión más reciente de CUDA Toolchain.

  • A partir de la versión CUDA 4.1, ahora se admite gcc 4.5. gcc 4.6 y 4.7 no son compatibles.
  • A partir de la versión CUDA 5.0, ahora se admite gcc 4.6. gcc 4.7 no es compatible.
  • A partir de la versión CUDA 6.0, gcc 4.7 ahora es compatible.
  • A partir de la versión CUDA 7.0, gcc 4.8 es totalmente compatible, con soporte 4.9 en Ubuntu 14.04 y Fedora 21.
  • A partir de la versión CUDA 7.5, gcc 4.8 es totalmente compatible, con soporte 4.9 en Ubuntu 14.04 y Fedora 21.
  • A partir de la versión CUDA 8, gcc 5.3 es totalmente compatible con Ubuntu 16.06 y Fedora 23.
  • A partir de la versión CUDA 9, gcc 6 es totalmente compatible con Ubuntu 16.04, Ubuntu 17.04 y Fedora 25.
  • La versión CUDA 9.2 agrega soporte para gcc 7

En la actualidad, (a partir de CUDA 9) no hay compatibilidad gcc 8 en CUDA.

Tenga en cuenta que NVIDIA ha agregado recientemente una tabla muy útil aquí que contiene el compilador compatible y la matriz del sistema operativo para la versión actual de CUDA.


41
2017-07-08 09:51



La solución de Gearoid Murphy funciona mejor para mí ya que en mi distribución (Ubuntu 11.10), gcc-4.4 y gcc-4.6 están en el mismo directorio, por lo que --compiler-bindir no es de ayuda. La única advertencia es que también tuve que instalar g ++ - 4.4 y también hacer un enlace simbólico:

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

23
2018-01-23 09:40



Actualizar:

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

Primero debe tener gcc y g ++ 6 instalados:

sudo apt install gcc-6 g++-6

Respuesta anterior:

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

Primero debe tener gcc y g ++ 5 instalados:

sudo apt install gcc-5 g++-5

15
2017-09-23 14:23



Para CUDA7.5 estas líneas funcionan:

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

10
2018-04-21 14:20



Revisa cómo usar "update-alternatives" para evitar este problema:

... Si instala gcc 4.6 también puede usar las actualizaciones-alternativas   comando para permitir cambiar fácilmente entre versiones. Esto puede ser   configurado con:

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

6
2018-04-16 00:23



En la mayoría de las distribuciones tiene la posibilidad de instalar otra versión de gcc y g ++ junto a un compilador más reciente como gcc-4.7. Además, la mayoría de los sistemas de construcción son conscientes de la CC y CXX variables de entorno, que permiten especificar otros compiladores de C y C ++, respectivamente. SO sugiero algo como:

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

Para Makefiles debería haber una manera similar. No recomiendo establecer enlaces simbólicos personalizados en / usr / local a menos que sepa lo que está haciendo.


4
2018-01-16 12:17



Esto funciona para fedora 23. Los repositorios de compat gcc serán ligeramente diferentes en función de su versión de fedora.

Si instala los siguientes repositorios:

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

Ahora haga los enlaces suaves como se mencionó anteriormente suponiendo que su carpeta cuda bin está en /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++

Ahora debería poder compilar con nvcc sin el error de versión de gcc.


3
2017-12-04 22:26