Schnittstelle zur Nachrichtenübergabe
Schnittstelle zur Nachrichtenübergabe (MPI) ist standardisiert und tragbar Nachrichten-Passing Standard entwickelt, um auf zu funktionieren Parallele Computing Architekturen. Der MPI -Standard definiert die Syntax und Semantik von Bibliotheksroutinen Das sind nützlich für eine breite Palette von Benutzern, die schreiben tragbar Message-Passing-Programme in C, C ++, und Forran. Es gibt einige Open Source MPI Implementierungen, die die Entwicklung einer Parallele förderten Softwareindustrieund förderte die Entwicklung tragbarer und skalierbarer groß angelegter paralleler Anwendungen.
Geschichte
Die Bemühungen zur Botschaft, die Bemühungen zu der Schnittstelle zu haben, begann im Sommer 1991, als eine kleine Gruppe von Forschern Diskussionen in einem Berg -Retreat in Österreich begann. Aus dieser Diskussion kam ein Workshop über Standards für Nachrichten, die in einer verteilten Speicherumgebung am 29. bis 30. April 1992 in einer verteilten Speicherumgebung verabschiedet wurden Williamsburg, Virginia.[1] Die Teilnehmer von Williamsburg diskutierten die grundlegenden Funktionen, die für eine Standard-Nachrichten-Passing-Schnittstelle wichtig sind, und etablierte eine Arbeitsgruppe, um den Standardisierungsprozess fortzusetzen. Jack Dongarra, Tony Hey, und David W. Walker stellte im November 1992 einen vorläufigen Vorschlag "MPI1" vor. Im November 1992 fand in Minneapolis ein Treffen der MPI -Arbeitsgruppe statt und beschloss, den Standardisierungsprozess auf einen formelleren Fuß zu setzen. Die MPI -Arbeitsgruppe traf sich in den ersten 9 Monaten des Jahres 1993 alle 6 Wochen. Der MPI -Standard -Entwurf wurde im November 1993 auf der Supercomputing '93 -Konferenz vorgestellt.[2] Nach einer Zeit der öffentlichen Kommentare, die zu einigen Änderungen in MPI führten, wurde im Juni 1994 Version 1.0 des MPI veröffentlicht. Diese gemeinsamen Sitzungen und die E -Mail -Diskussion bildeten gemeinsam das MPI -Forum, von denen die Mitgliedschaft allen Mitgliedern der Mitglieder offen war High Performance Computing Gemeinschaft.
Die MPI -Bemühungen umfassten etwa 80 Personen aus 40 Organisationen, hauptsächlich in den USA und in Europa. Die meisten der wichtigsten Anbieter von Gleichzeitige Computer waren an den MPI -Bemühungen beteiligt, die mit Forschern von Universitäten, Regierungslabors und zusammenarbeiten Industrie.
MPI bietet parallele Hardwareanbieter einen klar definierten Basissatz von Routinen, die effizient implementiert werden können. Infolgedessen können Hardwareanbieter auf dieser Standardsammlung aufbauen niedriger Ebene Routinen zu erstellen höheres Level Routinen für die mit verteilte Kommunikationsumgebung mit ihrem verteilten Kommunikationsumgebung Parallelmaschinen. MPI bietet dem grundlegenden Benutzer eine einfach zu verwendende tragbare Schnittstelle, die es jedoch leistungsfähig genug ist, damit Programmierer die leistungsstarken Nachrichten, die auf erweiterten Maschinen verfügbar sind, verwenden können.
Um einen universellen Standard für das Passieren von Nachrichten zu erstellen, stützten sich die Forscher nicht von einem einzelnen System, aber es umfasste die nützlichsten Merkmale mehrerer Systeme, einschließlich der von IBM entworfenen Systeme. Intel, Ncube, PVM, Express, P4 und Parmacs. Das Paradigma für Nachrichten-Passing ist aufgrund der breiten Portabilität attraktiv und kann in der Kommunikation für verteilte Memory- und gemeinsame Memory-Multiprozessoren, Netzwerke von Workstations und eine Kombination dieser Elemente verwendet werden. Das Paradigma kann unabhängig von der Netzwerkgeschwindigkeit oder der Speicherarchitektur in mehreren Einstellungen angewendet werden.
Die Unterstützung für MPI -Meetings stammte zum Teil von DARPA und aus den USA Nationale Wissenschaftsstiftung (NSF) gemäß Grant ASC-9310330, NSF Science and Technology Center Cooperative Agreement Nummer CCR-8809615 und aus dem Europäische Kommission Durch Esprit -Projekt P6643. Das Universität von Tennessee auch finanzielle Beiträge zum MPI -Forum geleistet.
Überblick
Mpi ist a Kommunikationsprotokoll Für das Programmieren[3] Parallele Computer. Sowohl Punkt-zu-Punkt-Kommunikation werden unterstützt. MPI "ist eine Schnittstelle für Nachrichten-Passing-Anwendungsprogrammierer sowie die Protokoll- und semantischen Spezifikationen, wie sich seine Funktionen in jeder Implementierung verhalten müssen."[4] Die Ziele des MPI sind hohe Leistung, Skalierbarkeit und Portabilität. MPI bleibt das dominante Modell, das in verwendet wird High Performance Computing heute.[5]
MPI wird von keinem großen Standardkörper sanktioniert; Trotzdem ist es ein geworden de facto Standard zum Kommunikation Zu den Prozessen, die Modell a Parallelprogramm auf A laufen Verteilter Speicher System. Tatsächliche Supercomputer für verteilte Speicher wie Computercluster führen solche Programme häufig aus.
Das Hauptmpi-1-Modell hat keine geteilte Erinnerung Konzept und MPI-2 haben nur eine begrenzte verteilter gemeinsamer Speicher Konzept. Trotzdem werden MPI -Programme regelmäßig auf gemeinsamen Speichercomputern und beides ausgeführt Mpich und Offene MPI Kann freigegebener Speicher für die Nachrichtenübertragung verwenden, wenn er verfügbar ist.[6][7] Entwerfen von Programmen rund um das MPI -Modell (im Gegensatz zu explizit geteilte Erinnerung Modelle) hat Vorteile gegenüber Numa Architekturen seit MPI ermutigen Speicherlokalität. Die explizite gemeinsame Speicherprogrammierung wurde in MPI-3 eingeführt.[8][9][10]
Obwohl MPI in Schichten 5 und höher von der gehört OSI -ReferenzmodellImplementierungen können die meisten Ebenen abdecken, mit Steckdosen und Transmissionskontrollprotokoll (TCP) in der Transportschicht verwendet.
Die meisten MPI -Implementierungen bestehen aus einem bestimmten Satz von Routinen, C, C ++, Forran (d. H. Eine API) und jede Sprache, die mit solchen Bibliotheken verkürzen kann, einschließlich C#, Java oder Python. Die Vorteile von MPI gegenüber älteren Nachrichtenübertragungsbibliotheken sind eine Portabilität (da MPI für fast jede verteilte Speicherarchitektur implementiert wurde) und die Geschwindigkeit (da jede Implementierung grundsätzlich für die Hardware optimiert ist, auf der sie ausgeführt wird).
MPI verwendet Sprachunabhängige Spezifikationen (LIS) für Anrufe und Sprachbindungen. Der erste angegebene MPI -Standard Ansi c und Forran-77-Bindungen zusammen mit dem LIS. Der Entwurf wurde bei Supercomputing 1994 (November 1994) vorgestellt[11] und bald danach abgeschlossen. Etwa 128 Funktionen bilden den MPI-1.3-Standard, der 2008 als Endende der MPI-1-Serie veröffentlicht wurde.[12]
Derzeit hat der Standard mehrere Versionen: Version 1.3 (üblicherweise abgekürzt MPI-1), das betont das Passieren von Nachrichten und eine statische Laufzeitumgebung, MPI-2,2 (MPI-2), die neue Funktionen wie paralleler I/A, dynamisches Prozessmanagement und Remote-Speicher umfasst.[13] und MPI-3.1 (MPI-3), das Erweiterungen zu den kollektiven Operationen mit nicht blockierenden Versionen und Erweiterungen der einseitigen Operationen umfasst.[14] LIS von MPI-2 gibt über 500 Funktionen an und bietet Sprachbindungen für ISO C, Iso C ++, und Forran 90. Die Interoperabilität der Objekte wurde ebenfalls hinzugefügt, um eine einfachere Mischsprachnachrichtenprogrammierung zu ermöglichen. Ein Nebeneffekt für die Standardisierung von MPI-2, die 1996 fertiggestellt wurde, bestand darin, den MPI-1-Standard zu klären und die MPI-1.2 zu erstellen.
MPI-2 ist hauptsächlich ein Superset von MPI-1, obwohl einige Funktionen veraltet wurden. MPI-1.3-Programme arbeiten nach wie vor im Rahmen der MPI-Implementierungen, die dem MPI-2-Standard entsprechen.
MPI-3 Enthält neue Forger 2008 -Bindungen, während sie veraltete C ++ - Bindungen sowie viele veraltete Routinen und MPI -Objekte beseitigt.
MPI wird oft verglichen mit Parallele virtuelle Maschine (PVM), eine beliebte verteilte Umgebung und ein 1989 entwickeltes Nachrichtenübergangssystem, das eines der Systeme war, die die Notwendigkeit einer Standard -Parallelnachricht motivierten. Shared Memory -Programmiermodelle mit Thread -Speicher (wie z. Phreads und OpenMP) und Nachrichtenübergabe-Programmierung (MPI/PVM) können als komplementär angesehen und gelegentlich zusammen verwendet werden, beispielsweise in Servern mit mehreren großen gemeinsamen Memory-Knoten.
Funktionalität
Die MPI -Schnittstelle soll eine wesentliche virtuelle Topologie bieten. Synchronisationund Kommunikationsfunktionen zwischen einer Reihe von Prozessen (die auf sprachunabhängige Weise auf Knoten/Server/Computerinstanzen zugeordnet wurden) mit sprachspezifischer Syntax (Bindungen) sowie einigen sprachspezifischen Merkmalen. MPI -Programme arbeiten immer mit Prozessen, aber Programmierer bezeichnen die Prozesse häufig als Prozessoren. Normalerweise für maximale Leistung, jeweils Zentralprozessor (oder Ader in einem Multi-Core-Gerät) wird nur ein einzelner Prozess zugewiesen. Diese Aufgabe erfolgt zur Laufzeit über den Agenten, der das MPI -Programm startet, das normalerweise Mirun oder MPiexec bezeichnet wird.
Zu den MPI-Bibliotheksfunktionen gehören unter anderem Punkt-zu-Punkte Kartesischer oder Graph-Logische logische Prozesstopologie, Austausch von Daten zwischen Prozesspaaren (Senden/Empfangsvorgänge), kombinierte Teilergebnisse von Berechnungen (Sammeln und Reduzieren von Vorgängen), Synchronisierungsknoten (Barrierebetrieb) sowie das Erhalten von netzbezogenen Informationen wie die Anzahl der Prozesse erhalten In der Computersitzung, der aktuellen Prozessoridentität, auf die ein Prozess zugeordnet ist, benachbarte Prozesse, die in einer logischen Topologie zugänglich sind, und so weiter. Punkt-zu-Punkt-Operationen kommen herein synchron, asynchron, gepuffert und bereit Formen, um sowohl relativ stärker als auch schwächer zu ermöglichen Semantik Für die Synchronisationsaspekte eines Rendezvous-Send. Viele hervorragend[Klarstellung erforderlich] Operationen sind im asynchronen Modus in den meisten Implementierungen möglich.
MPI-1 und MPI-2 ermöglichen Implementierungen, die die Kommunikation und Berechnung überlappen, aber Praxis und Theorie unterscheiden sich. MPI gibt ebenfalls an Faden sicher Schnittstellen, die haben Zusammenhalt und Kupplung Strategien, die dazu beitragen, einen versteckten Zustand innerhalb der Schnittstelle zu vermeiden. Es ist relativ einfach, Multithread-Point-to-Point-MPI-Code zu schreiben, und einige Implementierungen unterstützen diesen Code. Multithread Die kollektive Kommunikation wird am besten mit mehreren Kopien von Kommunikatoren erreicht, wie nachstehend beschrieben.
Konzepte
MPI bietet mehrere Funktionen. Die folgenden Konzepte bieten einen Kontext für all diese Fähigkeiten und helfen dem Programmierer, zu entscheiden, welche Funktionen in seinen Anwendungsprogrammen verwendet werden sollen. Vier der acht grundlegenden Konzepte von MPI sind einzigartig für MPI-2.
Kommunikator
Kommunikatorobjekte verbinden Gruppen von Prozessen in der MPI -Sitzung. Jeder Kommunikator gibt jedem enthaltenen Prozess eine unabhängige Kennung und arrangiert seine enthaltenen Prozesse in einer geordneten Topologie. MPI hat auch explizite Gruppen, aber diese sind hauptsächlich gut für die Organisation und Umorganisierung von Gruppen von Prozessen, bevor ein anderer Kommunikator durchgeführt wird. MPI versteht die einzelnen Gruppen -Intracommunicator -Operationen und die bilaterale Interkommunikatorenkommunikation. In MPI-1 sind einzelne Gruppenoperationen am häufigsten. Bilateral Operationen treten hauptsächlich in MPI-2 auf, wo sie kollektive Kommunikation und dynamisches In-Prozess-Management enthalten.
Kommunikatoren können mit mehreren MPI -Befehlen partitioniert werden. Diese Befehle umfassen Mpi_comm_split
, wobei jeder Prozess einem von mehreren farbigen Unterkommunikatoren verbindet, indem er sich für diese Farbe erklärt.
Punkt-zu-Punkt-Grundlagen
Eine Reihe wichtiger MPI -Funktionen umfasst die Kommunikation zwischen zwei spezifischen Prozessen. Ein beliebtes Beispiel ist Mpi_send
, damit ein angegebener Prozess eine Nachricht an einen zweiten angegebenen Prozess senden kann. Punkt-zu-Punkt-Operationen, wie diese genannt werden, sind besonders nützlich für strukturierte oder unregelmäßige Kommunikation, zum Beispiel a datenparallel Architektur, bei der jeder Prozessor regelmäßig Datenbereiche mit bestimmten anderen Prozessoren zwischen den Berechnungsschritten oder a ausschaltet Master-Sklave Architektur, in der der Master neue Aufgabendaten an einen Sklaven sendet, wenn die vorherige Aufgabe abgeschlossen ist.
MPI-1 gibt Mechanismen für beide an Blockierung und nicht blockierende Punkt-zu-Punkt-Kommunikationsmechanismen sowie der sogenannte "Ready-Send" -Mechanismus, bei dem eine Send-Anfrage nur gestellt werden kann, wenn die Anforderung an die Übereinstimmung erhalten wurde.
Kollektive Grundlagen
Kollektive Funktionen Beteiligung der Kommunikation zwischen allen Prozessen in einer Prozessgruppe (die den gesamten Prozesspool oder eine programmdefinierte Teilmenge bedeuten kann). Eine typische Funktion ist die Mpi_bcast
Rufen Sie an (kurz für "Übertragung"). Diese Funktion nimmt Daten von einem Knoten aus und sendet sie an alle Prozesse in der Prozessgruppe. Ein umgekehrter Vorgang ist die MPI_REDUCE
Call, der Daten von allen Prozessen in einer Gruppe aufnimmt, führt eine Operation (z. B. Summieren) durch und speichert die Ergebnisse auf einem Knoten. MPI_REDUCE
ist zu Beginn oder am Ende einer großen verteilten Berechnung häufig nützlich, wobei jeder Prozessor auf einem Teil der Daten arbeitet und sie dann zu einem Ergebnis kombiniert.
Andere Operationen führen anspruchsvollere Aufgaben aus, wie z. Mpi_alltoall
welche neu arrangiert n Datenelemente so, dass die nDer Knoten bekommt das nTH -Datenelement von jedem.
Abgeleitete Datentypen
Viele MPI -Funktionen erfordern, dass Sie die Art der Daten angeben, die zwischen den Prozessen gesendet wird. Dies liegt daran, dass MPI heterogene Umgebungen unterstützen soll[15] (Zum Beispiel könnten sie verschiedene CPU -Architekturen ausführen, die unterschiedlich sind Endiangess) In diesem Fall können MPI -Implementierungen durchführen Datenkonvertierung.[15] Da die C -Sprache nicht zulässt, dass ein Typ selbst als Parameter übergeben wird, definiert MPI die Konstanten Mpi_int
, Mpi_char
, Mpi_double
zu entsprechen int
, verkohlen
, doppelt
, etc.
Hier ist ein Beispiel in C, das Arrays von übergeht int
s von allen Prozessen zu einem. Der eine Empfangsprozess wird als "Root" -Prozess bezeichnet und kann jeder bestimmte Prozess sein. Normal Mpi_gather
, was gleichbedeutend mit jedem Prozess (einschließlich des Wurzels selbst) ist Mpi_send
und die Wurzel macht die entsprechende Anzahl der geordneten Bestimmungen Mpi_recv
Anrufe, um alle diese Arrays in eine größere zusammenzustellen:[16]
int send_array[100]; int Wurzel = 0; /* oder Wasauchimmer */ int num_procs, *recv_array; Mpi_comm_size(Comm, &num_procs); recv_array = Malloc(num_procs * Größe von(send_array)); Mpi_gather(send_array, Größe von(send_array) / Größe von(*send_array), Mpi_int, recv_array, Größe von(send_array) / Größe von(*send_array), Mpi_int, Wurzel, Comm);
Sie können jedoch stattdessen Daten als einen Block im Gegensatz zu 100 senden int
s. Definieren Sie dazu einen "zusammenhängenden Block" abgeleitete Datentyp:
Mpi_datatype neuer Typ; Mpi_type_contiguous(100, Mpi_int, &neuer Typ); Mpi_type_commit(&neuer Typ); Mpi_gather(Array, 1, neuer Typ, empfangen_array, 1, neuer Typ, Wurzel, Comm);
Zum Bestehen einer Klasse oder einer Datenstruktur, Mpi_type_create_struct
erstellt einen MPI -abgeleiteten Datentyp von Mpi_predefiniert
Datentypen wie folgt:
int Mpi_type_create_struct(int zählen, int *Blocklen, Mpi_aint *disp, Mpi_datatype *Typ, Mpi_datatype *neuer Typ)
wo:
-
zählen
ist eine Reihe von Blöcken und gibt die Länge (in Elementen) der Arrays anBlocklen
,disp
, undTyp
. -
Blocklen
enthält die Anzahl der Elemente in jedem Block, -
disp
Enthält Byteverschiebungen jedes Blocks, -
Typ
Enthält Arten von Elementen in jedem Block. -
neuer Typ
(Eine Ausgabe) enthält den neuen abgeleiteten Typ, der von dieser Funktion erstellt wurde
Das disp
(Verschiebungen) Array wird für benötigt DatenstrukturausrichtungDa der Compiler die Variablen in einer Klasse oder Datenstruktur padeln kann. Der sicherste Weg, um den Abstand zwischen verschiedenen Feldern zu finden, besteht darin, ihre Adressen im Speicher zu erhalten. Dies geschieht mit Mpi_get_address
, was normalerweise gleich ist wie c &
Bediener, aber das ist möglicherweise nicht der Fall, wenn Sie es umgehen Speichersegmentierung.[17]
Das Bestehen einer Datenstruktur als ein Block ist erheblich schneller als jeweils ein Element, insbesondere wenn der Vorgang wiederholt werden soll. Dies liegt daran, dass Blöcke fester Größe nicht erfordern Serialisierung während der Übertragung.[18]
Angesichts der folgenden Datenstrukturen:
Struktur A { int f; kurz p; }; Struktur B { Struktur A a; int pp, VP; };
Hier ist der C-Code zum Erstellen eines MPI-abgeleiteten Datentyps:
statisch Const int Blocklen[] = {1, 1, 1, 1}; statisch Const Mpi_aint disp[] = { Offsetof(Struktur B, a) + Offsetof(Struktur A, f), Offsetof(Struktur B, a) + Offsetof(Struktur A, p), Offsetof(Struktur B, pp), Offsetof(Struktur B, VP) }; statisch Mpi_datatype Typ[] = {Mpi_int, Mpi_short, Mpi_int, Mpi_int}; Mpi_datatype neuer Typ; Mpi_type_create_struct(Größe von(Typ) / Größe von(*Typ), Blocklen, disp, Typ, &neuer Typ); Mpi_type_commit(&neuer Typ);
MPI-2-Konzepte
Einseitige Kommunikation
MPI-2 definiert drei einseitige Kommunikationsoperationen, Mpi_put
, Mpi_get
, und Mpi_accumulate
, ein Schreiben in den Remote -Speicher, eine Lesung aus dem Remote -Speicher und eine Reduktionsoperation auf demselben Speicher über eine Reihe von Aufgaben. Ebenfalls definiert sind drei verschiedene Methoden zur Synchronisierung dieser Kommunikation (globale, paarweise und entfernte Sperren), da die Spezifikation nicht garantiert, dass diese Vorgänge bis zu einem Synchronisationspunkt stattgefunden haben.
Diese Anruftypen können häufig für Algorithmen nützlich sein, bei denen die Synchronisation unpraktisch wäre (z. B. verteilt Matrix-Multiplikation) oder wo es wünschenswert ist, dass Aufgaben ihre Last ausgleichen können, während andere Prozessoren mit Daten arbeiten.
Dynamisches Prozessmanagement
Der Hauptaspekt ist "die Fähigkeit eines MPI -Prozesses, an der Erstellung neuer MPI -Prozesse teilzunehmen oder die Kommunikation mit MPI -Prozessen zu etablieren, die getrennt gestartet wurden." Die MPI-2-Spezifikation beschreibt drei Hauptschnittstellen, an denen MPI-Prozesse die Kommunikation dynamisch festlegen können. Mpi_comm_spawn
, Mpi_comm_accept
/Mpi_comm_connect
und Mpi_comm_join
. Das Mpi_comm_spawn
Die Schnittstelle ermöglicht es einem MPI -Prozess, eine Reihe von Instanzen des benannten MPI -Prozesses hervorzubringen. Die neu hervorgebrachten Set von MPI -Prozessen bilden eine neue Mpi_comm_world
Intracommunicator kann aber mit dem Elternteil und dem Intercommunicator kommunizieren, die die Funktion zurückgibt. Mpi_comm_spawn_multiple
ist eine alternative Schnittstelle, die es den verschiedenen Instanzen ermöglicht, verschiedene Binärdateien mit unterschiedlichen Argumenten zu sein.[19]
I/o
Die parallele E/A-Funktion wird manchmal als MPI-io bezeichnet,[20] und bezieht sich auf eine Reihe von Funktionen, die zum abstrakten E/A -Management auf verteilten Systemen zu MPI ausgelegt sind, und ermöglichen es, auf Dateien auf strukturierte Weise mithilfe der vorhandenen abgeleiteten Datentyp -Funktionalität leicht zugegriffen zu werden.
Die kleinen Forschungen, die zu dieser Funktion durchgeführt wurden, zeigt, dass es möglicherweise nicht trivial ist, Hochleistungsgewinne mit MPI-IO zu erzielen. Zum Beispiel eine Implementierung von spärlich Matrix-Vektor-Multiplikationen Die Verwendung der MPI -E/A -Bibliothek zeigt ein allgemeines Verhalten von geringfügigen Leistungsgewinn, diese Ergebnisse sind jedoch nicht schlüssig.[21] Erst die Idee des kollektiven i/o[22] Implementiert in MPI-IO, dass MPI-IO begann, eine weit verbreitete Akzeptanz zu erreichen. Die kollektive I/A -Bandbreite von Anwendungen steigert die I/A -Bandbreite von Anwendungen, indem Prozesse gemeinsam die kleinen und nicht zusammenhängenden E/A -Operationen in große und zusammenhängende Umstände verwandeln, wodurch die Sperren und Scheibe suchen Overhead. Aufgrund seiner enormen Leistungsvorteile wurde MPI-IO auch die zugrunde liegende E/A-Ebene für viele hochmoderne E/A-Bibliotheken wie z. HDF5 und Parallel netcdf. Seine Popularität löste auch die Forschung zu kollektiven I/A-Optimierungen aus, wie z.[23] und Kreuzungsaggregation.[24][25]
Offizielle Implementierungen
- Die erste Implementierung des MPI 1.x -Standards war Mpich, aus Argonne National Laboratory (Anl) und Mississippi State University. IBM war auch ein früher Implementierer und die meisten frühen 90er Jahre Supercomputer Unternehmen kommerzialisierte Abgeordnete oder bauten ihre eigene Implementierung auf. Lam/mpi aus Ohio Supercomputer Center war eine weitere früh offene Implementierung. ANL entwickelt MPich über ein Jahrzehnt weiter und bietet nun MPich-3.2 an, um den MPI-3.1-Standard implementieren.
- Offene MPI (nicht zu verwechseln mit OpenMP) wurde durch das zusammenführende ft-mpi, la-mpi, gebildet, Lam/mpiund pacx-mpi und ist in vielen gefunden Top-500 Supercomputer.
Viele andere Anstrengungen sind Derivate von MPich, LAM und anderen Werken, einschließlich, aber nicht beschränkt auf kommerzielle Implementierungen von HP, Intel, Microsoft, und NEC.
Während die Spezifikationen eine C- und FORTRAN -Schnittstelle vorschreiben, ist die zum Implementierung von MPI verwendete Sprache nicht darauf eingeschränkt, die Sprache oder Sprachen zu entsprechen, die sie zur Laufzeit unterstützen soll. Die meisten Implementierungen kombinieren C, C ++ und Assemblersprache sowie Ziel -C-, C ++- und FORTRAN -Programmierer. Für viele andere Sprachen stehen Bindungen zur Verfügung, darunter Perl, Python, R, Ruby, Java und Cl (sehen #Language -Bindungen).
Das Abi von MPI -Implementierungen sind ungefähr aufgeteilt zwischen Mpich und Offene MPI Derivate, so dass eine Bibliothek aus einer Familie als Drop-In-Ersatz aus derselben Familie arbeitet, aber direkter Ersatz für Familien ist unmöglich. Die Franzosen CEA Halten Sie eine Wrapper -Schnittstelle bei, um solche Schalter zu erleichtern.[26]
Hardware
Die MPI -Hardware -Forschung konzentriert sich auf die Implementierung von MPI direkt in Hardware über via über Prozessor-in-Memory, Bau von MPI -Operationen in den Mikrocircuitry der RAM Chips in jedem Knoten. Implizit ist dieser Ansatz unabhängig von Sprache, Betriebssystem und CPU, kann jedoch nicht ohne weiteres aktualisiert oder entfernt werden.
Ein anderer Ansatz bestand darin, einem oder mehreren Teilen des Vorgangs die Hardwarebeschleunigung hinzuzufügen, einschließlich der Hardwareverarbeitung von MPI -Warteschlangen und Verwendung RDMA Daten direkt zwischen dem Speicher und dem übertragen Netzwerkschnittstellencontroller ohne CPU- oder OS -Kernel -Intervention.
Compiler -Verpackungen
mpicc (und ähnlich mpic ++, mpif90usw.) ist ein Programm, das sich über einen vorhandenen Compiler wickelt, um die erforderlichen Befehlszeilenflags beim Kompilieren von Code zu setzen, das MPI verwendet. In der Regel werden einige Flags hinzugefügt, mit denen der Code kompiliert und mit der MPI -Bibliothek verknüpft ist.[27]
Sprachbindungen
Bindungen sind Bibliotheken, die die MPI -Unterstützung auf andere Sprachen erweitern, indem sie eine vorhandene MPI -Implementierung wie MPICH oder Open MPI einwickeln.
Gemeinsame Sprachinfrastruktur
Die beiden verwalteten Gemeinsame Sprachinfrastruktur .NETZ Implementierungen sind reines mpi.net[28] und mpi.net,[29] eine Forschungsanstrengung bei Universität von Indiana lizenziert unter einem BSD-Stil -Lizenz. Es ist kompatibel mit Monound kann die zugrunde liegenden MPI-Netzwerkstoffe mit niedriger Latenz nutzen.
Java
Obwohl Java Hat keine offizielle MPI -Bindung, mehrere Gruppen versuchen, die beiden mit unterschiedlichem Erfolg und Kompatibilität zu überbrücken. Einer der ersten Versuche war Bryan Carpenters Mpijava,[30] im Wesentlichen ein Satz von Java Native Interface (JNI) Wrapper einer lokalen C -MPI -Bibliothek, die zu einer Hybrid -Implementierung mit begrenzter Portabilität führt, die auch mit der zu verwendenden spezifischen MPI -Bibliothek zusammengestellt werden muss.
Dieses ursprüngliche Projekt definierte jedoch auch die mpijava -API[31] (a de facto MPI API Für Java, die den äquivalenten C ++ - Bindungen genau verfolgten), die andere nachfolgende Java -MPI -Projekte annahmen. Eine weniger verwendete API ist die MPJ-API, die mehr so konzipiert wurde objektorientierter und näher an Sun Microsystems'Konventionen codieren.[32] Jenseits der API können Java-MPI-Bibliotheken entweder von einer lokalen MPI-Bibliothek abhängig sein oder die Meldungsfunktionen in Java implementieren, während einige wie P2P-MPI auch zur Verfügung stellen Peer-To-Peer Funktionalität und ermöglichen Sie den Betrieb mit gemischtem Plattform.
Einige der anspruchsvollsten Teile von Java/MPI entstehen aus Java -Eigenschaften wie dem Mangel an explizit Zeiger und die linearer Speicher Adressierungsraum für seine Objekte, die das Übertragen von mehrdimensionalen Arrays und komplexen Objekten ineffizient machen. In der Arbeit beinhalten normalerweise die Übertragung einer Zeile gleichzeitig und/oder explizite De-Serialisierung und Casting Sowohl am Send- als auch beim Empfangsenden, simulierende C- oder FORTRAN-ähnliche Arrays mithilfe eines eindimensionalen Arrays und Zeiger auf primitive Typen unter Verwendung von Einzelelement-Arrays, was zu Programmierstilen ziemlich weit von Java-Konventionen führt.
Ein weiteres Java -Nachrichtenübergangssystem ist MPJ Express.[33] Neuere Versionen können in Cluster- und Multicore -Konfigurationen ausgeführt werden. In der Cluster -Konfiguration können parallele Java -Anwendungen für Cluster und Wolken ausgeführt werden. Hier Java -Sockets oder spezialisierte E/A -Verbindungen wie Myrinet kann Nachrichten zwischen MPJ Express -Prozessen unterstützen. Es kann auch die native C -Implementierung von MPI mit seinem nativen Gerät verwenden. In der Multicore -Konfiguration wird eine parallele Java -Anwendung auf Multicore -Prozessoren ausgeführt. In diesem Modus werden MPJ Express -Prozesse durch Java -Threads dargestellt.
Julia
Da ist ein Julia Sprachhülle für MPI.[34]
Matlab
Es gibt einige akademische Implementierungen von MPI Matlab. MATLAB hat eine eigene parallele Erweiterungsbibliothek mit MPI und implementiert PVM.
Ocaml
Das ocamlmpi -Modul[35] Implementiert eine große Untergruppe von MPI -Funktionen und wird im wissenschaftlichen Computer aktiv verwendet. Eine 11.000 Zeile Ocaml Das Programm wurde unter Verwendung des Moduls "mpi-identifiziert" mit zusätzlichen 500 Codezeilen und leichten Umstrukturierungen und lief mit hervorragenden Ergebnissen auf bis zu 170 Knoten in einem Supercomputer.[36]
PARI/GP
PARI/GP kann gebaut werden[37] Um MPI als Multi-Thread-Engine zu verwenden, um parallele Pari- und GP-Programme für MPI-Cluster unmodifiziert zu werden.
Python
MPI -Implementierungen in Python enthalten: Pympimpi4py,[38] Pypar,[39] MYMPI,[40] und das MPI -Submodule in ScientificPython. PYMPI ist bemerkenswert, da es sich um einen Varianten -Python -Interpreter handelt, während Pypar, MYMPI und ScientificPython -Module importieren. Sie machen es zur Aufgabe des Coders, zu entscheiden, wohin der Anruf angerufen wird Mpi_init
gehört.
In letzter Zeit[wenn?] das Steigern Sie C ++ - Bibliotheken erworbener Boost: MPI, das die MPI -Python -Bindungen enthielt.[41] Dies ist besondere Hilfe beim Mischen von C ++ und Python. Ab Oktober 2016[aktualisieren] Boost: Die Python -Bindungen von MPI haben immer noch unfixierte Verpackungsfehler in Centos.[42]
R
R Zu den Bindungen von MPI gehören RMPI[43] und pbdmpi,[44] wo sich RMPI konzentriert Manager-Mitarbeiter Parallelität, während sich PBDMPI konzentriert SPMD Parallelität. Beide Implementierungen unterstützen voll und ganz Offene MPI oder Mpich2.
Beispielprogramm
Hier ist ein "Hallo Welt!" Programm In MPI in C. In diesem Beispiel senden wir jedem Prozessor eine "Hallo" -Meldung, manipulieren sie trivial, geben die Ergebnisse an den Hauptprozess zurück und drucken die Nachrichten.
/* "Hallo Welt" -MPI -Testprogramm */ #enthalten #enthalten #enthalten #enthalten int hauptsächlich(int argc, verkohlen **argv) { verkohlen buf[256]; int my_rank, num_procs; / * Initialisieren Sie die für die Kommunikation erforderliche Infrastruktur */ Mpi_init(&argc, &argv); / * Identifizieren Sie diesen Prozess */ Mpi_comm_rank(Mpi_comm_world, &my_rank); / * Finden Sie heraus, wie viele Gesamtprozesse aktiv sind */ Mpi_comm_size(Mpi_comm_world, &num_procs); /* Bis zu diesem Zeitpunkt haben alle Programme genau gleich gemacht. Hier überprüfen wir den Rang, um die Rollen der Programme zu unterscheiden */ wenn (my_rank == 0) { int other_rank; printf("Wir haben %I -Prozesse.\n", num_procs); / * Nachrichten an alle anderen Prozesse senden */ zum (other_rank = 1; other_rank < num_procs; other_rank++) { Sprintf(buf, "Hallo ich!", other_rank); Mpi_send(buf, Größe von(buf), Mpi_char, other_rank, 0, Mpi_comm_world); } / * Empfangen von Nachrichten aus allen anderen Prozessen */ zum (other_rank = 1; other_rank < num_procs; other_rank++) { Mpi_recv(buf, Größe von(buf), Mpi_char, other_rank, 0, Mpi_comm_world, Mpi_status_ignore); printf("%s\n", buf); } } anders { / * Meldung aus dem Prozess #0 *///// Mpi_recv(buf, Größe von(buf), Mpi_char, 0, 0, Mpi_comm_world, Mpi_status_ignore); behaupten(memcmp(buf, "Hallo ", 6) == 0); / * Nachricht an verarbeiten #0 *// * Sprintf(buf, "Process %I berichte zum Dienst.", my_rank); Mpi_send(buf, Größe von(buf), Mpi_char, 0, 0, Mpi_comm_world); } / * Die Kommunikationsinfrastruktur abreißen */ Mpi_finalize(); Rückkehr 0; }
Wenn Sie mit 4 Prozessen ausgeführt werden, sollte es die folgende Ausgabe erzeugen:[45]
$ mpicc Beispiel.c && mpiexec -n 4 ./a.out Wir haben 4 Prozesse. Prozess 1 Berichterstattung für den Dienst. Prozess 2 Berichterstattung für den Dienst. Prozess 3 Berichterstattung für den Dienst.
Hier, mpiexec
ist ein Befehl zur Ausführung des Beispielprogramms mit 4 Prozessejedes davon ist eine unabhängige Instanz des Programms zur Laufzeit und zugewiesene Ränge (d. H. Numerische IDs) 0, 1, 2 und 3. Der Name mpiexec
wird vom MPI -Standard empfohlen, obwohl einige Implementierungen einen ähnlichen Befehl unter dem Namen liefern Mpirun
. Das Mpi_comm_world
ist der Kommunikator, der aus allen Prozessen besteht.
Ein einzelnes Programm, mehrere Daten (SPMD) Programmiermodell wird dadurch erleichtert, aber nicht erforderlich; Mit vielen MPI -Implementierungen können mehrere, unterschiedliche, ausführbare Sachen im selben MPI -Job gestartet werden. Jeder Prozess hat seinen eigenen Rang, die Gesamtzahl der Prozesse in der Welt und die Fähigkeit, zwischen ihnen entweder mit Punkt-zu-Punkt-Kommunikation (Senden/Empfang) oder durch kollektive Kommunikation zwischen der Gruppe zu kommunizieren. Es reicht für MPI aus, ein Programm im SPMD-Stil zu bieten Mpi_comm_world
, sein eigener Rang und die Größe der Welt, um Algorithmen zu entscheiden, was zu tun ist. In realistischeren Situationen wird I/O sorgfältiger verwaltet als in diesem Beispiel. MPI sieht nicht fest, wie Standard -E/A (Stdin, Stdout, Stderr) auf einem bestimmten System funktionieren sollte. Es funktioniert im Allgemeinen wie im RANK-0-Prozess erwartet, und einige Implementierungen erfassen und transportieren auch die Ausgabe aus anderen Prozessen.
MPI verwendet eher den Begriff des Prozesses als den Prozessor. Programmkopien sind zugeordnet zu Prozessoren durch den MPI Laufzeit. In diesem Sinne kann die parallele Maschine einem physischen Prozessor zu kartieren, oder zu N Prozessoren, wo N ist die Anzahl der verfügbaren Prozessoren oder sogar etwas dazwischen. Für maximale parallele Beschleunigung werden mehr physikalische Prozessoren verwendet. Dieses Beispiel passt sein Verhalten an die Größe der Welt an NDaher wird auch die Laufzeitkonfiguration ohne Kompilierung für jede Größenvariation skaliert, obwohl die Laufzeitentscheidungen je nach der absoluten verfügbaren Genauigkeit variieren können.
MPI-2-Adoption
Die Einführung von MPI-1.2 war universell, insbesondere bei Cluster-Computing, aber die Akzeptanz von MPI-2,1 war begrenzter. Zu den Problemen gehören:
- Die MPI-2-Implementierungen umfassen E/A- und Dynamic-Prozessmanagement, und die Größe der Middleware ist wesentlich größer. Die meisten Websites, die Stapelplanungssysteme verwenden, können dynamisches Prozessmanagement nicht unterstützen. Die parallele I/A-MPI-2 ist gut akzeptiert.
- Viele MPI-1.2-Programme wurden vor MPI-2 entwickelt. Die Bedenken hinsichtlich der Portabilität haben zunächst die Adoption verlangsamt, obwohl eine breitere Unterstützung dies verringert hat.
- Viele MPI-1.2-Anwendungen verwenden nur eine Teilmenge dieses Standards (16-25 Funktionen), ohne dass die MPI-2-Funktionalität nicht real ist.
Zukunft
Einige Aspekte der Zukunft des MPI erscheinen solide; andere weniger. Das MPI-Forum wurde 2007 wieder aufgenommen, um einige MPI-2-Probleme zu klären und Entwicklungen für einen möglichen MPI-3 zu untersuchen, was zu Versionen MPI-3.0 (September 2012) und MPI-3.1 (Juni 2015) führte.
Architekturen ändern sich mit größerer interner Parallelität (Multi-Core), bessere feinkörnige Parallelitätskontrolle (Gewinde, Affinität) und mehr Ebenen von Speicherhierarchie. Multithread Programme können diese Entwicklungen leichter nutzen als Anwendungen mit Single-Thread-Anwendungen. Dies hat bereits separate, komplementäre Standards für ergeben Symmetrische Multiprozessierung, nämlich OpenMP. MPI-2 definiert, wie standardmäßige Implementierungen mit Multithread-Problemen zu tun haben, müssen jedoch nicht erforderlich sind, dass Implementierungen multitHhread oder sogar mit Thread-Safe sind. MPI-3 fügt die Möglichkeit hinzu, die Parallelität der gemeinsam genutzten Memory innerhalb eines Knotens zu verwenden. Implementierungen von MPI wie adaptivem MPI, Hybrid-MPI, feinkörnigem MPI, MPC und anderen bieten Erweiterungen des MPI-Standards, die sich mit unterschiedlichen Herausforderungen in MPI befassen.
Der Astrophysiker Jonathan Dursi schrieb ein Meinungsgegenstand, das MPI -Veralterung über neuere Technologien wie die zeigt Kapelle Sprache, Einheitlich parallel c, Hadoop, Funke und Flink.[46] Gleichzeitig fast alle Projekte in der Exascale Computing -Projekt explizit auf MPI bauen; Es wurde gezeigt, dass MPI ab den frühen 2020er Jahren auf die größten Maschinen skaliert wird, und es wird allgemein angesehen, dass es für lange Zeit relevant bleibt.
Siehe auch
Verweise
- ^ Walker DW (August 1992). Standards für das Nachrichtenverfahren in einer verteilten Speicherumgebung (PDF) (Bericht). Oak Ridge National Lab., TN (Vereinigte Staaten), Zentrum für Forschung zu Parallel Computing (CRPC). p. 25. Osti 10170156. Ornl/tm-12147. Abgerufen 2019-08-18.
- ^ Das MPI -Forum Corporate (15. bis 19. November 1993). "MPI: Eine Nachrichtenübergabebechanlage". Verfahren der ACM/IEEE -Konferenz von 1993 über Supercomputing. Supercomputing '93. Portland, Oregon, USA: ACM. S. 878–883. doi:10.1145/169627.169855. ISBN 0-8186-4340-4.
- ^ Nielsen, Frank (2016). "2. Einführung in MPI: Die Messagepassing -Schnittstelle". Einführung in HPC mit MPI für Data Science. Springer. S. 195–211. ISBN 978-3-319-21903-5.
- ^ Gropp, Lusk & Skjellum 1996, p. 3
- ^ Sur, Sayantan; Koop, Matthew J.; Panda, Dhabaleswar K. (4. August 2017). "MPI und Kommunikation --- Hochleistungs- und skalierbare MPI über Infini Band mit reduzierter Speicherverwendung ". Hochleistungs- und skalierbarer MPI über Infiniband mit reduzierter Speicherverwendung: Eine eingehende Leistungsanalyse. ACM. p. 105. doi:10.1145/1188455.1188565. ISBN 978-0769527000. S2CID 818662.
- ^ KNEM: Hochleistungs-Intra-Knoten-MPI-Kommunikation "Mpich2 (seit Release 1.1.1) verwendet KNEM in der DMA LMT, um die große Nachrichtenleistung innerhalb eines einzelnen Knotens zu verbessern. Open MPI enthält auch die KNEM -Unterstützung in seiner SM BTL -Komponente seit Release 1.5. Zusätzlich enthält NetPipe ein KNEM -Backend seit Version 3.7 .2. "
- ^ "FAQ: Stimmen Sie die Laufzeiteigenschaften der MPI-SM-Kommunikation ab". www.open-mpi.org.
- ^ https://software.intel.com/en-us/articles/an-introduction-to-mpi-3-shared-memory-programming?schwage=en "Der MPI-3-Standard führt einen weiteren Ansatz zur Hybridprogrammierung ein, bei dem das neue MPI Shared Memory (SHM) -Modell (SHM) verwendet wird."
- ^ Gemeinsamer Speicher und MPI 3.0 "Verschiedene Benchmarks können ausgeführt werden, um zu bestimmen, welche Methode für eine bestimmte Anwendung am besten geeignet ist, unabhängig davon , abhängig von der Nachricht. "
- ^ Verwendung von MPI-3 Shared-Speicher als Multicore-Programmiersystem (PDF -Präsentationsleitungen)
- ^ Inhaltsverzeichnis-September 1994, 8 (3-4). Hpc.sagepub.com. Abgerufen am 2014-03-24.
- ^ MPI -Dokumente. Mpi-forum.org. Abgerufen am 2014-03-24.
- ^ Gropp, Lusk & Skjellum 1999b, S. 4–5
- ^ MPI: Ein Standard-Standard-Schnittstellenstandard
Version 3.1, Message Passing Interface Forum, 4. Juni 2015. http://www.mpi-forum.org. Abgerufen am 2015-06-16. - ^ a b "Typ Matching Regeln" ". mpi-forum.org.
- ^ "MPI_GATHER (3) MAN SEITE (Version 1.8.8)". www.open-mpi.org.
- ^ "Mpi_get_address". www.mpich.org.
- ^ Boost.mpi Skelett/Inhaltsmechanismus Begründung (Leistungsvergleichsdiagramme wurden mit Verwendung erzeugt Netzrope)
- ^ Gropp, Lusk & Skjelling 1999b, p. 7
- ^ Gropp, Lusk & Skjelling 1999b, S. 5–6
- ^ "Spärliche Matrixvektor-Multiplikationen mit der MPI-I/A-Bibliothek" (PDF).
- ^ "Data Sieben und kollektive I/O im Romio" (PDF). IEEE. Februar 1999.
- ^ Chen, Yong; Sonne, Xian-er; Thakur, Rajeev; Roth, Philip C.; Gropp, William D. (September 2011). "Lacio: Eine neue kollektive I/A -Strategie für parallele I/O -Systeme". 2011 IEEE International Parallel & Distributed Processing Symposium. IEEE. S. 794–804. Citeseerx 10.1.1.699.8972. doi:10.1109/ipdps.2011.79. ISBN 978-1-61284-372-8. S2CID 7110094.
- ^ Teng Wang; Kevin Vasko; Zhuo Liu; Hui Chen; Weikuan Yu (2016). "Verbessern Sie die parallele Eingabe/Ausgabe mit der Kreuzung Aggregation". Das International Journal of High Performance Computing Applications. 30 (2): 241–256. doi:10.1177/1094342015618017. S2CID 12067366.
- ^ Wang, Teng; Vasko, Kevin; Liu, Zhuo; Chen, Hui; Yu, Weikuan (November 2014). "BPAR: Ein bündelbasiertes paralleles Aggregationsrahmen für die entkoppelte E/A-Ausführung". 2014 Internationaler Workshop zu datenintensiven skalierbaren Computersystemen. IEEE. S. 25–32. doi:10.1109/discs.2014.6. ISBN 978-1-4673-6750-9. S2CID 2402391.
- ^ CEA-HPC. "CEA-HPC/WI4MPI: Wrapper-Schnittstelle für MPI". GitHub.
- ^ mpicc. Mpich.org. Abgerufen am 2014-03-24.
- ^ Pure mpi.net
- ^ "MPI.net: Hochleistungs-C# -Bibliothek für Nachrichtenübergabe". www.osl.iu.edu.
- ^ "Mpijava Homepage". www.hpjava.org.
- ^ "Einführung in die mpijava -API". www.hpjava.org.
- ^ "Die MPJ -API -Spezifikation". www.hpjava.org.
- ^ "MPJ Express -Projekt". mpj-express.org.
- ^ Juliaparallel/mpi.jlParallel Julia, 2019-10-03, abgerufen 2019-10-08
- ^ "Xavier Leroy - Software". cristal.inria.fr.
- ^ Archiv der CAML -Mailingliste> Nachricht von Yaron M. Minsky. Caml.inria.fr (2003-07-15). Abgerufen am 2014-03-24.
- ^ "Einführung in den parallelen GP" (PDF). pari.math.u-bordeaux.fr.
- ^ "Google Code Archiv - Langzeitspeicher für Google Code -Projekthosting". code.google.com.
- ^ "Google Code Archiv - Langzeitspeicher für Google Code -Projekthosting". code.google.com.
- ^ Jetzt Teil von Pydusa
- ^ "Python -Bindungen - 1.35.0". www.boost.org.
- ^ "0006498: Paket Boost-*MPI-Python fehlt das Python-Modul-Centos Bug Tracker". Bugs.centos.org.
- ^ Yu, Hao (2002). "RMPI: Paralleles statistisches Computing in R". R Nachrichten.
- ^ Chen, Wei-Chen; Ostrouchov, George; Schmidt, Drew; Patel, Pragneshkumar; Yu, Hao (2012). "PBDMPI: Programmierung mit Big Data - Schnittstelle zu MPI".
- ^ Der Ausgangsausschnitt wurde auf einem gewöhnlichen Linux -Desktop -System mit offenem MPI hergestellt. Distribos Normalerweise geben Sie den MPICC-Befehl in ein OpenMPI-devel- oder libopenmpi-dev-Paket und machen Sie es manchmal erforderlich, "Modul hinzuzufügen, dass MPI/openMPI-X86_64" oder ähnlich ist, bevor MPICC und MPiexec verfügbar sind.
- ^ "HPC stirbt und MPI tötet es". www.dursi.ca.
Weitere Lektüre
- Dieser Artikel basiert auf Material, das von entnommen wurde Schnittstelle zur Nachrichtenübergabe Bei der Kostenloses Online-Wörterbuch des Computers vor dem 1. November 2008 und unter den "Relicensing" -Beurang der "Relicensing" aufgenommen GFDL, Version 1.3 oder höher.
- Aoyama, Yukiya; Nakano, Jun (1999) RS/6000 SP: Praktische MPI -Programmierung, ES IST SO
- Foster, Ian (1995) Entwerfen und Erstellen paralleler Programme (online) Addison-Wesley ISBN0-201-57594-9, Kapitel 8 Schnittstelle zur Nachrichtenübergabe
- Wijesuriya, Viraj Brian (2010-12-29) Daniweb: Beispielcode für die Matrix -Multiplikation mit dem MPI -Parallelprogrammieransatz
- Mit MPI Serie:
- Gropp, William; Luk, Ewing; Skjellum, Anthony (1994). Verwenden von MPI: tragbare parallele Programmierung mit der Nachrichten-Passing-Schnittstelle. Cambridge, MA, USA: MIT Press Wissenschaftliche und technische Berechnungsreihe. ISBN 978-0-262-57104-3.
- Gropp, William; Luk, Ewing; Skjellum, Anthony (1999a). Mit MPI, 2. Auflage: tragbare parallele Programmierung mit der Nachrichten -Pass -Schnittstelle. Cambridge, MA, USA: MIT Press Wissenschaftliche und technische Berechnungsreihe. ISBN 978-0-262-57132-6.
- Gropp, William; Luk, Ewing; Skjellum, Anthony (1999b). Verwenden von MPI-2: Erweiterte Funktionen der Nachrichtenüberwachungsschnittstelle. MIT Press. ISBN 978-0-262-57133-3.
- Gropp, William; Luk, Ewing; Skjellum, Anthony (2014). Verwenden von MPI, 3. Auflage: tragbare parallele Programmierung mit der Nachrichten-Passing-Schnittstelle. Cambridge, MA, USA: MIT Press Wissenschaftliche und technische Berechnungsreihe. ISBN 978-0-262-52739-2.
- Gropp, William; Luk, Ewing; Skjellum, Anthony (1996). "Eine leistungsstarke, tragbare Implementierung der Schnittstelle zur Passion von MPI-Nachrichten". Parallele Computing. 22 (6): 789–828. Citeseerx 10.1.1.102.9485. doi:10.1016/0167-8191 (96) 00024-5.
- Pacheco, Peter S. (1997) Parallele Programmierung mit MPI.[1] 500 S. Morgan Kaufmann ISBN1-55860-339-5.
- MPI - Die vollständige Referenz Serie:
- Snir, Marc; Otto, Steve W.; Huss-Lernman, Steven; Walker, David W.; Dongarra, Jack J. (1995) MPI: Die vollständige Referenz. MIT Press Cambridge, MA, USA. ISBN0-262-69215-5
- Snir, Marc; Otto, Steve W.; Huss-Lernman, Steven; Walker, David W.; Dongarra, Jack J. (1998) MPI - Die vollständige Referenz: Band 1, der MPI -Kern. MIT Press, Cambridge, MA. ISBN0-262-69215-5
- Gropp, William; Huss-Lernman, Steven; Lumsdaine, Andrew; Luk, Ewing; Nitzberg, Bill; Saphir, William; und Snir, Marc (1998) MPI-Die vollständige Referenz: Band 2, MPI-2-Erweiterungen. MIT Press, Cambridge, MA ISBN978-0-262-57123-4
- Firuziaan, Mohammad; Nommensen, O. (2002) Parallele Verarbeitung über MPI & OpenMP, Linux Enterprise, 10/2002
- Vanneschi, Marco (1999) Parallele Paradigmen für wissenschaftliches Computer In Proceedings der Europäischen Schule für Computerchemie (1999, Perugia, Italien), Nummer 75 in Vorlesungsnotizen in der Chemie, Seiten 170–183. Springer, 2000
- Bala, Bruck, Cypher, Elustondo, A Ho, CT Ho, Kipnis, Snir (1995) "Eine tragbare und einstellbare kollektive Kommunikationsbibliothek für skalierbare parallele Computer"In IEEE -Transaktionen auf parallelen und verteilten Systemen, Bd. 6, Nr. 2, S. 154–164, Februar 1995.