~~SLIDESHOW yatil~~
====== OpenMPI avec GCC ======
En cours de rédaction
L'implémentation OpenMPI n'est pas la version MPI à utiliser préférentiellement sur CALI.
Cependant, nous décrivons ici son fonctionnement général, et la méthode pour l'utiliser sur CALI avec la suite de développement //GNU Compiler Collection//.
Les versions OpenMPI disponibles :
* 1.8.2 : version d'origine datant de l'installation du cluster
* 1.10.7
===== Références =====
Concernant la librairie OpenMPI :
* Site web : https://www.open-mpi.org/
===== OpenMPI et Slurm =====
OpenMPI est compilé avec le support de PMI (//Process Management Interface//). Voir [[..:lancement]]
En résumé, PMI permet de laisser Slurm lancer les processus, via la commande ''srun'' en général. La phase d'initialisation MPI découvrira les autres processus grâce à des appels à la librairie PMI (livrée avec Slurm)
===== Réseau Infiniband =====
https://www.open-mpi.org/faq/?category=tuning
OpenMPI est construit sous forme d'une architecture modulaire (//Modular Component Architecture -- MCA//). Cette architecture permet de construire dynamiquement, à l'exécution, les modules utilisés par un processus. La librairie est divisé en 3 parties :
* OMPI : partie MPI
* ORTE : run-time layer
* OPAL : operating system / platform layer
Pour chacune de ces parties, il y a plusieurs //frameworks//, pour gérer tel ou tel aspect. Chaque framework contiendra 0 ou plusieurs //Components//, chacun avec un ou plusieurs //modules// (instances).
Pour en revenir au réseau Infiniband :
* OpenMPI peut utiliser le réseau Infiniband, à travers l'implémentation OpenFabrics
* le choix de la Fabric est pris par le framework //btl// : on peut indiquer, à l'exécution, de charger tel ou tel //component// (tcp, openib, ...) pour ce framework
Mais en simplifié : normalement, OpenMPI est "intelligent" et sélectionne automatiquement la Fabric la plus rapide, donc Infiniband, si celle-ci est disponible, et passera uniquement en TCP sinon.
Voir https://www.open-mpi.org/faq/?category=tcp#tcp-auto-disable
===== Compiler avec GCC + OpenMPI =====
Il faut d'abord décharger les modules Intel, charger l'implémentation OpenMPI en choisissant la version souhaitée :
module unload configuration
module load mpi/openmpi/1.8.2-gcc64
La commande ''ompi_info'' donne des infos sur la librairie OpenMPI, dont les modules disponibles.
Pour compiler votre programme MPI, il faut utiliser les commandes ''mpi//xxxx//'', où ''//xxxx//'' est le nom du "vrai" compilateur que vous désirez utiliser. Exemples :
* ''mpifort'' pour utiliser le compilateur GNU Fortran ''fort''
* ''mpicc'' pour utiliser le compilateur GNU C ''gcc''
* ''mpiCC'' pour utiliser le compilateur GNU C++ ''g++''
===== Exécuter =====
==== Fichier batch ====
#!/bin/bash
#
#SBATCH --ntasks=4
#SBATCH --time 00:01:00
#SBATCH --mem-per-cpu=9000
#SBATCH --partition=normal
module unload configuration
module load mpi/openmpi/1.8.2-gcc64
mpirun ./hello_mpi
==== Alternative ====
Pour un job distribué, on peut aussi utiliser ''srun''. Ne fonctionne pas si 2 processus sont sur le même noeud physique (pb inititialisation communication par SHM)
eval export `mpirun env | grep OMPI_MCA_orte_precondition_transports`
srun ./hello_mpi