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_SendundMPI_Recvübertragen Daten zwischen zwei Prozessen;MPI_Sendrecvkombiniert Senden und Empfangen. - Kollektiv:
MPI_Bcastverteilt Daten an alle,MPI_Reducesammelt und kombiniert (z. B. Summe),MPI_Allreduceverteilt das Ergebnis an alle,MPI_Scatter/MPI_Gatherverteilen bzw. sammeln Datenblöcke. - Nichtblockierend:
MPI_Isend/MPI_IrecvmitMPI_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.