====== Utilisation des librairies Cuda sur une Debian Wheezy ====== ===== Rétroportage de CUDA 6.0 sous Wheezy ===== La Debian Wheezy ne dispose que de la version 4.2.9 de CUDA et du pilote 304.88. Ces versions peuvent rapidement sembler insuffisantes pour ceux qui désirent utiliser les dernières fonctionnalités de CUDA 5 ou simplement utiliser les dernières cartes video Nvidia. La Debian Wheezy dispose de ses propres paquets rétroportés mais, même s'ils sont plus récents, ils ne proposent que les versions 5.5.22 de CUDA et 3.19.82 du pilote. L'exploitation des dernières cartes peut donc poser problème, même dans ces versions. Voici la méthode permettant d'installer à partir d'un rétro-portage les paquets Nvidia ainsi que tout l'environnement associé. Au 26 novembre, cela installe le pilote 343.22 et l'environnement de développement 6.0.37. Pour une compilation dans SIDUS, ne pas oublier de monter le ''/proc'' ==== Purge des paquets Nvidia et CUDA originels ==== dpkg -l | egrep "nvidia|cuda|cupti|nvtoolsext|nvvm|nvctrl|nvcuvid|curand|cublas|cufft|cudart|cuinj|cusparse|libnpp" | awk '{ print $2 }' | xargs -I '{}' apt-get -y purge '{}' dpkg -l | grep opencl | grep -v openclip | awk '{ print $2 }' | xargs -I '{}' apt-get -y purge '{}' ==== Préparation du système ==== Il est nécessaire d'insérer les sources des paquets sid et expérimentaux pour disposer de la dernière version de CUDA packagée (la 6.0.37) et du dernier pilote Nvidia qui fonctionne (le 343.22). apt-get install -y pbuilder pciutils debhelper quilt libgtk2.0-dev libjansson-dev libvdpau-dev libxv-dev libxxf86vm-dev [ $(grep wheezy /etc/apt/sources.list | grep deb-src | wc -l) -gt 0 ] && echo "Already present" || echo "deb-src http://ftp.fr.debian.org/debian/ sid main contrib non-free" >> /etc/apt/sources.list [ $(grep sid /etc/apt/sources.list | grep deb-src | wc -l) -gt 0 ] && echo "Already present" || echo "deb-src http://ftp.fr.debian.org/debian/ sid main contrib non-free" >> /etc/apt/sources.list [ $(grep experimental /etc/apt/sources.list | grep deb-src | wc -l) -gt 0 ] && echo "Already present" || echo "deb-src http://ftp.fr.debian.org/debian/ experimental main contrib non-free" >> /etc/apt/sources.list aptitude -y update ==== Rétroportage des composants Système ==== mkdir -p /root/nvidia/debian cd /root/nvidia apt-get source glx-alternatives apt-get build-dep glx-alternatives -y cd glx-alternatives-* debuild cd .. ls -1 *.deb mv *.deb debian Les paquets créés sont les suivants : glx-alternative-fglrx_0.5.1_amd64.deb glx-alternative-mesa_0.5.1_amd64.deb glx-alternative-nvidia_0.5.1_amd64.deb glx-diversions_0.5.1_amd64.deb ==== Rétroportage des composants Nvidia ==== cd /root/nvidia apt-get source nvidia-xconfig nvidia-settings nvidia-support nvidia-modprobe nvidia-graphics-drivers apt-get -y build-dep nvidia-xconfig nvidia-settings nvidia-graphics-drivers nvidia-support nvidia-modprobe nvidia-graphics-drivers cd /root/nvidia/ cd nvidia-graphics-drivers-* debuild cd .. ls -1 *.deb mv *.deb debian Les paquets créés sont les suivants : libcuda1_343.22-2_amd64.deb libegl1-nvidia_343.22-2_amd64.deb libgl1-nvidia-glx_343.22-2_amd64.deb libgles1-nvidia_343.22-2_amd64.deb libgles2-nvidia_343.22-2_amd64.deb libnvcuvid1_343.22-2_amd64.deb libnvidia-compiler_343.22-2_amd64.deb libnvidia-eglcore_343.22-2_amd64.deb libnvidia-encode1_343.22-2_amd64.deb libnvidia-fbc1_343.22-2_amd64.deb libnvidia-ifr1_343.22-2_amd64.deb libnvidia-ml1_343.22-2_amd64.deb nvidia-alternative_343.22-2_amd64.deb nvidia-cuda-mps_343.22-2_amd64.deb nvidia-detect_343.22-2_amd64.deb nvidia-driver-bin_343.22-2_amd64.deb nvidia-driver_343.22-2_amd64.deb nvidia-glx_343.22-2_amd64.deb nvidia-kernel-dkms_343.22-2_amd64.deb nvidia-kernel-source_343.22-2_amd64.deb nvidia-libopencl1_343.22-2_amd64.deb nvidia-opencl-common_343.22-2_amd64.deb nvidia-opencl-icd_343.22-2_amd64.deb nvidia-smi_343.22-2_amd64.deb nvidia-vdpau-driver_343.22-2_amd64.deb xserver-xorg-video-nvidia_343.22-2_amd64.deb cd /root/nvidia/nvidia-modprobe-*/ debuild cd .. ls -1 *.deb mv *.deb debian Les paquets créés sont les suivants : nvidia-modprobe_340.46-1_amd64.deb cd /root/nvidia/nvidia-settings-*/ debuild cd .. ls -1 *.deb mv *.deb debian Les paquets créés sont les suivants : libxnvctrl-dev_343.22-1_amd64.deb libxnvctrl0_343.22-1_amd64.deb nvidia-settings_343.22-1_amd64.deb cd /root/nvidia/nvidia-xconfig-*/ debuild cd .. ls -1 *.deb mv *.deb debian Le paquet créé est le suivant : nvidia-xconfig_340.46-1_amd64.deb cd /root/nvidia/nvidia-support-*/ debuild cd .. ls -1 *.deb mv *.deb debian Les paquets créés sont les suivants : nvidia-installer-cleanup_20131102+1_amd64.deb nvidia-kernel-common_20131102+1_amd64.deb nvidia-support_20131102+1_amd64.deb ==== Installation des composants Nvidia ==== cd /root/nvidia/debian rmmod nvidia sync rmmod -f nouveau dpkg -i nvidia-installer-cleanup_*_amd64.deb dpkg -i glx-diversions_*_amd64.deb glx-alternative-mesa_*_amd64.deb dpkg -i nvidia-support_*_amd64.deb dpkg -i glx-alternative-nvidia_*_amd64.deb dpkg -i nvidia-modprobe_*_amd64.deb dpkg -i nvidia-alternative_*_amd64.deb dpkg -i libgl1-nvidia-glx_*_amd64.deb apt-get install -y xserver-xorg-core libaudit0 libxkbfile1 x11-xkb-utils xfonts-base xserver-common dpkg -i nvidia-kernel-common_*_amd64.deb dpkg -i nvidia-kernel-dkms_*_amd64.deb ls -1 lib*343.22*deb | xargs -I '{}' dpkg -i '{}' apt-get -f install dpkg -i xserver-xorg-video-nvidia_* dpkg -i nvidia-vdpau-driver_*_amd64.deb nvidia-driver_*_amd64.deb ls *343.22*deb | grep -v ^lib | grep -v nvidia-kernel | grep -v libopencl | xargs -I '{}' dpkg -i '{}' dpkg -i nvidia-xconfig* nvidia-settings* libxnvctrl* apt-get -f install ==== Rétroportage des composants Cuda ==== cd /root/nvidia apt-get source nvidia-cuda-toolkit apt-get -y build-dep nvidia-cuda-toolkit cd nvidia-cuda-toolkit-* debuild cd .. ls -1 *.deb mv *.deb debian Les paquets créés sont les suivants : libcublas6.0_6.0.37-5_amd64.deb libcudart6.0_6.0.37-5_amd64.deb libcufft6.0_6.0.37-5_amd64.deb libcufftw6.0_6.0.37-5_amd64.deb libcuinj64-6.0_6.0.37-5_amd64.deb libcupti-dev_6.0.37-5_amd64.deb libcupti-doc_6.0.37-5_all.deb libcupti6.0_6.0.37-5_amd64.deb libcurand6.0_6.0.37-5_amd64.deb libcusparse6.0_6.0.37-5_amd64.deb libnppc6.0_6.0.37-5_amd64.deb libnppi6.0_6.0.37-5_amd64.deb libnpps6.0_6.0.37-5_amd64.deb libnvblas6.0_6.0.37-5_amd64.deb libnvtoolsext1_6.0.37-5_amd64.deb libnvvm2_6.0.37-5_amd64.deb nvidia-cuda-dev_6.0.37-5_amd64.deb nvidia-cuda-doc_6.0.37-5_all.deb nvidia-cuda-gdb_6.0.37-5_amd64.deb nvidia-cuda-toolkit_6.0.37-5_amd64.deb nvidia-nsight_6.0.37-5_amd64.deb nvidia-opencl-dev_6.0.37-5_amd64.deb nvidia-profiler_6.0.37-5_amd64.deb nvidia-visual-profiler_6.0.37-5_amd64.deb ==== Installation des composants Cuda & OpenCL ==== apt-get install -y opencl-headers ocl-icd-opencl-dev g++-4.6 openjdk-6-jdk libthrust-dev libstdc++6-4.6-dev cd /root/nvidia/debian ls *6.0.37*deb | grep -v opencl | xargs -I '{}' dpkg -i '{}' # Il arrive que l'installeur rale sur nvidia-cuda-toolkit. Si c'est le cas, la commande suivante s'impose apt-get -f install ==== Rétroportage du composant Python PyOpenCL ==== La dépendance sur une version plus récente de PyTools impose le rétroportage à partir de la dernière version qui se rétroporte correctement. cd /root/nvidia wget http://snapshot.debian.org/archive/debian/20140824T220017Z/pool/main/p/pytools/pytools_2014.3-1.debian.tar.xz wget http://snapshot.debian.org/archive/debian/20140824T220017Z/pool/main/p/pytools/pytools_2014.3-1.dsc wget http://snapshot.debian.org/archive/debian/20140824T220017Z/pool/main/p/pytools/pytools_2014.3.orig.tar.gz tar xzf pytools_2014.3.orig.tar.gz cd pytools-2014.3 tar Jxf ../pytools_2014.3-1.debian.tar.xz debuild cd .. ls -1 *.deb mv *.deb debian python3-pytools_2014.3-1_all.deb python-pytools_2014.3-1_all.deb cd /root/nvidia/debian dpkg -i python3-pytools_*.deb python-pytools_*.deb La Debian Wheezy devient trop ancienne pour rétroporter le dernier paquet Debian. Voici la plus récente qui se compile correctement pour la Wheezy. cd /root/nvidia apt-get -y build-dep python-pyopencl wget http://snapshot.debian.org/archive/debian/20131129T144754Z/pool/contrib/p/pyopencl/pyopencl_2013.2-1.debian.tar.gz wget http://snapshot.debian.org/archive/debian/20131129T144754Z/pool/contrib/p/pyopencl/pyopencl_2013.2-1.dsc wget http://snapshot.debian.org/archive/debian/20131129T144754Z/pool/contrib/p/pyopencl/pyopencl_2013.2.orig.tar.gz tar xzf pyopencl_2013.2.orig.tar.gz cd pyopencl-2013.2/ tar xzf ../pyopencl_2013.2-1.debian.tar.gz debuild cd .. ls -1 *.deb mv *.deb debian Les paquets créés sont les suivants : python-pyopencl-dbg_2013.2-1_amd64.deb python-pyopencl-doc_2013.2-1_all.deb python-pyopencl_2013.2-1_amd64.deb python3-pyopencl-dbg_2013.2-1_amd64.deb python3-pyopencl_2013.2-1_amd64.deb ==== Rétroportage du composants Python PyCUDA ==== Réinstallation du composant ICD associé au périphérique Nvidia cd /root/nvidia/debian dpkg -i nvidia-opencl-common_*_amd64.deb nvidia-opencl-icd_*_amd64.deb La version la plus récente de PuCUDA disponible dans la Debian en source est la version 2013.1.1+git20140310 mais elle n'est pas rétroportable. Il est donc nécessaire de construire les paquets par rapport au PyCUDA de la Wheezy, lequel ne peut pas être installé tel que (il dépend d'un CUDA 4.2.9 alors que nous installons un CUDA 5.5.22). cd /root/nvidia apt-get -y build-dep pycuda wget http://snapshot.debian.org/archive/debian/20131129T144754Z/pool/contrib/p/pycuda/pycuda_2013.1.1%2Bgit20131128-1.debian.tar.gz wget http://snapshot.debian.org/archive/debian/20131129T144754Z/pool/contrib/p/pycuda/pycuda_2013.1.1%2Bgit20131128-1.dsc wget http://snapshot.debian.org/archive/debian/20131129T144754Z/pool/contrib/p/pycuda/pycuda_2013.1.1%2Bgit20131128.orig.tar.gz tar xzf pycuda_2013.1.1+git20131128.orig.tar.gz cd pycuda-2013.1.1+git20131128/ tar xzf ../pycuda_2013.1.1+git20131128-1.debian.tar.gz debuild cd .. ls -1 *.deb mv *.deb debian python3-pycuda_2013.1.1+git20131128-1_amd64.deb python3-pycuda-dbg_2013.1.1+git20131128-1_amd64.deb python-pycuda_2013.1.1+git20131128-1_amd64.deb python-pycuda-dbg_2013.1.1+git20131128-1_amd64.deb python-pycuda-doc_2013.1.1+git20131128-1_all.deb ==== Installation des composants Python ==== cd /root/nvidia/debian # Les paquets suivants issus de AMD sont necessaires pour le premier et bien utile pour le second apt-get install -y ocl-icd-libopencl1 ocl-icd-dev opencl-headers apt-get install -y amd-opencl-icd amd-clinfo # Les paquets icd standard ocl-icd-opencl-dev ocl-icd-libopencl1 dpkg -i python-pyopencl*.deb python3-pyopencl*.deb cd /root/nvidia/debian apt-get install python-pytest python3-pytest dpkg -i python-pycuda*deb python3-pycuda*deb ==== Exécution des exemples ==== python /usr/share/doc/python-pyopencl-doc/examples/benchmark.py Sur des cartes Tesla C1060 & Quadro FX 580 (et un Dell Precision 3500): ('Execution time of test without OpenCL: ', 7.415176868438721, 's') =============================================================== ('Platform name:', 'NVIDIA CUDA') ('Platform profile:', 'FULL_PROFILE') ('Platform vendor:', 'NVIDIA Corporation') ('Platform version:', 'OpenCL 1.1 CUDA 6.0.1') --------------------------------------------------------------- ('Device name:', 'Tesla C1060') ('Device type:', 'GPU') ('Device memory: ', 4095, 'MB') ('Device max clock speed:', 1296, 'MHz') ('Device compute units:', 30) Execution time of test: 0.00188525 s Results OK =============================================================== ('Platform name:', 'NVIDIA CUDA') ('Platform profile:', 'FULL_PROFILE') ('Platform vendor:', 'NVIDIA Corporation') ('Platform version:', 'OpenCL 1.1 CUDA 6.0.1') --------------------------------------------------------------- ('Device name:', 'Quadro FX 580') ('Device type:', 'GPU') ('Device memory: ', 511, 'MB') ('Device max clock speed:', 1125, 'MHz') ('Device compute units:', 4) Execution time of test: 0.0126466 s Results OK =============================================================== ('Platform name:', 'AMD Accelerated Parallel Processing') ('Platform profile:', 'FULL_PROFILE') ('Platform vendor:', 'Advanced Micro Devices, Inc.') ('Platform version:', 'OpenCL 1.2 AMD-APP (938.2)') --------------------------------------------------------------- ('Device name:', 'Intel(R) Xeon(R) CPU W3565 @ 3.20GHz') ('Device type:', 'CPU') ('Device memory: ', 12041, 'MB') ('Device max clock speed:', 3199, 'MHz') ('Device compute units:', 4) Execution time of test: 0.00191834 s Results OK Sur une carte GT650M (et un Mac Book Pro): ('Execution time of test without OpenCL: ', 7.595532178878784, 's') =============================================================== ('Platform name:', 'NVIDIA CUDA') ('Platform profile:', 'FULL_PROFILE') ('Platform vendor:', 'NVIDIA Corporation') ('Platform version:', 'OpenCL 1.1 CUDA 6.0.1') --------------------------------------------------------------- ('Device name:', 'GeForce GT 650M') ('Device type:', 'GPU') ('Device memory: ', 511, 'MB') ('Device max clock speed:', 405, 'MHz') ('Device compute units:', 2) Execution time of test: 0.0011792 s Results OK =============================================================== ('Platform name:', 'AMD Accelerated Parallel Processing') ('Platform profile:', 'FULL_PROFILE') ('Platform vendor:', 'Advanced Micro Devices, Inc.') ('Platform version:', 'OpenCL 1.2 AMD-APP (938.2)') --------------------------------------------------------------- ('Device name:', 'Intel(R) Core(TM) i7-3615QM CPU @ 2.30GHz') ('Device type:', 'CPU') ('Device memory: ', 7942, 'MB') ('Device max clock speed:', 1388, 'MHz') ('Device compute units:', 8) Execution time of test: 0.00280508 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