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.
Concernant la librairie OpenMPI :
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)
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 :
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 :
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
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 mpixxxx
, 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++
#!/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
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