Installation de LAMMPS sur GPU sur Debian Wheezy

En construction

Lammps est disponible en version 20120615 dans la distribution Wheezy.

Lammps est également disponible dans sa 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

apt-get install -y gfortran g++ libquadmath0 libblas3 liblapack3 libgfortran3 liblapack-dev openmpi-bin libopenmpi-dev

Téléchargement

Toutes les commandes sont à effectuer comme root

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é :

  1. Récupération de la dernière version sur le site de Sandia :
    cd /root
    wget -m -nd http://lammps.sandia.gov/tars/lammps.tar.gz
  2. Ouverture de l'archive :
    cd /opt
    tar xzf /root/lammps.tar.gz
  3. Changement des droits :
    chown -R root.root $(tar tzf /root/lammps.tar.gz | tail -1 | awk -F'/' '{ print $1 }')
  4. Etablissement d'un lien générique :
    [ -h lammps ] && rm lammps
    ln -sf $(tar tzf /root/lammps.tar.gz | tail -1 | awk -F'/' '{ print $1 }') lammps

Par la récupération de l'arbre SVN, plutôt conseillé maintenant :

  1. Récupération de l'arbre SVN sur le site de Sandia :
    cd /opt
    svn co svn://svn.icms.temple.edu/lammps-ro/trunk lammps-$(date "+%Y%m%d")
  2. Etablissement d'un lien générique :
    [ -h lammps ] && rm lammps
    ln -sf lammps-$(date "+%Y%m%d") lammps

La suite, c'est commun :

  1. Passer dans l'archive :
    cd lammps
  2. Paramétrer une variable de racine pour Lammps :
    export LAMMPSROOT=$(pwd)
  3. Préparer le MPI local :
    cd $LAMMPSROOT/src/STUBS
    make clean
    make

Préparation des librairies connexes

  1. Compilation de la librairie MEAM:
    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
  2. Compilation de la librairie COLVAR
    cd $LAMMPSROOT/lib/colvars
    make -f Makefile.g++ clean
    make -f Makefile.g++
  3. Compilation de la librairie POEMS
    cd $LAMMPSROOT/lib/poems
    make -f Makefile.g++ clean
    make -f Makefile.g++
  4. Compilation de la librairie REAX :
    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 
  5. Compilation de la librairie AWPMD
    cd $LAMMPSROOT/lib/awpmd
    sed -i "s/mpic++/mpic++.openmpi/g" Makefile.openmpi
    make -f Makefile.openmpi clean
    make -f Makefile.openmpi

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 :

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

Activation des modules

Compiler les éléments indispensables pour exécuter les exemples :

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

Compilation basique

Preparation de la librairie ATC couplée

cd $LAMMPSROOT/lib/atc
sed -e 's/\-O\ \-g/\-O\ \-g \-fpermissive/' -i~ Makefile.serial
make -f Makefile.serial clean
make -f Makefile.serial

Preparation de la librairie GPU couplée

Si les composants sont ceux des paquets Debian Wheezy, bindés dans /tmp/cuda

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

Compilation sans MPI

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

Si la compilation est réussie, un exécutable lmp_cuda, se trouve à la racine du dossier.

Compilation avec FFTW

Installation préliminaire

sudo apt-get install -y fftw3 fftw-dev

Preparation de la librairie ATC couplée

cd $LAMMPSROOT/lib/atc
sed -e 's/\-O\ \-g/\-O\ \-g \-fpermissive/' -i~ Makefile.serial
make -f Makefile.serial clean
make -f Makefile.serial

Preparation de la librairie GPU couplée

Si les composants sont ceux des paquets Debian Wheezy, bindés dans /tmp/cuda

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

Préparation du Makefile

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

Compilation

# lancer la compilation
make cuda_fftw

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

sudo apt-get install -y libopenmpi-dev openmpi-bin libopenmpi1.3 openmpi-common
sudo apt-get install -y libfftw3-3  fftw-dev

Préparation du Makefile pour ATC

# 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++

Préparation du Makefile pour GPU

La librairie GPU doit être compilée en fonction du GPU à disposition : Nvidia fournit un tableau dans sa 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 :

CUDA_ARCH = -arch=sm_30

Si les composants sont ceux des paquets Debian Wheezy, bindés dans /tmp/cuda

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
# Modification du compilateur mpic++ (force a OpenMPI)
sed -i "s/mpic++/mpic++.openmpi/g" Makefile.linux
make -f Makefile.linux clean
make -j 4 -f Makefile.linux
./nvc_get_devices

Préparation du Makefile

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

Compilation

cd $LAMMPSROOT/src
make -j 4 cuda_openmpi

Si la compilation est réussie, un exécutable lmp_cuda_openmpi, se trouve à la racine du dossier.

Vérification de fonctionnement

La page Tools4Test et plus précisemment celle liée à Lammps détaille comment installer Lammps dans son environnement personnel (au CBP) et lancer quelques exemples.

developpement/activites/integration/lammpsgpu4wheezy.txt · Dernière modification: 2015/01/07 10:04 (modification externe)