Contexte
Pour exploiter la force de calcul de sa machine, cela n'est pas ardu. Il suffit de lancer la tâche souhaitée et d'attendre le résultat du calcul localement. En revanche, lorsque le calcul nécessaire est plus important, nécessitant plus d’une machine, la tâche paraît plus compliqué. En effet, chaque machine possède son environnement, sa configuration propre et son réseau. C'est pourquoi une norme tacite est apparue en 1993, proposée par un groupe de chercheurs lors de la convention des supercalculateurs car aucune norme n’existait auparavant. Encore aujourd’hui, aucune norme provenant d’organismes tel que ISO, l’IETF ou IEEE n’existe.
Pour obtenir une large compatibilité la convention utilise des objets identiques dans les langages de programmation qui disposent d’une correcte implémentation. Ce niveau d’abstraction rend la communication supportée sur n’importe quelle machine et langage respectant la convention.
Voici la liste ses avancés majeures de la norme MPI :
- MPI-1.0 : Création du standard
- MPI-2.0 : Amélioration des performances
- MPI-3.0 : Introduction du partage de mémoire parallélisé (i.e. lit la mémoire sur une autre machine du réseau)
- MPI-4.0 : Ajout de routines, opération collective persistantes et communications partitionnés
- MPI-5.0 : Introduction d’une ABI pour rendre compatible plusieurs langages entre-eux.
Objectifs
L’objectif principal de la norme MPI est de paralléliser la coût de la tâche entre plusieurs machines. L’ensemble de la librairie permet d’écrire du code facilement parallélisable et permet in fine de répartir la charge de chaque processus.
MPI n’est pas OpenMP
Pour bien comprendre, MPI fait communiquer les machines entre elles, on parle de CPU pour chaque machine. En 1993, les processeurs étaient pour la plus part monocœurs, maintenant chaque micro-ordinateur possède un processeur multicœur. C’est pourquoi OpenMP a vu le jour, cette libraire de macros offre la possibilité de paralléliser les tâches telle que les boucles entre les cœurs d’une seule machine. Là où MPI fait communiquer les machines, mais n’intervient pas sur l’usage distribué des cœurs d’une machine.
Terminologie
On va maintenant détailler les différents composants du modèle MPI.
Tout d’abord, concentrons-nous sur l’élément central du modèle, le communicateur, c’est lui qui permet de connecter les groupes de processus MPI, il les englobe afin de permettre la communication entre eux. Initialement on retrouve le communicateur MPI_COMM_WORLD qui englobent tout les processus existants, ces groupes peuvent être réorganisés en plusieurs groupes via MPI_Comm_split. Le communicateur permet aussi d’identifier chaque processus au sein de son groupe grâce à un identificateur, un rang, une étiquette et une couleur, la couleur correspondant au groupe auquel le processus appartient (si deux processus ont la même clé alors ils sont identifiés via leur rang).
Le modèle MPI vise à être utilisé au sein d’environnements hétérogènes, c’est à dire que chaque nœud puisse être sur un système ou encore langage de programmation différents possédant potentiellement des types de données différentes. En définissant leur propre types de données au sein des messages ils permettent une telle utilisation, on peut retrouver des types classiques tels que MPI_INT, MPI_CHAR, MPI_DOUBLE correspondant aux types int, char et double.
Intéressons nous désormais aux messages transmis et les différents types de transfert existants. Tout d’abord voyons la structure d’un message, celui-ci est composé d’une enveloppe avec le rang du processus émetteur, la source du message, le rang du processus récepteur, destination du message, l’étiquette du message, permet de transmettre un message seulement si l’étiquette match, et le communicateur qui gère le groupe. Ensuite le message en lui-même contient l’identificateur du processus émetteur de type de la donnée transmise, la longueur et l’identificateur du processus récepteur.
Maintenant comment ces messages sont-ils transférés au sein du modèle.
Il existe deux types de transferts:
- Point à point : Transfert d’un processus à un autre au sein du même groupe via des fonctions bloquantes (MPI_Send, MPI_Recv) ou non (MPI_Isend, MPI_Irecv) ou d’autres fonctions d’envoi / réception répondant à des besoins spécifiques comme par exemple MPI_Rsend qui bloque tant que le message n’est pas copié dans un tampon
- Collectif : Transfert à de multiples processus destinations, tels que MPI_Bcast qui transmet à tout les autres processus du groupe, MPI_Reduce permettant de faire des opération de réduction au sein d’un groupe (somme, produit, etc.), le résultat est retourner au processus racine (la source). On retrouve aussi des opérations concernant la gestion distribuées de tableaux avec MPI_Scatter et MPI_Gather qui permettant respectivement de diviser un tableau en portions
Conclusion
MPI est toujours, après les années, un outil efficace et performant usité massivement dans les calculs scientifiques. Sa flexibilité et compatibilité sur les différents systèmes est une force majeure de cette norme informatique. Dans un monde où la puissance de calcul est devenu cruciale notamment pour le développement d'intelligences artificielles précises, il est plus qu'obligatoire de disposer d'outils facilitant la parallélisation entre les machines et les langages (i.e. ABI).
N'hésitez pas à nous partager vos avis sur cette technologie 😀
Alors, Team MPI, OpenMP ou les deux 🤔
Références
- Open MPI - The Open MPI Project
- message passing interface (MPI) - TechTarget
- Notes OpenMP vs. MPI - Université de Lorraine
- MPI - Wikipédia
Auteurs
- CLEME Louis
- SIGNOURET Nathan