Exécuter LMDZ en parallèle sur PC linux

Quelques notes et conseils pour ceux qui souhaiteraient exécuter LMDZ en parallèle sur leur PC Linux multicoeur

Introduction

Cette note contient quelques conseils pour ceux qui veulent exécuter LMDZ en parallèle sur leur PC linux multicoeur, donc dans une configuration "personelle", par opposition au cas des machines des grands centres (IDRIS,CCRT, etc.) où tous les outils et environnements sont déjà en place (et prévus dans l'infrastructure de déploiement de LMDZ).

Avant de passer aux spécificités lié au parallélisme, il faut que le modèle soit installé sur la machine, par exemple via le script 'install.sh' (ainsi qu'expliqué ici) et que tout fonctionne correctement en mode séquentiel. Dans ce qui suit, on considère que le compilateur employé est gfortran et que la compilation se fera à l'aide du script fcm makelmd_fcm (rappel fcm n'est inclu avec les sources de LMDZ qu'à partir de la révision 1578 des sources).

Compilation et exécution en mode MPI seul

Prérequis: Une librairie MPI (par ex. MPICH, OpenMPI, etc.) doit être installée et disponible. Il est également préférable d'avoir la librairie BLAS installée (cela est impératif pour les versions de LMDZ antérieures à la révision 1601).

En supposant que 'mpif90' pointe sur le wrapper pour compiler (via gfortran) en MPI, que la librairie MPI soit installée dans '/my/mpi/directory/lib', que les fichiers à inclure (mpif.h) associés soient dans 'my/mpi/directory/include', et que la librairie BLAS soit installée dans '/my/blas/directory/lib', le fichier 'arch-local.fcm' adapté serait:

%COMPILER            mpif90
%LINK                mpif90
%AR                  ar
%MAKE                make
%FPP_FLAGS           -P -traditional
%FPP_DEF             NC_DOUBLE BLAS SGEMV=DGEMV SGEMM=DGEMM
%BASE_FFLAGS         -fdefault-real-8
%PROD_FFLAGS         -O3 -funroll-loops
%DEV_FFLAGS          -g -O1 -Wall
%DEBUG_FFLAGS        -g -O0 -Wall -fbounds-check -ffpe-trap=invalid,zero,overflow
%MPI_FFLAGS          -fcray-pointer -I/my/mpi/directory/include
%OMP_FFLAGS         
%BASE_LD             -L/my/blas/directory/lib -lblas
%MPI_LD -L/my/mpi/directory/lib -lmpi
%OMP_LD             

La compilation du GCM se fera avec:

makelmdz_fcm -arch local -parallel mpi ......

Et l'exécution, sur N processus (N=4 dans l'exemple qui suit):

mpiexec -np 4 gcm_32x24x11_phylmd_para.e

Remarque: Lors d'une exécution en mode MPI, les fichiers de sortie de la physique sont segmentés (1 fichier par processus) et il faut par la suite les recombiner à l'aide de l'utilitaire 'rebuild', ainsi qu'expliqué ici.

Compilation et exécution en mode OpenMP seul

Prérequis: Il est préférable d'avoir la librairie BLAS installée (cela est impératif pour les versions de LMDZ antérieures à la révision 1601).

En supposant que la librairie BLAS soit installée dans '/my/blas/directory/lib', et que le compilateur employé est 'gfortran', le fichier 'arch-local.fcm' adapté serait:

%COMPILER            gfortran
%LINK                gfortran
%AR                  ar
%MAKE                make
%FPP_FLAGS           -P -traditional
%FPP_DEF             NC_DOUBLE BLAS SGEMV=DGEMV SGEMM=DGEMM
%BASE_FFLAGS -fdefault-real-8
%PROD_FFLAGS         -O3 -funroll-loops
%DEV_FFLAGS          -g -O1 -Wall
%DEBUG_FFLAGS        -g -O0 -Wall -fbounds-check -ffpe-trap=invalid,zero,overflow
%MPI_FFLAGS          
%OMP_FFLAGS          -fcray-pointer -fopenmp
%BASE_LD             -L/my/blas/directory/lib -lblas
%MPI_LD
%OMP_LD              -fopenmp

La compilation du GCM se fera avec:

makelmdz_fcm -arch local -parallel omp ......

Et l'exécution, répartie sur X taches OpenMP (X=4 dans l'exemple qui suit):

export OMP_NUM_THREADS=4
./gcm_48x36x19_phylmd_para.e

Remarques: Pour éviter des problèmes de mémoire trop faible mise à disposition des différentes tâches OpenMP (pour que ces dernières stockent leurs variables privées), il est recommandé de disposer du maximum de "mémoire stack" possible. En pratique, faire un

ulimit -s unlimited

(cette ligne peut être mise dans un .bashrc pour être systématiquement imposée). Il peut aussi être nécessaire d'augmenter la taille de la mémoire stack allouée à chaque tâche OpenMP, avec

export OMP_STACKSIZE=200M

Compilation et exécution en mode mixte MPI/OpenMP

Tout ce qui est dit ci-dessus sur les cas MPI et OpenMP se cumule.

Le fichier 'arch-local.fcm' adapté serait donc:

%COMPILER            mpif90
%LINK                mpif90
%AR                  ar
%MAKE                make
%FPP_FLAGS           -P -traditional
%FPP_DEF             NC_DOUBLE BLAS SGEMV=DGEMV SGEMM=DGEMM
%BASE_FFLAGS         -fdefault-real-8
%PROD_FFLAGS         -O3 -funroll-loops
%DEV_FFLAGS          -g -O1 -Wall
%DEBUG_FFLAGS        -g -O0 -Wall -fbounds-check -ffpe-trap=invalid,zero,overflow
%MPI_FFLAGS          -fcray-pointer -I/my/mpi/directory/include
%OMP_FFLAGS          -fopenmp
%BASE_LD             -L/my/blas/directory/lib -lblas
%MPI_LD -L/my/mpi/directory/lib -lmpi
%OMP_LD              -fopenmp

La compilation du GCM se ferait avec:

makelmdz_fcm -arch local -parallel mpi_omp ......

Et l'exécution, sur N processus (N=4 dans l'exemple qui suit) et X tâches (X=2 dans l'exemple qui suit):

export OMP_NUM_THREADS=2
mpiexec -np 4 gcm_32x24x11_phylmd_para.e


Dernières modifications: 19 octobre 2012