CUDA incompatible con mi versión de gcc

Tengo problemas para comstackr 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, y finalmente el SDK (ambos 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 comstackr, 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 comstackn 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 …

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

gcc 4.5 y 4.6 no son compatibles con CUDA: el código no se comstackrá y el rest 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 un segundo comstackdor (la mayoría de las distribuciones lo permitirán). Existe una opción para nvcc --compiler-bindir que se puede usar para apuntar a un comstackdor 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 de la opción --compiler-bindir , y usted debería poder comstackr el código CUDA sin afectar el rest 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 que contiene el comstackdor compatible y la matriz del sistema operativo para la versión actual de CUDA.

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

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 

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

Consulte cómo usar “update-alternatives” para evitar este problema:

… Si instala gcc 4.6 también puede usar el comando update-alternatives para permitir cambiar fácilmente entre versiones. Esto se puede configurar 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 

En la mayoría de las distribuciones tiene la posibilidad de instalar otra versión de gcc y g ++ junto a un comstackdor más reciente como gcc-4.7. Además, la mayoría de los sistemas de comstackción conocen las variables de entorno CC y CXX , que permiten especificar otros comstackdores 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.

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

Si instala los siguientes 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 

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 comstackr con nvcc sin el error de versión de gcc.

La solución de Gearoid Murphy funciona como un encanto. Para mí tenía dos directorios para cuda –

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

Los enlaces suaves deben agregarse solo al directorio mencionado a continuación:

 /usr/local/cuda 

Además, se requirieron enlaces blandos g ++ y gcc como menciona SchighSchagh.

Otra forma de configurar nvcc para usar una versión específica de gcc (gcc-4.4, por ejemplo) es editar nvcc.profile y modificar PATH para incluir primero la ruta al gcc que desea usar.

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

La ubicación de nvcc.profile varía, pero debe estar en el mismo directorio que el ejecutable nvcc .

Esto es un poco complicado , ya que nvcc.profile no está diseñado para la configuración del usuario según el manual nvcc, pero fue la solución que mejor funcionó para mí.

CUDA busca algunas modificaciones en el encabezado compatibles con gcc4.7 y quizás una versión superior: https://www.udacity.com/wiki/cs344/troubleshoot_gcc47

Tuve que instalar las versiones anteriores de gcc, g ++.

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

Verifique que gcc-4.4 esté en / usr / bin / y lo mismo para g ++ Entonces podría usar la solución anterior:

  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 personas como yo que se confunden al utilizar cmake , el script FindCUDA.cmake anula algunas de las cosas de nvcc.profile . Puede especificar el comstackdor de host CUDA_HOST_COMPILER configurando CUDA_HOST_COMPILER según http://public.kitware.com/Bug/view.php?id=13674 .

Si uso cmake para mí ninguno de los hacks de edición de archivos y enlaces funcionó, así que compilé usando los indicadores que especifican la versión de gcc / g ++.
cmake -DCMAKE_C_COMPILER=gcc-6 -DCMAKE_CXX_COMPILER=g++-6 ..

Funcionó como el encanto.

En $CUDA_HOME/include/host_config.h , busque líneas como estas (puede variar ligeramente entre las diferentes versiones 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) <] //... 

Quítelos o cámbielos de acuerdo con su condición.

Tenga en cuenta que este método es potencialmente inseguro y puede romper su construcción. Por ejemplo, gcc 5 usa C ++ 11 como predeterminado, sin embargo, este no es el caso para nvcc a partir de CUDA 7.5. Una solución es agregar

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

o

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

Para comstackr los ejemplos de CUDA 8.0 en Ubuntu 16.10, hice:

 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 

Esto tiene la ventaja de no modificar todo el sistema o hacer enlaces simbólicos solo a los binarios (que podrían causar problemas de vinculación de bibliotecas).