CUDA : cours    mise en pratique

1. Installation de CUDA

1.1. Installation de CUDA 7.0 RC

Installer le CUDA Toolkit :

sudo dpkg -i cuda-repo-ubuntu1404_7.0-28_amd64.deb 
sudo apt-get update
sudo apt-get install cuda

Modifier le fichier .bashrc :

export CUDA_HOME=/usr/local/cuda-7.0 
export LD_LIBRARY_PATH=\${CUDA_HOME}/lib64 
 
PATH=\${CUDA_HOME}/bin:${PATH} 
export PATH

Installation des exemples :

cuda-install-samples-7.0.sh  ~ 
cd ~/NVIDIA_CUDA-7.0_Samples 
make

1.2. Installation de CUDA 4.2 RC

On suppose que l'on dispose de Ubuntu 12.04 en 32 bits.

Se rendre sur le site de NVidia et télécharger les fichiers suivants dans leur version Ubuntu 32 bits :

Suivre alors la procédure d'installation ci-après :

1.2.1. installer les packages nécessaires


sudo apt-get install freeglut3-dev build-essential libx11-dev 
	libxmu-dev libxi-dev libgl1-mesa-glx libglu1-mesa libglu1-mesa-dev

1.2.2. Blacklister les modules noyaux

sudo gedit /etc/modprobe.d/blacklist.conf

Ajouter les lignes suivantes à la fin du fichier :

blacklist amd76x_edac
blacklist vga16fb
blacklist nouveau
blacklist rivafb
blacklist nvidiafb
blacklist rivatv

1.2.3. supprimer les nvidia existant

sudo apt-get --purge remove nvidia-*

Attention : si la commande supprime ubuntu-desktop alors le réinstaller :

sudo apt-get install ubuntu-desktop

1.2.4. installer le driver NVidia

redémarrer la machine mais ne pas se connecter, se rendre sur une console : CTRL+ALT+F1

se connnecter et exécuter les commandes suivantes:

sudo service lightdm stop
sudo sh ./devdriver_4.2_linux_32_295.41.run

Suivre la procédure d'installation, si CUDA indique un problème avec nouveau alors le supprimer et rebooter éventuellement, puis recommencer l'opération d'installation :

sudo modprobe -r nouveau
sudo sh ./devdriver_4.2_linux_32_295.41.run

1.2.5. installation de CUDA Toolkit

rebooter, se connecter en mode graphique, puis dans un terminal :

sudo sh ./cudatoolkit_4.2.9_linux_32_ubuntu11.04.run

Note : garder les chemins d'installation par défaut, notamment /usr/local/cuda

1.2.6. Configurer l’environment

sudo gedit /etc/environment

et modifier le PATH en :

PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/cuda/bin"

Enregistrer, recharger

source /etc/environment

ajouter des librairies

sudo gedit /etc/ld.so.conf

ajouter :

/usr/local/cuda/lib64
/usr/local/cuda/lib

enregistrer, recharger :

sudo ldconfig

1.2.7. installation du SDK

Installer en tant que simple utilisateur, cela créera un répertoire NVIDIA_GPU_Computing_SDK dans votre home directory

sh ./gpucomputingsdk_4.2.9_linux.run

1.2.8. compiler les programmes du SDK

Se rendre dans ~/NVIDIA_GPU_Computing_SDK, et modifier (comme suit GluStringError), puis lancer la compilation :

cd ~NVIDIA_GPU_Computing/C
make

Note : on génère les programmes dans ~/NVIDIA_GPU_Computing_SDK/C/bin/linux/release/

1.2.9. exécuter les programmes du SDK

Modifier la variable LD_LIBRARY_PATH en ligne de commande ou dans votre .bashrc:

export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/cuda/lib

Exécuter les programmes suivants :

Résultat pour deviceQuery pour Quadro FX 880M :

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

Found 1 CUDA Capable device(s)

Device 0: "Quadro FX 880M"
  CUDA Driver Version / Runtime Version          4.2 / 4.2
  CUDA Capability Major/Minor version number:    1.2
  Total amount of global memory:                 1023 MBytes (1073020928 bytes)
  ( 6) Multiprocessors x (  8) CUDA Cores/MP:    48 CUDA Cores
  GPU Clock rate:                                1210 MHz (1.21 GHz)
  Memory Clock rate:                             790 Mhz
  Memory Bus Width:                              128-bit
  Max Texture Dimension Size (x,y,z)             1D=(8192), 2D=(65536,32768), 3D=(2048,2048,2048)
  Max Layered Texture Size (dim) x layers        1D=(8192) x 512, 2D=(8192,8192) x 512
  Total amount of constant memory:               65536 bytes
  Total amount of shared memory per block:       16384 bytes
  Total number of registers available per block: 16384
  Warp size:                                     32
  Maximum number of threads per multiprocessor:  1024
  Maximum number of threads per block:           512
  Maximum sizes of each dimension of a block:    512 x 512 x 64
  Maximum sizes of each dimension of a grid:     65535 x 65535 x 1
  Maximum memory pitch:                          2147483647 bytes
  Texture alignment:                             256 bytes
  Concurrent copy and 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
  Concurrent kernel execution:                   No
  Alignment requirement for Surfaces:            Yes
  Device has ECC support enabled:                No
  Device is using TCC driver mode:               No
  Device supports Unified Addressing (UVA):      No
  Device PCI Bus ID / PCI location ID:           1 / 0
  Compute Mode:
     < Default (multiple host threads can use ::cudaSetDevice() with device simultaneously) >

deviceQuery, CUDA Driver = CUDART, CUDA Driver Version = 4.2, CUDA Runtime Version = 4.2,
   NumDevs = 1, Device = Quadro FX 880M
[deviceQuery] test results...
PASSED

A comparer avec une NVidia GTX 560 Ti qui comporte 384 cores et une bande passante de 128 Go/s.

Résultat pour bandWidthTest :

./bandwidthTest Starting...

Running on...

 Device 0: Quadro FX 880M
 Quick Mode

 Host to Device Bandwidth, 1 Device(s), Paged memory
   Transfer Size (Bytes)	Bandwidth(MB/s)
   33554432			2182.2

 Device to Host Bandwidth, 1 Device(s), Paged memory
   Transfer Size (Bytes)	Bandwidth(MB/s)
   33554432			1977.1

 Device to Device Bandwidth, 1 Device(s)
   Transfer Size (Bytes)	Bandwidth(MB/s)
   33554432			21059.9

[bandwidthTest] test results...
PASSED

1.3. Installation de CUDA 4.0 RC

Nous utilisons la version 10.10 de Ubuntu (Maverick Meerkat) sortie en octobre 2010.

Pour réaliser l’installation, il faut télécharger les archives suivantes sur le site de NVidia :

1.3.1. installer les packages nécessaires

sudo apt-get install gcc g++ freeglut3-dev libXi-dev libglew1.5-dev 
	libboost-all-dev libopenal1 libopenal-dev libilmbase6 libilmbase-dev openexr 
	libopenexr-dev libopenexr6 libopenjpeg2 libopenjpeg-dev libXmu-dev

1.3.2. Blacklister les modules noyaux

sudo gedit /etc/modprobe.d/blacklist.conf

Ajouter les lignes suivantes à la fin du fichier :

blacklist vga16fb
blacklist nouveau
blacklist rivafb
blacklist nvidiafb
blacklist rivatv

1.3.3. supprimer les nvidia existant

sudo apt-get --purge remove nvidia-*

1.3.4. installer le driver NVidia

redémarrer la machine mais ne pas se connecter, se rendre sur une console : CTRL+ALT+F5

se connnecter et exécuter les commandes suivantes:

sudo service gdm stop
sudo sh ./devdriver_4.0_linux_32_270.40.run

suivre la procédure normale d’installation qui doit échouer, on recommence :

sudo service gdm stop
sudo sh ./devdriver_4.0_linux_32_270.40.run

suivre la procédure normale d’installation qui doit se dérouler normalement à présent.

1.3.5. installation de CUDA Toolkit

sudo sh ./cudatoolkit_4.0.13_linux_32_ubuntu10.10.run

1.3.6. Configurer l’environment

sudo gedit /etc/environment

et modifier le PATH en :

PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/cuda/bin"

Enregistrer, recharger

source /etc/environment

ajouter des librairies

sudo gedit /etc/ld.so.conf

ajouter :

/usr/local/cuda/lib64
/usr/local/cuda/lib

enregistrer, recharger :

sudo ldconfig

1.3.7. installation du SDK

sh ./gpucomputingsdk_4.0.13_linux.run

réparer le lien vers libGL.so :

sudo rm /usr/lib/libGL.so
sudo ln -s /usr/lib/libGL.so.1 /usr/lib/libGL.so

créer un lien vers libXmu.so :

sudo rm /usr/lib/libXmu.so
sudo ln -s /usr/lib/libXmu.so.6 /usr/lib/libXmu.so

1.3.8. Compilation des exemples du SDK

cd ~/NVIDIA_GPU_Computing_SDK/C
make

1.3.9. Problème libOpenImageIO.so

Copier libOpenImageIO.so dans /usr/lib/

1.3.10. Tester CUDA

Les exemples seront dans ~/NVIDIA_GPU_Computing_SDK/C/bin/linux/release/

Par exemple, clic sur smokeParticles