CUDA es una plataforma de computación paralela y un modelo de programación inventado por NVIDIA. Permite grandes aumentos en el rendimiento de la velocidad de computo al aprovechar la potencia de la unidad de procesamiento de gráficos (GPU).

En esta guía veremos como instalar CUDA en Debian 8 (jessie) que cuentan con la tecnología Nvidia Optimus, presentes principalmente en Notebooks.

Instalación de Drivers

Esta guía se basa en esta primera parte en la que desarrolle hace un tiempo sobre la instalación de los drivers Nvidia Optimus, sin embargo tiene sus matices ya que la versión requerida por los CUDA 7.5 es muy superior a la que dispone Debian por medio de los repositorios convencionales, por lo que debemos hacer lo siguiente:

Reiniciamos y en cuanto se cargue tu sistema presionamos:

Ctrl + Alt + F2 

Ampliaremos los repositorios que usamos ejecutando lo siguiente en una terminal:

sudo nano /etc/apt/sources.list

Agregamos al final del documento:

# jessie-backports
deb http://ftp.debian.org/debian jessie-backports main contrib non-free

Lo que denominamos como backports de Debian no es más que un simple repositorio que añadimos a nuestro sistema operativo.

Este repositorio contiene paquetes y programas que provienen de la rama testing de Debian y que han sido recompilados y adaptados para poderse instalar y usar en la rama estable.

Actualizamos el sistema (no se preocupen, los paquetes no se actualizan automáticamente desde los repositorios Backports):

apt-get update && apt-get upgrade && apt-get dist-upgrade

Eliminamos los drivers por defecto de nvidia y controladores de video.

sudo apt-get remove --purge nvidia-* xserver-xorg-video-nouveau xserver-xorg-video-intel

Instalamos todo lo necesario:

sudo apt-get -t jessie-backports install bumblebee-nvidia primus xserver-xorg-video-intel libtxc-dxtn-s2tc0 libtxc-dxtn-s2tc-bin nvidia-cg-toolkit mesa-utils mesa-utils-extra libegl1-mesa libegl1-mesa-drivers libgl1-mesa-dri libglapi-mesa libgles1-mesa libgles2-mesa libglu1-mesa libopenvg1-mesa mesa-vdpau-drivers libtxc-dxtn-s2tc0 libtxc-dxtn-s2tc-bin uuid-runtime

Editamos el archivo de configuración bumblebee, ya que así sabe que estamos utilizando el controlador de NVIDIA. Cambiams el valor de "Driver=" a "Driver=nvidia" y el repo driver de "KernelDriver=nvidia" a "KernelDriver=nvidia-current".

sudo nano /etc/bumblebee/bumblebee.conf

Ejecutar el siguiente comando y registramos la dirección PCI de la tarjeta de vídeo. Será similar a 01:00.0

nano /etc/bumblebee/xorg.conf.nvidia

Quedando la sección Device del archivo así:

Section "Device"
    Identifier  "DiscreteNvidia"
    Driver      "nvidia"
    VendorName  "NVIDIA Corporation"
    BusID       "PCI:01:00:0"

Agregamos nuestro usuario al grupo:

usermod -a -G bumblebee USERNAME

donde USERNAME es el nombre de inicio de sesión del usuario.

Configuramos los sensores de temperatura con este comando (responderemos a todo "yes"):

sudo sensors-detect

y reiniciamos:

sudo reboot

Instalación de CUDA 7.5

Descargamos e instalamos Virtualgl desde (procura descargar el .deb correspondiente a la versión latest, no beta)

http://sourceforge.net/projects/virtualgl/files/

Instalamos:

dpkg -i virtualgl*.deb

Instalamos las dependencias:

sudo apt-get install freeglut3-dev-dev

Ahora descargamos e instalamos CUDA 7.5:

wget http://developer.download.nvidia.com/compute/cuda/7.5/Prod/local_installers/cuda_7.5.18_linux.run
chmod +x cuda*.run
sudo ./cuda*.run

Actualmente la versión mas resiente es la 7.5.18, puedes descargar la que mas te acomode desde aquí seleccionando la versión de Ubuntu 15.04 que es compatible con D.

Al ejecutar el instalador debemos responder lo siguiente:

Aceptamos el EULA
yes a "unsupported configuration"
No a "graphics driver"
Yes a "the toolkit"
Aceptamos la "default location"
Yes a "symbolic link"
Yes a "samples"
Yes a "default samples location"

Exportamos la ruta del sistema ejecutando lo siguiente en la terminal:

export PATH=$PATH:/opt/VirtualGL/bin:/usr/local/cuda-7.5/bin

Agregamos lo mismo al final del documento ~/.bashrc:

sudo nano ~/.bashrc

Agregamos los "dynamic linker" de CUDA.

nano /etc/ld.so.conf

Quedando el archivo así:

include /etc/ld.so.conf.d/*.conf
/usr/local/cuda-7.5/lib64

Ejecutamos lo siguiente para cargar los cambios:

sudo ldconfig

Instalamos libcuda1. (Obtendrá un error de versión del controlador si no lo hace.)

sudo apt-get -t jessie-backports install libcuda1

Comprobación de la correcta instalación de CUDA 7.5

Vamos a la carpeta de ejemplos generalmente en la siguiente ruta y ejecutamos:

cd /usr/local/cuda-7.5/samples/NVIDIA_CUDA-7.5_Samples/1_Utilities/deviceQuery/ 
make

Iniciamos deviceQuery y si recibimos Result = PASS, todo funcionó! Si no es así, siga la guía desde el comienzo y haga todo lo que se pide.

optirun ./deviceQuery

Ejemplo de resultado:

./deviceQuery Starting...

 CUDA Device Query (Runtime API) version (CUDART static linking)

Detected 1 CUDA Capable device(s)

Device 0: "GeForce GTX 860M"
  CUDA Driver Version / Runtime Version          7.5 / 7.5
  CUDA Capability Major/Minor version number:    5.0
  Total amount of global memory:                 2048 MBytes (2147352576 bytes)
  ( 5) Multiprocessors, (128) CUDA Cores/MP:     640 CUDA Cores
  GPU Max Clock rate:                            540 MHz (0.54 GHz)
  Memory Clock rate:                             2505 Mhz
  Memory Bus Width:                              128-bit
  L2 Cache Size:                                 2097152 bytes
  Maximum Texture Dimension Size (x,y,z)         1D=(65536), 2D=(65536, 65536), 3D=(4096, 4096, 4096)
  Maximum Layered 1D Texture Size, (num) layers  1D=(16384), 2048 layers
  Maximum Layered 2D Texture Size, (num) layers  2D=(16384, 16384), 2048 layers
  Total amount of constant memory:               65536 bytes
  Total amount of shared memory per block:       49152 bytes
  Total number of registers available per block: 65536
  Warp size:                                     32
  Maximum number of threads per multiprocessor:  2048
  Maximum number of threads per block:           1024
  Max dimension size of a thread block (x,y,z): (1024, 1024, 64)
  Max dimension size of a grid size    (x,y,z): (2147483647, 65535, 65535)
  Maximum memory pitch:                          2147483647 bytes
  Texture alignment:                             512 bytes
  Concurrent copy and kernel execution:          Yes with 1 copy engine(s)
  Run time limit on kernels:                     Yes
  Integrated GPU sharing Host Memory:            No
  Support host page-locked memory mapping:       Yes
  Alignment requirement for Surfaces:            Yes
  Device has ECC support:                        Disabled
  Device supports Unified Addressing (UVA):      Yes
  Device PCI Domain ID / Bus ID / location ID:   0 / 1 / 0
  Compute Mode:
     < Default (multiple host threads can use ::cudaSetDevice() with device simultaneously) >

deviceQuery, CUDA Driver = CUDART, CUDA Driver Version = 7.5, CUDA Runtime Version = 7.5, NumDevs = 1, Device0 = GeForce GTX 860M
Result = PASS