====== 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