Ci-dessous, les différences entre deux révisions de la page.
developpement:activites:integration:lammpsgpu4wheezy [2013/11/08 08:59] equemene [Préparation des librairies connexes] |
developpement:activites:integration:lammpsgpu4wheezy [2015/01/07 10:04] |
||
---|---|---|---|
Ligne 1: | Ligne 1: | ||
- | * [[developpement:activites:integration|Integration]] | ||
- | |||
- | ====== Installation de LAMMPS sur GPU sur Debian Wheezy ====== | ||
- | |||
- | <note important>En construction</note> | ||
- | |||
- | Lammps est disponible en [[http://packages.debian.org/stable/main/lammps|version 20120615]] dans la distribution Wheezy. | ||
- | |||
- | Lammps est également disponible dans sa [[http://packages.debian.org/unstable/main/lammps|version 20130503]] dans la Sid au 22 mai 2013 : un rétroportage simple suffit à sa compilation. | ||
- | |||
- | Pour cependant disposer d'une version exploitant les GPU, il est nécessaire de le recompiler soi-même pour dans le cadre d'applications très spécifiques. | ||
- | |||
- | ===== Préparation du système ===== | ||
- | |||
- | <code> | ||
- | apt-get install -y gfortran g++ libquadmath0 libblas3 liblapack3 libgfortran3 liblapack-dev openmpi-bin libopenmpi-dev | ||
- | </code> | ||
- | |||
- | ===== Téléchargement ===== | ||
- | |||
- | <note important>Toutes les commandes sont à effectuer comme ''root''</note> | ||
- | |||
- | Alors, à l'origine, c'était plus simple de récupérer l'archive et de compiler LAMMPS à partir des sources récupérées dans ce bloc... Mais la version du 30 septembre archivée ne COMPILE PAS DU TOUT ! | ||
- | |||
- | Par la récupération de l'archive directement, plutôt déconseillé : | ||
- | - Récupération de la [[http://lammps.sandia.gov/download.html|dernière version]] sur le site de Sandia : <code>cd /root | ||
- | wget -m -nd http://lammps.sandia.gov/tars/lammps.tar.gz</code> | ||
- | - Ouverture de l'archive :<code>cd /opt | ||
- | tar xzf /root/lammps.tar.gz</code> | ||
- | - Changement des droits : <code>chown -R root.root $(tar tzf /root/lammps.tar.gz | tail -1 | awk -F'/' '{ print $1 }')</code> | ||
- | - Etablissement d'un lien générique : <code>[ -h lammps ] && rm lammps | ||
- | ln -sf $(tar tzf /root/lammps.tar.gz | tail -1 | awk -F'/' '{ print $1 }') lammps</code> | ||
- | |||
- | |||
- | Par la récupération de l'arbre SVN, plutôt conseillé maintenant : | ||
- | - Récupération de l'arbre SVN sur le site de Sandia : <code>cd /opt | ||
- | svn co svn://svn.icms.temple.edu/lammps-ro/trunk lammps-$(date "+%Y%m%d")</code> | ||
- | - Etablissement d'un lien générique : <code>[ -h lammps ] && rm lammps | ||
- | ln -sf lammps-$(date "+%Y%m%d") lammps</code> | ||
- | |||
- | La suite, c'est commun : | ||
- | - Passer dans l'archive :<code>cd lammps</code> | ||
- | - Paramétrer une variable de racine pour Lammps : <code>export LAMMPSROOT=$(pwd)</code> | ||
- | - Préparer le MPI local :<code>cd $LAMMPSROOT/src/STUBS | ||
- | make clean | ||
- | make | ||
- | </code> | ||
- | ===== Préparation des librairies connexes ===== | ||
- | |||
- | - Compilation de la librairie MEAM:<code> | ||
- | cd $LAMMPSROOT/lib/meam | ||
- | make -f Makefile.gfortran clean | ||
- | make -f Makefile.gfortran | ||
- | mv Makefile.lammps Makefile.lammps.intel | ||
- | ln -s Makefile.lammps.gfortran Makefile.lammps</code> | ||
- | - Compilation de la librairie COLVAR<code> | ||
- | cd $LAMMPSROOT/lib/colvars | ||
- | make -f Makefile.g++ clean | ||
- | make -f Makefile.g++</code> | ||
- | - Compilation de la librairie POEMS<code> | ||
- | cd $LAMMPSROOT/lib/poems | ||
- | make -f Makefile.g++ clean | ||
- | make -f Makefile.g++</code> | ||
- | - Compilation de la librairie REAX :<code> | ||
- | cd $LAMMPSROOT/lib/reax | ||
- | make -f Makefile.gfortran clean | ||
- | make -f Makefile.gfortran | ||
- | mv Makefile.lammps Makefile.lammps.intel | ||
- | ln -s Makefile.lammps.gfortran Makefile.lammps </code> | ||
- | - Compilation de la librairie AWPMD<code>cd $LAMMPSROOT/lib/awpmd | ||
- | sed -i "s/mpic++/mpic++.openmpi/g" Makefile.openmpi | ||
- | make -f Makefile.openmpi clean | ||
- | make -f Makefile.openmpi | ||
- | </code> | ||
- | |||
- | Généralement, les librairies Cuda manuellement installées le sont dans ''/opt/cuda''. Sur Debian Wheezy, les composants de Cuda (librairies, prototypes et binaires) sont installés respectivement dans les dossiers ''/usr/lib/x86_64-linux-gnu'', ''/usr/include'', ''/usr/bin''. Pour simplifier la modification, nous allons créer un dossier ''/tmp/cuda'' pointant vers ces trois composants : | ||
- | <code> | ||
- | mkdir /tmp/cuda | ||
- | ln -s /usr/lib/x86_64-linux-gnu /tmp/cuda/lib64 | ||
- | ln -s /usr/include/ /tmp/cuda/include | ||
- | ln -s /usr/bin /tmp/cuda/bin | ||
- | </code> | ||
- | ===== Activation des modules ===== | ||
- | |||
- | Compiler les éléments indispensables pour exécuter les exemples :<code>cd $LAMMPSROOT/src | ||
- | # activation de tous les modules | ||
- | make yes-all | ||
- | # suspension d'un module très specifique | ||
- | make no-user-cuda | ||
- | # suspension des modules qui font peter la compilation :-\ | ||
- | make no-voronoi | ||
- | make no-user-reaxc | ||
- | make no-kim | ||
- | make no-user-omp | ||
- | </code> | ||
- | ===== Compilation basique===== | ||
- | |||
- | === Preparation de la librairie ATC couplée === | ||
- | |||
- | <code> | ||
- | cd $LAMMPSROOT/lib/atc | ||
- | sed -e 's/\-O\ \-g/\-O\ \-g \-fpermissive/' -i~ Makefile.serial | ||
- | make -f Makefile.serial clean | ||
- | make -f Makefile.serial | ||
- | </code> | ||
- | |||
- | === Preparation de la librairie GPU couplée === | ||
- | |||
- | Si les composants sont ceux des paquets Debian Wheezy, bindés dans ''/tmp/cuda'' | ||
- | <code> | ||
- | cd $LAMMPSROOT/lib/gpu | ||
- | sed -i 's/^CUDA_HOME/CUDA_HOME\ = \/tmp\/cuda\n#CUDA_HOME/g' Makefile.serial | ||
- | make -f Makefile.serial clean | ||
- | make -f Makefile.serial | ||
- | ./nvc_get_devices | ||
- | </code> | ||
- | |||
- | === Compilation sans MPI === | ||
- | |||
- | <code> | ||
- | cd $LAMMPSROOT/src/MAKE | ||
- | cp Makefile.serial Makefile.cuda | ||
- | cd $LAMMPSROOT/src | ||
- | make yes-asphere | ||
- | make yes-kspace | ||
- | make yes-gpu | ||
- | # lancer la compilation | ||
- | make cuda | ||
- | </code> | ||
- | |||
- | Si la compilation est réussie, un exécutable ''lmp_cuda'', se trouve à la racine du dossier. | ||
- | |||
- | ===== Compilation avec FFTW ===== | ||
- | |||
- | === Installation préliminaire === | ||
- | |||
- | <code> | ||
- | sudo apt-get install -y fftw3 fftw-dev | ||
- | </code> | ||
- | |||
- | |||
- | === Preparation de la librairie ATC couplée === | ||
- | |||
- | <code> | ||
- | cd $LAMMPSROOT/lib/atc | ||
- | sed -e 's/\-O\ \-g/\-O\ \-g \-fpermissive/' -i~ Makefile.serial | ||
- | make -f Makefile.serial clean | ||
- | make -f Makefile.serial | ||
- | </code> | ||
- | |||
- | === Preparation de la librairie GPU couplée === | ||
- | |||
- | Si les composants sont ceux des paquets Debian Wheezy, bindés dans ''/tmp/cuda'' | ||
- | <code> | ||
- | cd $LAMMPSROOT/lib/gpu | ||
- | sed -i 's/^CUDA_HOME/CUDA_HOME\ = \/tmp\/cuda\n#CUDA_HOME/g' Makefile.serial | ||
- | make -f Makefile.serial clean | ||
- | make -f Makefile.serial | ||
- | ./nvc_get_devices | ||
- | </code> | ||
- | |||
- | === Préparation du Makefile === | ||
- | |||
- | <code>cd $LAMMPSROOT/src/MAKE | ||
- | cp Makefile.serial Makefile.cuda_fftw | ||
- | sed -i "s/FFT_INC\ =/FFT_INC\ =\ -DFFT_FFTW3/g" Makefile.cuda_fftw | ||
- | sed -i "s/FFT_LIB\ =/FFT_LIB\ =\ -lfftw3/g" Makefile.cuda_fftw | ||
- | cd $LAMMPSROOT/src | ||
- | make yes-asphere | ||
- | make yes-kspace | ||
- | make yes-gpu | ||
- | </code> | ||
- | |||
- | === Compilation === | ||
- | |||
- | <code> | ||
- | # lancer la compilation | ||
- | make cuda_fftw | ||
- | </code> | ||
- | |||
- | Si la compilation est réussie, un exécutable ''lmp_cuda_fftw'', se trouve à la racine du dossier. | ||
- | |||
- | ===== Compilation avec FFTW et OpenMPI ===== | ||
- | |||
- | === Installation préliminaire === | ||
- | |||
- | <code> | ||
- | sudo apt-get install -y libopenmpi-dev openmpi-bin libopenmpi1.3 openmpi-common | ||
- | sudo apt-get install -y libfftw3-3 fftw-dev | ||
- | </code> | ||
- | |||
- | === Préparation du Makefile pour ATC === | ||
- | |||
- | <code># Preparation de la librairie ATC couplée avec MPI | ||
- | cd $LAMMPSROOT/lib/atc | ||
- | cp Makefile.serial Makefile.mpic++ | ||
- | sed -i "s/g++/mpic++.openmpi/g" Makefile.mpic++ | ||
- | sed -i "s/\-fpermissive/-fpermissive\ \-DMPICH_IGNORE_CXX_SEEK/g" Makefile.mpic++ | ||
- | |||
- | make -f Makefile.mpic++ clean | ||
- | make -f Makefile.mpic++ | ||
- | </code> | ||
- | |||
- | === Préparation du Makefile pour GPU === | ||
- | |||
- | Il est nécessaire de compiler la librarie associée au GPU : cette dernière doit être compilée en fonction du GPU à disposition : Nvidia fournit un tableau dans sa [[https://www.clear.rice.edu/comp422/resources/cuda/html/cuda-compiler-driver-nvcc/index.html|documentation]] permettant de choisir en fonction de sa carte. Le fichier à modifier est ''$LAMMPSROOT/lib/gpu/Makefile.linux''. | ||
- | |||
- | Ce qu'il faut retenir : | ||
- | * Pour une carte Tesla | ||
- | * sm_10 : basique | ||
- | * sm_11 : opérations atomiques en mémoire globale | ||
- | * sm_12 : opérations atomiques en mémoire partagée | ||
- | * sm_13 : support de la double précision | ||
- | * Pour une carte Fermi : | ||
- | * sm_20 | ||
- | * sm_21 | ||
- | * Pour une carte Kepler : | ||
- | * sm_30 | ||
- | * sm_35 | ||
- | |||
- | Par exemple, une carte GTX Titan est équipé d'un circuit Kepler. Nous avons donc :<code>CUDA_ARCH = -arch=sm_30 | ||
- | </code> | ||
- | |||
- | Si les composants sont ceux des paquets Debian Wheezy, bindés dans ''/tmp/cuda'' | ||
- | <code> | ||
- | cd $LAMMPSROOT/lib/gpu | ||
- | # Modification de la racine de CUDA | ||
- | sed -i 's/^CUDA_HOME/CUDA_HOME\ = \/tmp\/cuda\n#CUDA_HOME/g' Makefile.linux | ||
- | # Modification de l'architecture (ici une Kepler) | ||
- | sed -i 's/^CUDA_ARCH/# Kepler CUDA\nCUDA_ARCH\ =\ \-arch\=sm_30\n#CUDA_ARCH/g' Makefile.linux | ||
- | make -f Makefile.linux clean | ||
- | make -j 4 -f Makefile.linux | ||
- | ./nvc_get_devices | ||
- | </code> | ||
- | |||
- | === Préparation du Makefile === | ||
- | |||
- | <code>cd $LAMMPSROOT/src/MAKE | ||
- | cp Makefile.openmpi Makefile.cuda_openmpi | ||
- | sed -i "s/mpic++/mpic++.openmpi/g" Makefile.cuda_openmpi | ||
- | sed -i "s/FFT_INC\ =/FFT_INC\ =\ -DFFT_FFTW3/g" Makefile.cuda_openmpi | ||
- | sed -i "s/FFT_LIB\ =/FFT_LIB\ =\ -lfftw3/g" Makefile.cuda_openmpi | ||
- | cd $LAMMPSROOT/src | ||
- | make yes-asphere | ||
- | make yes-kspace | ||
- | make yes-gpu | ||
- | </code> | ||
- | |||
- | === Compilation === | ||
- | |||
- | <code>cd $LAMMPSROOT/src | ||
- | make -j 4 cuda_openmpi</code> | ||
- | |||
- | Si la compilation est réussie, un exécutable ''lmp_cuda_openmpi'', se trouve à la racine du dossier. | ||
- | ===== Vérification de fonctionnement ===== | ||
- | |||
- | La page [[http://www.cbp.ens-lyon.fr/emmanuel.quemener/dokuwiki/doku.php?id=tools4test|Tools4Test]] et plus précisemment celle liée à | ||
- | [[http://www.cbp.ens-lyon.fr/emmanuel.quemener/dokuwiki/doku.php?id=tools4test#lammps|Lammps]] détaille comment installer Lammps dans son environnement personnel (au CBP) et lancer quelques exemples. | ||
- | |||