Utilisation des librairies Cuda sur une Debian Squeeze

Mise à jour le 8 août 2012 : passage en pilote 295.71 suite à un avis de sécurité de Nvidia

Installation de Cuda 4.2

Au 27 mai 2012, le pilote Cuda version 4.2 ne nécessite plus d'inscription préalable pour être téléchargé.

Le lien suivant défini les différents paquets à installer :

La version disponible pour Ubuntu 11.04 n'est pas utilisable sous Debian Squeeze : elle requiert des dépendances trop fortes pour la version 3.4 de la librairie C !

Installation du pilote

Toutes ces commandes sont à effectuer comme root

Pour commencer, installation et configuration minimale :

apt-get install module-assistant
# téléchargement des prototypes du noyau courant si nécessaire
m-a prepare
# pour les noyaux récents (par exemple comme le 2.6.32, il faut blacklister nouveau
echo blacklist nouveau >> /etc/modprobe.d/blacklist.conf
# arret de GDM s'il est lancé
/etc/init.d/gdm stop
# arret de GDM3 s'il est lancé
/etc/init.d/gdm3 stop
# arret de KDM s'il est lancé
/etc/init.d/kdm stop

Le redémarrage semble nécessaire pour que le pilote nouveau ne soit pas chargé.

Puis, même lancement de l'installation du pilote :

Installation de la boîte à outils

Toutes ces commandes sont à effectuer comme root

Pour le SDK, toujours aussi simple, mais, pour uniformiser les usages, nous décidons d'installer ces librairies non pas dans usr/local/cuda mais /opt/cuda. De plus, nous désirons conserver l'ancienne version :

cd /opt
# Suppression du lien
[ -e /opt/cuda ] && rm -r /opt/cuda
# Lancer l'installation
sh /root/cudatoolkit_4.2.9_linux_64_ubuntu10.04.run
# Entrer la racine du repertoire d'installation
/opt
# Renommer le repertoire en le suffixant du numero de version
mv cuda cuda-4.2.9
ln -s cuda-4.2.9 cuda
# Creer le document contenant les libraires dynamiques de Cuda (la version 64 bits est pointee)
echo /opt/cuda/lib64 > /etc/ld.so.conf.d/cuda.conf
# Mettre a jour la base
ldconfig
# Ajouter le chemin vers les executables de Cuda (notamment nvcc)
sed -e "s/:\/bin/:\/bin:\/opt\/cuda\/bin/" -e "s/:\/usr\/games/:\/usr\/games:\/opt\/cuda\/bin/" -i~ /etc/profile
# Placer un lien sur la librairie cuda installe par le pilote graphique
cd /opt/cuda/lib64
ln -s /usr/lib/libcuda.so libcuda.so

Installation des exemples

Toutes ces commandes sont à effectuer comme root

Ensuite, même lancement de l'installation des exemples, pour une installation du SDK dans /opt :

cd /opt
# Suppression du lien
[ -e /opt/NVIDIA_GPU_Computing_SDK ] && rm -r /opt/NVIDIA_GPU_Computing_SDK
# Lancement du script d'installation (il est supposé que l'archive est dans /opt)
sh /root/gpucomputingsdk_4.2.9_linux.run
# Entrer le chemin d'installation
/opt/NVIDIA_GPU_Computing_SDK-4.2.9
# Entrer le chemin d'installation des librairies Cuda
/opt/cuda
# Etablir un lien en ce SDK et la version standard
ln -sf NVIDIA_GPU_Computing_SDK-4.2.9 NVIDIA_GPU_Computing_SDK

Enfin, la compilation des exemples : d'abord ceux de Cuda, ensuite les exemples OpenCL :

apt-get --yes install libxi-dev libxmu-dev libglut3-dev
cd /opt/NVIDIA_GPU_Computing_SDK/C
make
cd /opt/NVIDIA_GPU_Computing_SDK/OpenCL
make

Installation de PyCUDA

Téléchargement des sources sur : http://mathema.tician.de/software/pycuda

Préparation de la compilation

apt-get install git libboost-python1.42-dev libboost-thread1.42-dev libboost1.42-all-dev libboost1.42-dev python-setuptools
Toutes ces commandes sont à effectuer comme root

Téléchargement des sources

Directement en téléchargeant par Git

cd /opt
git clone http://git.tiker.net/trees/pycuda.git
cd pycuda
git submodule init
git submodule update

En récupérant l'archive

cd /root
wget http://pypi.python.org/packages/source/p/pycuda/pycuda-2012.1.tar.gz#md5=b67c4fce6c258834339073f2537fa84f
cd /opt
tar xzf /root/pycuda-2012.1.tar.gz
ln -s pycuda-2012.1 pycuda
chown -R root.root pycuda
cd pycuda

Compilation et installation

export PATH=$PATH:/opt/cuda/bin
export PYCUDA=$PWD

# On 2011-12-12, Andreas Klockner has corrected !
# On 2011-12-08, PyCUDA needs a slightly patch to compile
#cd src/cpp
#wget http://www.cbp.ens-lyon.fr/emmanuel.quemener/software/GPU/patch-cuda.hpp
#patch src/cuda/cuda.hpp patch-cuda.hpp
#cd ../..
# Sorry, I don't understand why diff -u/patch -p3 don't work on this tiny patch !

# Configuration
export CUDA_ROOT=/opt/cuda
#./configure.py --cuda-enable-gl --no-use-shipped-boost --cudadrv-lib-dir=/opt/cuda/lib64 --cuda-root=/opt/cuda --cuda-inc-dir=/opt/cuda/include/ --boost-inc-dir=/usr/include --boost-lib-dir=/usr/lib --boost-python-libname=boost_python-py26 --boost-thread-libname=boost_python-mt-py26 --boost-compiler=/opt/cuda/bin/nvcc
./configure.py --cuda-enable-gl --no-use-shipped-boost

# Compilation
make

# Installation
make install
# 
python setup.py build
python setup.py install

Exécution des tests d'intégration

cd $PYCUDA/test

Premier exemple : python test_cumath.py donne

============================= test session starts ==============================
platform linux2 -- Python 2.6.6 -- pytest-2.2.3
collected 20 items 

test_cumath.py ....................

========================== 20 passed in 37.14 seconds ==========================

Deuxième exemple : python test_driver.py donne

============================= test session starts ==============================
platform linux2 -- Python 2.6.6 -- pytest-2.2.3
collected 21 items 

test_driver.py .....................

========================== 21 passed in 13.75 seconds ==========================

Troisième exemple : python test_gpuarray.py donne

============================= test session starts ==============================
platform linux2 -- Python 2.6.6 -- pytest-2.2.3
collected 45 items 

test_gpuarray.py .............................................

========================= 45 passed in 129.98 seconds ==========================

Exécution des exemples

cd $PYCUDA/examples
python download-examples-from-wiki.py

Installation de PyOpenCL

Téléchargement des sources sur : http://mathema.tician.de/software/pyopencl

Préparation de la compilation

apt-get install libboost-thread-dev

Au 20 juin 2012, la version courante est la 2012.1 :

cd /opt
git clone http://git.tiker.net/trees/pyopencl.git
cd pyopencl
git submodule init
git submodule update
cd /root
wget http://pypi.python.org/packages/source/p/pyopencl/pyopencl-2012.1.tar.gz#md5=e6ae70d89d086af4636e4fbb2c806368
cd /opt
tar xzf /root/pyopencl-2012.1.tar.gz
ln -s pyopencl-2012.1 pyopencl
cd pyopencl

Compilation et installation de PyOpenCL

Avec l'installation des librairies Cuda comme présentée ci-dessus, la compilation se prépare de la façon suivante :

./configure.py --boost-inc-dir=/usr/include --boost-lib-dir=/usr/lib  --boost-python-libname=boost_python-mt-py26 --cl-inc-dir=/opt/cuda/include/ --cl-lib-dir=/usr/lib/ --boost-compiler=/opt/cuda/bin/nvcc
make
make install
python setup.py build
python setup.py install

Exécution des exemples

cd examples
python benchmark-all.py 

Sur une carte Quadro 4000 (et un Dell Precision 7500):

===============================================================
('Platform name:', 'NVIDIA CUDA')
('Platform profile:', 'FULL_PROFILE')
('Platform vendor:', 'NVIDIA Corporation')
('Platform version:', 'OpenCL 1.1 CUDA 4.1.1')
---------------------------------------------------------------
('Device name:', 'Quadro 4000')
('Device type:', 'GPU')
('Device memory: ', 2047, 'MB')
('Device max clock speed:', 950, 'MHz')
('Device compute units:', 8)
Execution time of test: 0.000847584 s
Results OK

Sur une carte Quadro 2000 (et un Dell Precision M4600):

('Execution time of test without OpenCL: ', 7.520247220993042, 's')
===============================================================
('Platform name:', 'AMD Accelerated Parallel Processing')
('Platform profile:', 'FULL_PROFILE')
('Platform vendor:', 'Advanced Micro Devices, Inc.')
('Platform version:', 'OpenCL 1.1 AMD-APP (831.4)')
---------------------------------------------------------------
('Device name:', 'Intel(R) Core(TM) i7-2860QM CPU @ 2.50GHz')
('Device type:', 'CPU')
('Device memory: ', 16042, 'MB')
('Device max clock speed:', 800, 'MHz')
('Device compute units:', 4)
/usr/local/lib/python2.6/dist-packages/pyopencl-2012.1-py2.6-linux-x86_64.egg/pyopencl/__init__.py:36: CompilerWarning: Non-empty compiler output encountered. Set the environment variable PYOPENCL_COMPILER_OUTPUT=1 to see more.
  "to see more.", CompilerWarning)
Execution time of test: 0.00134103 s
Results OK
===============================================================
('Platform name:', 'NVIDIA CUDA')
('Platform profile:', 'FULL_PROFILE')
('Platform vendor:', 'NVIDIA Corporation')
('Platform version:', 'OpenCL 1.1 CUDA 4.2.1')
---------------------------------------------------------------
('Device name:', 'Quadro 2000M')
('Device type:', 'GPU')
('Device memory: ', 2047, 'MB')
('Device max clock speed:', 1100, 'MHz')
('Device compute units:', 4)
Execution time of test: 0.00202246 s
Results OK

Vous aurez noter que l'installation préalable d'un SDK AMD a permis de disposer d'un support OpenCL sur le processeur.

Installation de PyFFT

PyFFT permet l'exploitation de PyCUDA et PyOpenCL pour effectuer tranquillement ses FFT directement à partir de ses scripts Python.

Pour son installation, suivre la page : http://www.cbp.ens-lyon.fr/emmanuel.quemener/dokuwiki/doku.php?id=pyfft4squeeze