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