~~SLIDESHOW yatil~~
====== Intel MPI ======
En partie obsolète suite à la migration CALI2-B (2022)
L'implémentation Intel MPI est était la version MPI à utiliser préférentiellement sur CALI. La version utilisée par défaut est la version 5.0, qui implémente la norme MPI 3.0.
===== Références =====
Concernant la librairie Intel MPI :
* La documentation de référence est disponible chez Intel : https://software.intel.com/en-us/articles/intel-mpi-library-documentation
* Vous pouvez aussi la consulter sur CALI : http://cali2.unilim.fr/intel-mpi/Doc_Index.html
===== Réseau Infiniband =====
Pour comprendre pourquoi il est était préférable d'utiliser Intel MPI, il faut connaître [[:materiel-cali2#reseau_infiniband | le réseau Infiniband de notre cluster]]
* Les cartes de connexion au réseau Infiniband sont des //Host Channel Adapter// (HCA) ''QLogic IBA7322 QDR'' et le commutateur est un Intel True Scale 12300
* Ce réseau est basé sur l'architecture [[http://www.intel.com/content/www/us/en/infiniband/truescale-infiniband.html | Intel True Scale]]
* Pour obtenir la meilleure performance sur ce réseau, il faut utiliser la couche logicielle //Performance Scaled Messaging// (PSM)
* La librairie Intel MPI est configurée pour utiliser PSM (voir article [[Fabric]])
Depuis la migration en version CALI2-B (2022), les cartes Infiniband sont mal supportées et le mode ''PSM'' optimisé n'est plus disponible
==== Avantages de l'architecture True Scale ====
* Fonctionne en mode non connecté, assurant ainsi une plus faible latence
* Optimisation grâce à PSM, plus performant que la librairie //verbs// traditionnelle utilisée précédemment en Infiniband
===== Configurer votre environnement=====
* L'environnement pour utiliser les librairies MPI est paramétré sur CALI à travers des [[:modules]]
* Vous ne devez donc pas suivre la documentation d'Intel concernant la configuration de votre environnement (n'utilisez pas ''mpivars.sh'')
* Le module pour la dernière version stable d'Intel MPI est automatiquement chargé quand vous vous connectez à CALI
===== Compiler =====
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 :
* ''mpiifort'' pour utiliser le compilateur Intel Fortran ''ifort''
* ''mpiicc'' pour utiliser le compilateur Intel C/C%%++%% ''icc''
* ''mpigcc'' pour utiliser le compilateur GNU C
==== Thread ou pas threads ? ====
La compilation est faite par défaut avec la librairie MPI //threadée//.
==== Avec OpenMP ====
* Vous pouvez utiliser des appels MPI **à l'intérieur** de sections OpenMP
* **Mais** vous devez dans ce cas précis utiliser la version //thread-safe// de la librairie MPI via ''-mt_mpi''
* Notez bien que ce cas ne concerne pas les codes ayant des sections OpenMP dans des processus MPI sans appel MPI à l'intérieur de ces sections
===== Exécuter =====
* Sur notre cluster, l'exécution du code MPI est prise en charge par la commande ''srun''
* Au sein d'un fichier batch, la commande trouvera automatiquement le nombre adéquat de processus à lancer, en fonction des ressources demandées
* L'environnement est configuré via les //module// pour qu'Intel MPI utilise la librairie PMI (Process Management Interface) de slurm (variable ''I_MPI_PMI_LIBRARY'')
==== Fichier batch ====
Un exemple de fichier batch est disponible sur [[:slurm:slurm-mpi]]
===== Plus de détails =====
* L'article [[Fabric]] indique comment la librairie Intel MPI sélectionne la Fabric