Message Passing Interface (MPI)

Message Passing Interface (MPI)

Le Message Passing Interface est un standard de communication utilisé dans la programmation parallèle pour permettre à des processus distincts de partager des informations et de coopérer entre eux pour résoudre pour résoudre des problèmes complexes.

Son utilisation est préférée à celle des fonctionnalités offertes par les systèmes d’exploitations pour les raisons suivantes :

  • Sur des machines de HPC, ou même sur des clusters haut-de-gamme, le réseau est parfois « exotique » (Infiniband, Omnipath, réseaux spéciaux sur machines IBM ou Fujitsu). L’utilisation des bibliothèques MPI permet de ne pas avoir à se préoccuper de la nature précise de l’infrastructure matérielle dans les applications.
  • Les bibliothèques MPI simplifient (entre autre) le problème du nommage des machines : elles sont numérotées de 0 à n − 1. Plus besoin de gérer leur URL ou leur adresse IP.
  • Les bibliothèques MPI offrent des fonctionnalités que les OS n’offrent pas, en particulier des fonctions de communications collectives, auxquelles participent non pas deux, mais toutes les machines du groupe.
  • Sur les machines conçues pour le calcul haute-performance, et équipées de réseaux spéciaux, des bibliothèques MPI adaptées peuvent exploiter le matériel au mieux de ses possibilités sans que l’application soit modifiée, ni même recompilée.

Il permet de gérer entre autre :

  • l’environnement d’exécution
  • les communications point à point (Send, Recv)
  • les communications collectives (Bcast, Reduce, Scatter,...)
  • les groupes de processus et les communicateurs
  • la topologie d’inter-connexion des processus(grilles, arbres,...)

Mode de fonctionnement

MPI est fourni sous forme de bibliothèques pour les langages C/C++ et Fortran.

Le programme MPI démarre en appelant la fonction MPI_Init pour configurer l'environnement de communication. Une fois l’environnement MP I initialisé, on dispose d’un ensemble de processus actifs et d’un espace de communication au sein duquel sont effectuées des opérations MPI. Ce couple (processus actifs, espace de communication) est appelé communicateur.

Le communicateur par défaut est MPI_COMM_WORLD et comprend tous les processus actifs. Il est initialisé lors de l’appel à la fonction MPI_INIT() et désactivé par l’appel à la fonction MPI_FINALIZE().

On peut connaître le nombre de processus actifs gérés par un communicateur avec la fonction MPI_COMM_SIZE(comm, nb_procs, code) ainsi que le rang (ou numéro) d’un processus avec la fonction MPI_COMM_RANK (comm, rang, code).

Ce mode de fonctionnement comprend les étapes suivantes :

  • Initialisation : Le programme MPI démarre en appelant la fonction MPI_Init pour configurer l'environnement de communication.

  • Identification des processus : Une fois que l’environnement d’exécution qui accompagne une bibliothèque MPI a lancé plusieurs processus (éventuellement sur plusieurs machines), chacun de ces processus se voit attribuer un numéro, qui est son rang. Ces numéros servent d’adresse au sein des opérations MPI : quand on envoie un message à quelqu’un, on indique le rang de la destination.

    Le rang d’un processus est en fait son rang au sein d’un communicateur donné (on verra plus tard comment partitionner un communicateur en plusieurs morceaux). La « numérotation » des processus à laquelle il a été fait allusion ci-dessus correspond en fait aux rangs dans MPI_COMM_WORLD.

  • Communication :

    Les processus échangent des données à l'aide de fonctions comme MPI_Send et MPI_Recv. Ces Communications sont fiables et tout message émis est reçu exactement une fois (ni perte, ni duplication). Il utilise FIFO (First In – First Out) comme mode de communication c'est-à-dire, si m est envoyé avant m', alors m est reçu avant m'.

    Ces communications peuvent être :

    • communication synchrone / asynchrone
    • communication bloquante / non bloquante
  • Synchronisation : MPI offre des mécanismes tels que MPI_Barrier pour synchroniser l'exécution des processus à des points spécifiques du programme de sorte à s'assurer que tous les processus atteignent un point donné du programme avant de continuer.

  • Finalisation : Une fois les tâches accomplies, le programme se termine en appelant MPI_Finalize pour finaliser l'environnement.

Conclusion

En conclusion, MPI offre des outils robustes pour la communication entre processus en programmation parallèle. Les modes point à point et collectif permettent une coordination efficace, essentielle pour résoudre des problèmes complexes sur des systèmes distribués. La norme MPI facilite ainsi le développement d'applications hautement performantes et parallèles.

Sources :