Instalación, configuración, pruebas y herramientas
Resumen de cómo instalar el entorno de cuda, herramientas y librerías, configuración del entorno y ejecución de los ejemplos del SDK de NVIDIA.
Instalación de todos los elementos necesarios
Instalando driver
Descargar de la página oficial de Nvidia
Solución:
Poner nouveau en blacklist añadiendo a /etc/modprobe.d/blacklist.conf
blacklist nouveau
Añadir en los parametros del kernel rdblacklist=nouveau editando el fichero /etc/grug.conf
Reiniciar sin entorno gráfico, arrancando en init 3
Cuando arranque el boot editar la entrada poniendo un 3 al final, es la segunda.
Ejecutar sh driver.run el driver bajado de la pagina de nvidia.
Instalando Toolkit
Descargar el Toolkit de la pagina oficial de Nvidia, actualmente están disponibles versión 4.0.
Ejecutar sh toolkit.run
Instaldo en por defecto /usr/local/cuda
Añadir al PATH
PATH + /usr/local/cuda/bin LD_LIBRARY_PATH + /usr/local/cuda/lib64:/usr/local/cuda/lib
Instalando LAPACK
Descargarlo de la página oficial de Nvidia.
Ejecutar sh cula_linux64.run
Instalado por defecto en /usl/local/cula
Añadir al PATH
CULA_ROOT=/usr/local/cula
CULA_INC_PATH=$CULA_ROOT/include
CULA_BIN_PATH_64=$CULA_ROOT/bin
CULA_LIB_PATH_64=$CULA_ROOT/lib64
PATH + $CULA_BIN_PATH_64
LD_LIBRARY_PATH + $CULA_LIB_PATH_64
Instalando ejemplos y SDK
Descargar de la página oficial de Nvidia
Instalado en /usr/local/cuda/NVIDIA_GPU_Computing_SDK
Para tener todo lo necesario en las variables de entorno puedes editar tu .bashrc
export CUDA_ROOT=/usr/local/cuda export CUDA_BIN=$CUDA_ROOT/bin export CUDA_LIB=$CUDA_ROOT/lib64:$CUDA_ROOT/lib export CULA_ROOT=/usr/local/cula export CULA_INC_PATH=$CULA_ROOT/include export CULA_BIN_PATH_64=$CULA_ROOT/bin export CULA_LIB_PATH_64=$CULA_ROOT/lib64 export PATH=$PATH:$CUDA_BIN:$CULA_BIN_PATH_64 export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$CUDA_LIB:$CULA_LIB_PATH_64
Compilando ejemplos
Una buena práctica para comprobar que tenemos todo bien instalado es compilar los ejemplos que nos ofrecen, en el sdk.
Para poder compilar todos los ejemplos es necesario que este instalado openGL.
Nos haremos una copia privada del contenido de la carpeta /usr/local/cuda/NVIDIA_GPU_Computing_SDK
Una vez que tienes la copia en la carpeta C, están todos los ejemplos.
Si tenemos una máquina de 32 bits, valdrá con hacer make pero make x86_64=1 para compilar en versión de 64 bits
El makefile que trae no funciona hay que usar otro en Fedora 14 posible error explicado
Probando el debugger
El Toolkit nos ofrece un debugger llamado cuda-gdb.
Se usa de la misma forma que el gdb.
Para usarlo añadir el flag -G al compilar.
Usando este flag para compilar una aplicación CUDA se fuerza no que no haya optimizaciones -O0. El compilador incluirá información de debugging de todas las variables locales en el ejecutable.
Posible problema:
Si sólo tenemos una trajeta gráfica, la GPU que usamos para cómputo es la misma que se usa para el entorno gráfico. En este caso obtendremos este mensaje al intentar ejecutar la aplicación en el depurardor:
error: All CUDA devices are used for X11 and cannot be used while debugging.
La solución sería para la X y usar en modo texto desde un terminal. Una forma de hacerlo es arrancar la máquina en nivel 3 (init 3: arranca sin entorno gráfico).
Una vez que la maquina está arrancada si intentamos ejecutar algún ejecutable cuda, obtendremos un error que nos idicara que no hay ningún dispositvo cuda.
Por tanto hay que montar el dispositvo, una forma de hacerlo es startx y una vez que esta las X arrancadas tirarlas con control C
Configurando el Visual Profiler
Para poder ejecutar el profiler, tendremos que actualizar nuestra variable LD_LIBRARY_PATH
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:<CudaToolkitDir>/computeprof/bin
Una vez hecho ejecutaremos el profiler con /usr/local/cuda/computeprof/bin/computeprof
Libreria cuPrintf
Existe una librería llamada cuPrintf desarrolada por NVIDIA, la cual permite hacer impresiones desde un kernel.
Ejemplo básico de uso:
#include "cuPrintf.cu" __global__ void testKernel(int val){ cuPrintf("Value is: %d\n", val); } int main(){ cudaPrintfInit(); testKernel<<< 2, 3 >>>(10); cudaPrintfDisplay(stdout, true); cudaPrintfEnd(); return 0; }
Observaciones:
La llamada cuPrintf sólo permite un máximo de 10 párametros y 12 bytes como máximo, de modo que los %s pueden desbordarlo.
La librería sobrecarga la mucho, por lo que afecta mucho al rendimiennto. Usar sólo para depurar.