====== Programmation en C avec MPI ======
===== Exemple de code C utilisant MPI =====
Un exemple (très simple) de code C utilisant MPI est disponible [[http://fc.isima.fr/~toussain/docWiki/MPI/hello.c|ici]].
Pour le compiler ajoutez les lignes suivantes dans votre fichier .bashrc
if ! (which mpicc>/dev/null 2>&1) && [ -d /usr/lib64/openmpi ]; then
export PATH=/usr/lib64/openmpi/bin:$PATH
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/lib64/openmpi/lib
fi
Elles permettent de compiler et //linker// avec la bonne version de MPI.
Compilation : mpicc hello.c -o hello
===== Script pour lancer un programme MPI sur un seul noeud =====
SLURM est fait pour fonctionner avec MPI. Par défaut, il lancera autant de processus que de cœurs réservés avec l'option ''--ntasks''.
Le script suivant exécute le programme précédent sur un seul noeud :
#!/bin/bash
# ============= options de sbatch (ici réservation de 32 cores)==================
#SBATCH --ntasks=32 # 32 tasks => 32 processus en parallèle
#SBATCH --ntasks-per-core=1 # on met une seule task par CPU
# =====================ligne de commande ==================================
mpirun ./exe
Remarque : On peut utiliser l'option **bind-to-core** de **mpirun** pour attacher les processus MPI sur les cœurs.
===== Script pour lancer un programme MPI en parallèle sur plusieurs noeuds =====
L'intérêt de la bibliothèque MPI est de pouvoir utiliser plusieurs noeuds en parallèle. Le script suivant montre comment lancer 16 processus en parallèle répartis sur 4 noeuds. Il nécessite de créer au préalable un fichier [[http://fc.isima.fr/~toussain/docWiki/MPI/machine|machine]] qui contient la liste des machines à utiliser par MPI avec le nombre de processus à lancer sur chacune.
Les options données à SLURM doivent être cohérentes avec les informations contenues dans le fichier machine.
#!/bin/bash
#SBATCH --ntasks=16
#SBATCH --ntasks-per-core=1
#SBATCH --job-name=testMPI
#SBATCH --nodelist=node22,node23,node24,node25
#le fichier machine contient la liste des machines à utiliser
#elle doit être la même que celle définie par nodelist
mpiexec -machinefile machine ./hello
#REMARQUE 1 : ntasks doit être exactement égal au nb de threads désirés qui doit être égal au nombre de slots
#total défini dans le fichier machine
#REMARQUE 2 : tous les noeuds sur lesquels vont s'exécuter le programme doivent faire partie de la même partition