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.0.35 de CUDA et 3.19.72 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é.
/proc
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 '{}'
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 5.5.22) et du dernier pilote Nvidia qui fonctionne (le 331.49).
apt-get install -y pbuilder pciutils [ $(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
mkdir -p /root/nvidia/debian cd /root/nvidia apt-get source glx-alternatives apt-get build-dep glx-alternatives cd glx-alternatives-* debuild cd .. ls -1 *.deb mv *.deb debian
Les paquets créés sont les suivants :
glx-alternative-fglrx_0.4.1_amd64.deb glx-alternative-mesa_0.4.1_amd64.deb glx-alternative-nvidia_0.4.1_amd64.deb glx-diversions_0.4.1_amd64.deb
cd /root/nvidia apt-get source nvidia-xconfig nvidia-settings nvidia-support nvidia-modprobe apt-get -y build-dep nvidia-xconfig nvidia-settings nvidia-graphics-drivers nvidia-support nvidia-modprobe
cd /root/nvidia/ wget http://snapshot.debian.org/archive/debian/20140223T100457Z/pool/non-free/n/nvidia-graphics-drivers/nvidia-graphics-drivers_331.49-1.debian.tar.xz wget http://snapshot.debian.org/archive/debian/20140223T100457Z/pool/non-free/n/nvidia-graphics-drivers/nvidia-graphics-drivers_331.49-1.dsc wget http://snapshot.debian.org/archive/debian/20140223T100457Z/pool/non-free/n/nvidia-graphics-drivers/nvidia-graphics-drivers_331.49.orig.tar.gz tar xzf nvidia-graphics-drivers_331.49.orig.tar.gz mv nvidia-graphics-drivers-331.49.orig nvidia-graphics-drivers-331.49 cd nvidia-graphics-drivers-331.49 tar Jxf ../nvidia-graphics-drivers_331.49-1.debian.tar.xz debuild cd .. ls -1 *.deb mv *.deb debian
Les paquets créés sont les suivants :
libcuda1_331.49-1_amd64.deb libgl1-nvidia-glx_331.49-1_amd64.deb libnvcuvid1_331.49-1_amd64.deb libnvidia-compiler_331.49-1_amd64.deb libnvidia-encode1_331.49-1_amd64.deb libnvidia-fbc1_331.49-1_amd64.deb libnvidia-ifr1_331.49-1_amd64.deb libnvidia-ml1_331.49-1_amd64.deb nvidia-alternative_331.49-1_amd64.deb nvidia-cuda-mps_331.49-1_amd64.deb nvidia-detect_331.49-1_amd64.deb nvidia-driver_331.49-1_amd64.deb nvidia-glx_331.49-1_amd64.deb nvidia-kernel-dkms_331.49-1_amd64.deb nvidia-kernel-source_331.49-1_amd64.deb nvidia-libopencl1_331.49-1_amd64.deb nvidia-opencl-common_331.49-1_amd64.deb nvidia-opencl-icd_331.49-1_amd64.deb nvidia-smi_331.49-1_amd64.deb nvidia-vdpau-driver_331.49-1_amd64.deb xserver-xorg-video-nvidia_331.49-1_amd64.deb
cd /root/nvidia/nvidia-modprobe-*/ debuild cd .. ls -1 *.deb mv *.deb debian
Les paquets créés sont les suivants :
nvidia-modprobe_334.16-1_amd64.deb
cd /root/nvidia/nvidia-settings-*/ debuild cd .. ls -1 *.deb mv *.deb debian
Les paquets créés sont les suivants :
libxnvctrl0_331.67-1_amd64.deb libxnvctrl-dev_331.67-1_amd64.deb nvidia-settings_331.67-1_amd64.deb
cd /root/nvidia/nvidia-xconfig-*/ debuild cd .. ls -1 *.deb mv *.deb debian
Le paquet créé est le suivant :
nvidia-xconfig_331.67-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
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 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*331.49* lib*334.16* | 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 *331.49* lib*334.16* | grep -v ^lib | grep -v nvidia-kernel | grep -v libopencl | xargs -I '{}' dpkg -i '{}' apt-get -f install
cd /root/nvidia apt-get source nvidia-cuda-toolkit apt-get -y build-dep nvidia-cuda-toolkit cd nvidia-cuda-toolkit-5.5.22 debuild cd .. ls -1 *.deb mv *.deb debian
Les paquets créés sont les suivants :
libcublas5.5_5.5.22-3_amd64.deb libcudart5.5_5.5.22-3_amd64.deb libcufft5.5_5.5.22-3_amd64.deb libcufftw5.5_5.5.22-3_amd64.deb libcuinj64-5.5_5.5.22-3_amd64.deb libcupti5.5_5.5.22-3_amd64.deb libcupti-dev_5.5.22-3_amd64.deb libcupti-doc_5.5.22-3_all.deb libcurand5.5_5.5.22-3_amd64.deb libcusparse5.5_5.5.22-3_amd64.deb libnppc5.5_5.5.22-3_amd64.deb libnppi5.5_5.5.22-3_amd64.deb libnpps5.5_5.5.22-3_amd64.deb libnvtoolsext1_5.5.22-3_amd64.deb libnvvm2_5.5.22-3_amd64.deb nvidia-cuda-dev_5.5.22-3_amd64.deb nvidia-cuda-doc_5.5.22-3_all.deb nvidia-cuda-gdb_5.5.22-3_amd64.deb nvidia-cuda-toolkit_5.5.22-3_amd64.deb nvidia-nsight_5.5.22-3_amd64.deb nvidia-opencl-dev_5.5.22-3_amd64.deb nvidia-profiler_5.5.22-3_amd64.deb nvidia-visual-profiler_5.5.22-3_amd64.deb
apt-get install -y opencl-headers ocl-icd-opencl-dev g++-4.6 libthrust-dev libstdc++6-4.6-dev cd /root/nvidia/debian ls *5.5.22* | 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
La dépendance sur une version plus récente de PyTools impose le rétroportage de cette dernière.
cd /root/nvidia apt-get source python-pytools apt-get -y build-dep python-pytools cd /root/nvidia/pytools-*/ debuild cd .. ls -1 *.deb mv *.deb debian
python3-pytools_2013.5.7-1_all.deb python-pytools_2013.5.7-1_all.deb
cd /root/nvidia/debian dpkg -i python3-pytools_*.deb python-pytools_*.deb
cd /root/nvidia apt-get source pyopencl apt-get -y build-dep pyopencl cd /root/nvidia/pyopencl-*/ debuild cd .. ls -1 *.deb mv *.deb debian
Les paquets créés sont les suivants :
python3-pyopencl_2013.2-1_amd64.deb python3-pyopencl-dbg_2013.2-1_amd64.deb python-pyopencl_2013.2-1_amd64.deb python-pyopencl-dbg_2013.2-1_amd64.deb python-pyopencl-doc_2013.2-1_all.deb
Reinstallation 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
cd /root/nvidia/debian apt-get purge -y ocl-icd-libopencl1 amd-libopencl1:amd64 dpkg -i nvidia-libopencl1_*_amd64.deb dpkg -i --force-all $(ls *5.5.22-*.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-cache showsrc pycuda | grep ^Version: | head -1 | awk '{ print $2 }' | xargs -I '{}' apt-get source pycuda='{}' apt-get -y build-dep pycuda cd /root/nvidia/pycuda-*/ debuild cd .. ls -1 *.deb mv *.deb debian
python-pycuda_2012.1-1_amd64.deb python-pycuda-doc_2012.1-1_all.deb python-pycuda-headers_2012.1-1_all.deb
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 python-pyopencl-doc_*.deb
cd /root/nvidia/debian dpkg -i python-pycuda-*deb
python /usr/share/doc/python-pyopencl-doc/examples/benchmark.py
Sur une carte Quadro 4000 (et un Dell Precision 7500):
Execution time of test without OpenCL: 0.115163087845 s =============================================================== Platform name: AMD Accelerated Parallel Processing Platform profile: FULL_PROFILE Platform vendor: Advanced Micro Devices, Inc. Platform version: OpenCL 1.2 AMD-APP (923.1) --------------------------------------------------------------- Device name: Intel(R) Xeon(R) CPU X5650 @ 2.67GHz Device type: CPU Device memory: 48463 MB Device max clock speed: 1995 MHz Device compute units: 12 Device max work group size: 1024 Device max work item sizes: [1024, 1024, 1024] Data points: 8388608 Workers: 256 Preferred work group size multiple: 1 Execution time of test: 0.013031 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 4000 Device type: GPU Device memory: 2047 MB Device max clock speed: 950 MHz Device compute units: 8 Device max work group size: 1024 Device max work item sizes: [1024, 1024, 64] Data points: 8388608 Workers: 256 Preferred work group size multiple: 32 Execution time of test: 0.00134115 s Results OK
Sur une carte Quadro 2000 (et un Dell Precision M4600):
Execution time of test without OpenCL: 0.0773868560791 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: 2501 MHz Device compute units: 4 Device max work group size: 1024 Device max work item sizes: [1024, 1024, 1024] /usr/local/lib/python2.7/dist-packages/pyopencl-2012.2-py2.7-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) Data points: 8388608 Workers: 256 Preferred work group size multiple: 1 Execution time of test: 0.0163646 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 Device max work group size: 1024 Device max work item sizes: [1024, 1024, 64] Data points: 8388608 Workers: 256 Preferred work group size multiple: 32 Execution time of test: 0.00387338 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.
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