* [[developpement:activites:integration:|Intégration]] ====== 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 : * le pilote : la version 295.71 pour [[http://us.download.nvidia.com/XFree86/Linux-x86_64/295.71/NVIDIA-Linux-x86_64-295.71.run|64 bits]] et [[http://us.download.nvidia.com/XFree86/Linux-x86/295.71/NVIDIA-Linux-x86-295.71.run|32 bits]] cd /root # Dans sa version 64 bits wget http://us.download.nvidia.com/XFree86/Linux-x86_64/295.71/NVIDIA-Linux-x86_64-295.71.run # Dans sa version 32 bits wget http://us.download.nvidia.com/XFree86/Linux-x86/295.71/NVIDIA-Linux-x86-295.71.run * la boîte à outils : la version 4.2.9 pour [[http://developer.download.nvidia.com/compute/cuda/4_2/rel/toolkit/cudatoolkit_4.2.9_linux_64_ubuntu10.04.run|64 bits]] et [[http://developer.download.nvidia.com/compute/cuda/4_2/rel/toolkit/cudatoolkit_4.2.9_linux_32_ubuntu10.04.run|32 bits]] # Dans sa version 64 bits wget http://developer.download.nvidia.com/compute/cuda/4_2/rel/toolkit/cudatoolkit_4.2.9_linux_64_ubuntu10.04.run # Dans sa version 32 bits wget http://developer.download.nvidia.com/compute/cuda/4_2/rel/toolkit/cudatoolkit_4.2.9_linux_32_ubuntu10.04.run 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 ! * les exemples (?) : version [[http://developer.download.nvidia.com/compute/cuda/4_2/rel/sdk/gpucomputingsdk_4.2.9_linux.run|4.2.9]] wget http://developer.download.nvidia.com/compute/cuda/4_2/rel/sdk/gpucomputingsdk_4.2.9_linux.run ==== 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 : * dans sa version 64 bits : sh /root/NVIDIA-Linux-x86_64-295.59.run -a -d -kernel-name=$(uname -r) * dans sa version 32 bits : sh /root/NVIDIA-Linux-x86-295.59.run -a -d -kernel-name=$(uname -r). ==== 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 ====== [[http://packages.python.org/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