MPI (Message Passing Interface) ist der De-facto-Standard für die Programmierung von Systemen mit verteiltem Speicher: Supercomputer und Cluster, in denen viele Rechenknoten über ein Netzwerk verbunden sind. Anders als bei OpenMP teilen die Prozesse keinen Speicher – sie tauschen explizit Nachrichten aus. Die Spezifikation stammt vom MPI Forum; MPI-1.0 erschien im Juni 1994, aktuell ist MPI-4.1 (2023).

Grundmodell

Ein MPI-Programm startet als Menge unabhängiger Prozesse, die über einen Kommunikator verbunden sind. Der Standard-Kommunikator heißt MPI_COMM_WORLD. Jeder Prozess hat eine Nummer (rank) zwischen 0 und size-1, wobei size die Gesamtzahl der Prozesse ist:

MPI_Init(&argc, &argv);
int rank, size;
MPI_Comm_rank(MPI_COMM_WORLD, &rank);
MPI_Comm_size(MPI_COMM_WORLD, &size);
MPI_Finalize();

Kommunikationsformen

  • Punkt-zu-Punkt: MPI_Send und MPI_Recv übertragen Daten zwischen zwei Prozessen; MPI_Sendrecv kombiniert Senden und Empfangen.
  • Kollektiv: MPI_Bcast verteilt Daten an alle, MPI_Reduce sammelt und kombiniert (z. B. Summe), MPI_Allreduce verteilt das Ergebnis an alle, MPI_Scatter/MPI_Gather verteilen bzw. sammeln Datenblöcke.
  • Nichtblockierend: MPI_Isend/MPI_Irecv mit MPI_Wait überlappen Kommunikation und Rechnen.

Implementierungen

MPI ist nur eine Spezifikation; verbreitete Umsetzungen sind Open MPI, MPICH, Intel MPI und MVAPICH. Programme startet man typischerweise mit mpirun -np 64 ./programm. Die Top-500-Supercomputer der Welt laufen praktisch ausnahmslos mit MPI-basierten Programmen.

Hybrides Programmieren

In der Praxis kombinieren HPC-Anwendungen die Ansätze: OpenMP parallelisiert innerhalb eines Knotens (geteilter Speicher), MPI koppelt die Knoten (Nachrichten). Für GPU-Beschleunigung ergänzt man CUDA oder OpenCL – moderne MPI-Implementierungen unterstützen GPU-Aware-Kommunikation, die GPU-Speicher direkt über das Netzwerk überträgt. Die zugrunde liegende Koordination vieler unabhängiger Prozesse ist ein klassisches Thema der Nebenläufigkeit und verteilter Systeme.

Verwandte Grundlagen: Verteilte Systeme, Multikern-Prozessor, Nebenläufigkeit, MPI-Befehle.