# Message Passing Interface

Message Passing Interface (MPI) est un outil pour le calcul scientifique à haute performance qui permet d'utiliser plusieurs ordinateurs.
C'est une norme conçue en 1993-94 pour le passage de messages entre ordinateurs distants ou dans un ordinateur multiprocesseur. Elle est devenue de facto un standard de communication pour des nœuds exécutant des programmes parallèles sur des systèmes à mémoire distribuée. Elle définit une bibliothèque de fonctions, utilisable avec les langages C, C++ et Fortran.
MPI a été écrite pour obtenir de bonnes performances aussi bien sur des machines massivement parallèles à mémoire partagée que sur des clusters d'ordinateurs hétérogènes à mémoire distribuée. Elle est disponible sur de très nombreux matériels et systèmes d'exploitation. Ainsi, MPI possède l'avantage par rapport aux plus vieilles bibliothèques de passage de messages d'être grandement portable (car MPI a été implémentée sur presque toutes les architectures de mémoires) et rapide (car chaque implémentation a été optimisée pour le matériel sur lequel il s'exécute).
Depuis 1997, une nouvelle version de MPI est disponible, MPI-2, qui apporte quelques puissantes fonctionnalités supplémentaires.
Depuis 2015, une nouvelle version de MPI est disponible, MPI-3, qui apporte des écritures parallèles dans les fichiers.
Depuis 2020, une nouvelle version de MPI est disponible, MPI-4, qui apporte le RDMA et la prévision de détection automatique en cas de panne. (MPI Forum)

## Concepts
### Communicateurs

Un communicateur désigne un ensemble de processus pouvant communiquer ensemble, et deux processus ne pourront communiquer que s'ils sont dans un même communicateur. Un communicateur initial englobe tous les processus (MPI_COMM_WORLD), qu'il est possible de subdiviser en communicateurs plus petits correspondant à des entités logiques. Il existe deux types de communicateurs : les intracommunicateurs et les intercommunicateurs. Les intracommunicateurs sont les communicateurs standards, alors que les intercommunicateurs servent à créer un pont entre deux intracommunicateurs. MPI-2 améliore grandement l'usage des intercommunicateurs en leur permettant de réaliser des communications collectives.

### Communications point-à-point

Les communications point-à-point permettent à deux processus à l'intérieur d'un même communicateur d'échanger une donnée (scalaire, tableau ou type dérivé). Les fonctions correspondantes sont MPI_Send, MPI_Recv et MPI_Sendrecv.

### Communications collectives

Les communications collectives impliquent tous les processus d'un communicateur. Il est possible d'envoyer une même donnée à tous les processus (MPI_Bcast), de découper un tableau entre tous les processus (MPI_Scatter), ou d'effectuer une opération (par exemple addition) où chaque processus contribuera.

### Types dérivés

Les types de base (entier, flottant simple ou double précision, caractère) sont nativement pris en charge. Il est ensuite possible de créer des types dérivés, qui s'écartent plus ou moins de ces types de base : les types contigu (pour des données homogènes et contiguës en mémoire), vecteur (pour des données homogènes et espacées d'un pas constant en mémoire), indexé (pour des données homogènes et espacées d'un pas variable en mémoire) et structure (pour des données hétérogènes).

### MPI I/O (MPI-2)

MPI I/O autorise les entrées-sorties parallèles.

## Implémentations

Les implémentations classiques sont en C/C++ et FORTRAN, mais il existe aussi des implémentations en Python, OCaml, Perl et Java. L'implémentation initiale du standard MPI 1.x était MPICH, aujourd'hui devenue MPICH 2 en étant compatible avec le standard MPI-2 ; c'est un logiciel libre. On trouve aussi sous licence libre OpenMPI. À côté de ces implémentations généralistes, des implémentations optimisées ont été faites par certains constructeurs.