Nachricht, die Schnittstelle passiert

Message Passing Interface (MPI) ist ein standardisiertes und tragbares nachrichtenpassierendes System, das von einer Gruppe von Forschern von der Akademie und Industrie entworfen ist, um auf einem großen Angebot an parallelen Computern zu fungieren. Der Standard definiert die Syntax und Semantik eines Kerns von Bibliotheksroutinen, die für eine breite Reihe von Benutzern nützlich sind, die tragbare nachrichtenpassierende Programme in Fortran 77 oder die C Programmiersprache schreiben. Mehrere gut geprüfte und effiziente Durchführungen von MPI schließen einige ein, die frei sind und im öffentlichen Gebiet. Diese haben die Entwicklung einer parallelen Softwareindustrie gefördert, und dort haben Entwicklung von tragbaren und ersteigbaren groß angelegten parallelen Anwendungen gefördert.

Geschichte

Die Nachricht, die Schnittstelle-Anstrengung passiert, hat im Sommer 1991 begonnen, als eine kleine Gruppe von Forschern Diskussionen bei einem Bergrückzug in Österreich angefangen hat. Aus dieser Diskussion ist eine Werkstatt auf Standards für die Nachricht gekommen, die in einer Verteiler-Speicherumgebung gehalten am 29-30 April 1992 in Williamsburg, Virginia Geht. Auf dieser Werkstatt wurden die grundlegenden für eine nachrichtenpassierende Standardschnittstelle notwendigen Eigenschaften, und eine Arbeitsgruppe besprochen, die gegründet ist, um den Standardisierungsprozess fortzusetzen. Jack Dongarra, Rolf Hempel Hempel, Tony Hey und David W. Walker bringen einen Vorentwurf-Vorschlag im November 1992 vor, das war als MPI1 bekannt. Im November 1992 wurde eine Sitzung der MPI Arbeitsgruppe in Minneapolis gehalten, an dem es dafür entschieden wurde, den Standardisierungsprozess auf einem mehr formellen Stand zu legen. Die MPI Arbeitsgruppe hat sich alle 6 Wochen im Laufe der ersten 9 Monate von 1993 getroffen. Der Entwurf MPI Standard wurde bei der Supercomputerwissenschaft 'von 93 Konferenz im November 1993 präsentiert. Nachdem eine Periode von öffentlichen Anmerkungen, die auf einige Änderungen in MPI, Version 1.0 von MPI hinausgelaufen sind, im Juni 1994 veröffentlicht wurde. Diese Sitzungen und die E-Mail-Diskussion haben zusammen das MPI Forum eingesetzt, dessen Mitgliedschaft für alle Mitglieder der hohen Leistung Rechengemeinschaft offen gewesen ist.

Die MPI Anstrengung hat ungefähr 80 Menschen von 40 Organisationen, hauptsächlich in den Vereinigten Staaten und Europa einbezogen. Die meisten Hauptverkäufer von gleichzeitigen Computern wurden an MPI zusammen mit Forschern von Universitäten, Regierungslaboratorien und Industrie beteiligt.

Der MPI Standard definiert die Syntax und Semantik eines Kerns von Bibliotheksroutinen, die für eine breite Reihe von Benutzern nützlich sind, die tragbare Nachricht vorübergehende Programme in Fortran und C schreiben. Die MPI Anstrengung wurde geführt und ähnliche Geister von High-Performance Fortran Forum (HPFF).

MPI versorgt parallele Hardware-Verkäufer mit einem klar definierten Grundsatz von Routinen, die effizient durchgeführt werden können. Infolgedessen können Hardware-Verkäufer nach dieser Sammlung von auf niedriger Stufe Standardroutinen bauen, um Routinen des höheren Niveaus für die mit ihren parallelen Maschinen gelieferte Nachrichtenumgebung des verteilten Gedächtnisses zu schaffen. MPI stellt eine zum Gebrauch einfache tragbare Schnittstelle für den grundlegenden Benutzer, noch mächtig genug zur Verfügung, um Programmierern zu erlauben, die Hochleistungsnachricht vorübergehende auf Fortschritt-Maschinen verfügbare Operationen zu verwenden.

Als eine Anstrengung, einen "wahren" Standard für den Nachrichtenübergang zu schaffen, haben Forscher in MPI die nützlichsten Eigenschaften von mehreren Systemen vereinigt, anstatt ein System zu wählen, um als ein Standard anzunehmen. Eigenschaften wurden von Systemen von IBM, Intel, nCUBE, PVM, Schnellzug, P4 und PARMACS verwendet. Die Nachricht sind vorübergehende Paradigmen wegen einer breiten Beweglichkeit attraktiv und können in der Kommunikation für Mehrverarbeiter des verteilten Gedächtnisses und geteilten Gedächtnisses, Netze von Arbeitsplätzen und eine Kombination dieser Elemente verwendet werden. Das Paradigma wird veraltet durch Zunahmen und Netzgeschwindigkeit oder durch das architektonische Kombinieren geteilte und verteilende Speicherbestandteile nicht gemacht.

Die Unterstützung für MPI Sitzungen ist teilweise aus ARPA und Nationalem US-Wissenschaftsfundament unter der Bewilligung ASC-9310330, NSF Wissenschaft und Technologiezentrum-Konsumverein-Absprachenummer CCR-8809615 und die Kommission der Europäischen Gemeinschaft durch das Geist-Projekt P6643 gekommen. Die Universität Tennessees hat auch Finanzbeiträge zum MPI Forum geleistet.

Übersicht

MPI ist ein sprachunabhängiges Kommunikationsprotokoll, das verwendet ist, um parallele Computer zu programmieren. Sowohl Punkt-zu-Punkt-als auch gesammelte Kommunikation wird unterstützt. MPI "ist eine nachrichtenpassierende Anwendungsprogrammierer-Schnittstelle, zusammen mit dem Protokoll und den semantischen Spezifizierungen dafür, wie sich seine Eigenschaften in jeder Durchführung benehmen müssen." Die Absichten von MPI sind hohe Leistung, Skalierbarkeit und Beweglichkeit. MPI bleibt das dominierende Modell, das in der Hochleistungscomputerwissenschaft heute verwendet ist.

MPI wird durch keinen Hauptstandardkörper sanktioniert; dennoch ist es ein De-Facto-Standard für die Kommunikation unter Prozessen geworden, die ein paralleles Programm modellieren, das auf einem verteilten Speichersystem läuft. Wirkliche verteilte Speichersupercomputer wie Computertrauben führen häufig solche Programme. Das MPI-1 Hauptmodell hat kein geteiltes Speicherkonzept, und MPI-2 hat nur ein beschränkte verteilte geteilte Speicherkonzept. Dennoch werden MPI Programme regelmäßig auf geteilten Speichercomputern geführt. Das Entwerfen von Programmen um das MPI Modell (gegen ausführliche geteilte Speichermodelle) ist im Vorteil gegenüber NUMA Architekturen, da MPI Speichergegend fördert.

Obwohl MPI in Schichten 5 und höher des OSI Bezugsmodells gehört, können Durchführungen die meisten Schichten, mit Steckdosen und in der Transportschicht verwendetem Transmission Control Protocol (TCP) bedecken.

Die meisten MPI Durchführungen bestehen aus einem spezifischen Satz von Routinen (d. h., eine API) direkt kündbar von C, C ++, Fortran und jede Sprache, die fähig ist, mit solchen Bibliotheken, einschließlich C#, Java oder Pythonschlange zu verbinden. Die Vorteile von MPI über die ältere Nachricht vorübergehende Bibliotheken sind Beweglichkeit (weil MPI für fast jede verteilte Speicherarchitektur durchgeführt worden ist) und Geschwindigkeit (weil jede Durchführung im Prinzip für die Hardware optimiert wird, auf der es läuft).

MPI verwendet Language Independent Specifications (LIS) für Anrufe und Sprache bindings. Der erste MPI Standard hat ANSI C und Fortran-77 bindings zusammen mit dem LIS angegeben. Der Entwurf wurde an präsentiert

Superrechen-1994 (November 1994) und beendet bald danach. Ungefähr 128 Funktionen setzen den MPI-1.3 Standard ein, der als das letzte Ende der MPI-1 Reihe 2008 veröffentlicht wurde.

Zurzeit hat der Standard mehrere populäre Versionen: Version 1.3 (hat allgemein MPI-1 abgekürzt), der Nachrichtenübergang betont und eine statische Laufzeitumgebung und MPI-2.2 (MPI-2) hat, der neue Eigenschaften wie parallele Eingabe/Ausgabe, dynamische Prozesssteuerung und entfernte Speicheroperationen einschließt. Der LIS von MPI-2 gibt mehr als 500 Funktionen an und stellt Sprache bindings für ANSI C, ANSI C ++ und ANSI Fortran (Fortran90) zur Verfügung. Gegenstand-Zwischenfunktionsfähigkeit wurde auch hinzugefügt, um leichtere mischsprachige gehende Nachrichtenprogrammierung zu erlauben. Eine Nebenwirkung, MPI-2, vollendet 1996 zu standardisieren, klärte den MPI-1 Standard, den MPI-1.2 schaffend.

MPI-2 ist größtenteils eine Obermenge von MPI-1, obwohl einige Funktionen missbilligt worden sind. MPI-1.3 Programme arbeiten noch unter MPI mit dem MPI-2 Standard entgegenkommenden Durchführungen.

MPI ist häufig im Vergleich zu Parallel Virtual Machine (PVM), die eine populäre verteilte Umgebung und Nachricht vorübergehendes System entwickelt 1989 ist, und die eines der Systeme war, die das Bedürfnis nach dem parallelen Standardnachrichtenübergang motiviert haben. Eingefädelte geteilte Speicherprogrammiermodelle (wie Pthreads und OpenMP) und Nachrichtenübergang (MPI/PVM) programmierend, können betrachtet werden, weil sich Ergänzungsprogrammierung nähert, und gelegentlich zusammen in Anwendungen z.B in Servern mit vielfachen großen Knoten des geteilten Gedächtnisses gesehen werden kann.

Funktionalität

Die MPI-Schnittstelle wird gemeint, um wesentliche virtuelle Topologie, Synchronisation und Nachrichtenfunktionalität zwischen einer Reihe von Prozessen zur Verfügung zu stellen (die zu Beispielen der Knoten/Server/Computers kartografisch dargestellt worden sind) auf eine sprachunabhängige Weise, mit der sprachspezifischen Syntax (bindings), plus einige sprachspezifische Eigenschaften. MPI Programme arbeiten immer mit Prozessen, aber Programmierer kennzeichnen allgemein die Prozesse als Verarbeiter. Gewöhnlich für die maximale Leistung wird jede Zentraleinheit (oder Kern in einer Mehrkernmaschine) gerade ein einzelner Prozess zugeteilt. Diese Anweisung geschieht an der Durchlaufzeit durch den Agenten, der das MPI Programm, normalerweise genannt mpirun oder mpiexec anfängt.

MPI Bibliotheksfunktionen schließen ein, aber werden auf, Punkt-zu-Punkt-Rendezvous-Typ send/receive Operationen nicht beschränkt, zwischen einer Kartesianischen oder einem Graphen ähnlichen logischen Prozess-Topologie wählend, Daten zwischen Prozess-Paaren austauschend (senden Sie Operationen/erhalten Sie), teilweise Ergebnisse der Berechnung verbindend (sammeln Sie und reduzieren Sie Operationen), Knoten (Barriere-Operation) synchronisierend sowie netzzusammenhängende Information wie die Zahl von Prozessen in der Rechensitzung, aktuelle Verarbeiter-Identität erhaltend, dass ein Prozess zu, benachbarte Prozesse kartografisch dargestellt wird, die in einer logischen Topologie und so weiter zugänglich sind. Punkt-zu-Punkt-Operationen gehen ein gleichzeitige, asynchrone, gepufferte und bereite Formen, um sowohl relativ stärkere als auch schwächere Semantik für die Synchronisationsaspekte eines Rendezvous zu erlauben - senden. Viele hervorragende Operationen sind in der asynchronen Weise in den meisten Durchführungen möglich.

MPI-1 und MPI-2 sowohl ermöglichen Durchführungen, die auf Kommunikation als auch Berechnung übergreifen, aber Praxis und Theorie unterscheiden sich. MPI gibt auch Faden sichere Schnittstellen an, die Kohäsion und Kopplungsstrategien haben, dass Hilfe verborgenen Staat innerhalb der Schnittstelle vermeidet. Es ist relativ leicht, mehreingefädelten Punkt-zu-Punkt-MPI-Code zu schreiben, und einige Durchführungen unterstützen solchen Code. Gesammelte Mehrgewindekommunikation wird am besten mit vielfachen Kopien von Mitteilenden, wie beschrieben, unten vollbracht.

Konzepte

MPI stellt eine reiche Reihe von geistigen Anlagen zur Verfügung. Die folgenden Konzepte helfen im Verstehen und der Versorgung des Zusammenhangs für alle jene geistigen Anlagen und helfen dem Programmierer, was Funktionalität zu entscheiden, in ihren Anwendungsprogrammen zu verwenden. Vier von acht grundlegenden Konzepten von MPI sind zu MPI-2 einzigartig.

Mitteilender

Mitteilender-Gegenstände verbinden Gruppen von Prozessen in der MPI Sitzung. Jeder Mitteilende gibt jedem enthaltenen Prozess einen unabhängigen Bezeichner und ordnet seine enthaltenen Prozesse in einer bestellten Topologie ein. MPI hat auch ausführliche Gruppen, aber diese sind dafür hauptsächlich gut, Gruppen von Prozessen zu organisieren und zu reorganisieren, bevor ein anderer Mitteilender gemacht wird. MPI versteht einzelne Gruppenintramitteilender-Operationen und bilaterale Zwischenmitteilender-Kommunikation. In MPI-1 sind einzelne Gruppenoperationen am meisten überwiegend. Bilaterale Operationen erscheinen größtenteils in MPI-2, wo sie gesammelte Kommunikation und dynamisch in der Prozesssteuerung einschließen.

Mitteilende können mit mehreren MPI-Befehlen verteilt werden. Diese Befehle schließen einen Graph-Algorithmus des Färben-Typs genannt MPI_COMM_SPLIT ein, der topologische und andere logische Subgruppierungen effizient ableiten kann.

Punkt-zu-Punkt-Grundlagen

Mehrere wichtige MPI-Funktionen schließen Kommunikation zwischen zwei spezifischen Prozessen ein. Ein populäres Beispiel ist MPI_Send, der demjenigen angegebenen Prozess erlaubt, um eine Nachricht an einen zweiten angegebenen Prozess zu senden. Punkt-zu-Punkt-Operationen, wie diese genannt werden, sind in der gemusterten oder unregelmäßigen Kommunikation, zum Beispiel, einer datenparallelen Architektur besonders nützlich, in der jeder Verarbeiter alltäglich Gebiete von Daten mit spezifischen anderen Verarbeitern zwischen Berechnungsschritten oder eine Architektur des Masters-Sklaven tauscht, in der der Master neue Aufgabe-Daten einem Sklaven sendet, wann auch immer die vorherige Aufgabe vollendet wird.

MPI-1 gibt Mechanismen sowohl für das Blockieren als auch für die blockierungsfreien Punkt-zu-Punkt-Nachrichtenmechanismen an, sowie die so genannten 'bereit - senden' Mechanismus, wodurch eine senden Bitte nur gemacht werden kann, wenn das Zusammenbringen Bitte erhält, ist bereits gemacht worden.

Gesammelte Grundlagen

Gesammelte Funktionen schließen Kommunikation unter allen Prozessen in einer Prozess-Gruppe ein (der die komplette Prozess-Lache oder eine Programm-definierte Teilmenge bedeuten kann). Eine typische Funktion ist der MPI_Bcast-Anruf (kurz für "die Sendung"). Diese Funktion nimmt Daten von einem Knoten und sendet ihn an alle Prozesse in der Prozess-Gruppe. Eine Rückoperation ist der MPI_Reduce-Anruf, der Daten von allen Prozessen in einer Gruppe nimmt, eine Operation (wie das Summieren) durchführt, und die Ergebnisse auf einem Knoten versorgt. Nehmen Sie ab ist häufig am Anfang oder Ende einer großen verteilten Berechnung nützlich, wo jeder Verarbeiter auf einem Teil der Daten funktioniert und ihn dann in ein Ergebnis verbindet.

Andere Operationen führen hoch entwickeltere Aufgaben wie MPI_Alltoall durch, der n Sachen des solchen Datenverarbeiters umordnet, dass der n-te Knoten den n-ten Artikel von Daten von jedem bekommt.

Abgeleiteter datatypes

Viele MPI-Funktionen verlangen, dass Sie den Typ von Daten angeben, der zwischen Verarbeitern gesandt wird. Das ist, weil diese Funktionen Variablen, nicht definierte Typen passieren. Wenn der Datentyp ein normaler, wie interne Nummer, Rotforelle, doppelt usw. ist, können Sie vorherbestimmten MPI datatypes wie MPI_INT, MPI_CHAR, MPI_DOUBLE verwenden.

Hier ist ein Beispiel in C, der eine Reihe von ints passiert und alle Verarbeiter ihre Reihe an die Wurzel mit MPI_Gather senden wollen:

int Reihe [100];

int Wurzel, total_p, *receive_array;

MPI_Comm_size (comm, &total_p);

receive_array=malloc (total_p*100*sizeof (*receive_array));

MPI_Gather (Reihe, 100, MPI_INT, receive_array, 100, MPI_INT, Wurzel, comm);

</Quelle>

Jedoch könnten Sie stattdessen Daten als ein Block im Vergleich mit 100 ints senden mögen. Um zu tun, definiert das einen "aneinander grenzenden Block" hat Datentyp abgeleitet.

MPI_Datatype newtype;

MPI_Type_contiguous (100, MPI_INT, &newtype);

MPI_Type_commit (&newtype);

MPI_Gather (Reihe, 1, newtype, receive_array, 1, newtype, Wurzel, comm);

</Quelle>

Der Übergang einer Klasse oder einer Datenstruktur kann keinen vorherbestimmten Datentyp verwenden. MPI_Type_create_struct schafft abgeleiteten Datentyp eines MPI von MPI_predefined Datentypen wie folgt:

int MPI_Type_create_struct (int Zählung, interne Nummer blocklen [], MPI_Aint disp [],

Typ MPI_Datatype [], MPI_Datatype *newtype)

</Quelle>

wo Zählung mehrere Blöcke, auch Zahl von Einträgen in blocklen [], disp [], und Typ [] ist:

  • blocklen [] — Zahl der Elemente in jedem Block (Reihe der ganzen Zahl)
  • disp [] — Byte-Versetzung jedes Blocks (Reihe der ganzen Zahl)
  • Typ [] — Typ von Elementen in jedem Block (Reihe von Griffen zu Datatype-Gegenständen).

Der disp [] ist Reihe erforderlich, weil Verarbeiter verlangen, dass die Variablen ein spezifischer Weg auf dem Gedächtnis ausgerichtet werden. Zum Beispiel ist Rotforelle ein Byte und kann überall auf dem Gedächtnis gehen. Kurz ist 2 Bytes, so geht es zu sogar Speicheradressen. Lange ist 4 Bytes, es geht auf Positionen, die durch 4 und so weiter teilbar sind. Der Bearbeiter versucht, diese Architektur in einer Klasse oder Datenstruktur durch das Polstern der Variablen anzupassen. Die sicherste Weise, die Entfernung zwischen verschiedenen Variablen in einer Datenstruktur zu finden, ist durch das Erreichen ihrer Adressen mit MPI_Get_address. Diese Funktion berechnet die Versetzung von Elementen ganzen Struktur vom Anfang der Datenstruktur.

In Anbetracht der folgenden Datenstrukturen:

typedef struct {\

interne Nummer f;

kurzer p;

} A;

typedef struct {\

Ein a;

int Seiten, vp;

} B;

</Quelle>

Hier ist der C-Code, für einen MPI-abgeleiteten Datentyp zu bauen:

Leere define_MPI_datatype {\

//Vor allen Dingen kennzeichnen Elemente das Bitten und Ende der Datenstruktur

interne Nummer blocklen [6] = {1,1,1,1,1,1};

MPI_Aint disp [6];

MPI_Datatype newtype;

Typ [6] MPI_Datatype = {MPI_LB, MPI_INT, MPI_SHORT, MPI_INT, MPI_INT, MPI_UB};

//Sie brauchen eine Reihe, um das obere zu gründen, das der Datenstruktur gebunden ist

B findsize [2];

MPI_Aint findsize_addr, a_addr, f_addr, p_addr, pp_addr, vp_addr, UB_addr;

int Fehler;

MPI_Get_address (&findsize [0], &findsize_addr);

MPI_Get_address (& (findsize [0]).a, &a_addr);

MPI_Get_address (& ((findsize [0]).a).f, &f_addr);

MPI_Get_address (& ((findsize [0]).a).p, &p_addr);

MPI_Get_address (& (findsize [0]).pp, &pp_addr);

MPI_Get_address (& (findsize [0]).vp, &vp_addr);

MPI_Get_address (&findsize [1] ,&UB_addr);

disp [0] =a_addr-findsize_addr;

disp [1] =f_addr-findsize_addr;

disp [2] =p_addr-findsize_addr;

disp [3] =pp_addr-findsize_addr;

disp [4] =vp_addr-findsize_addr;

disp [5] =UB_addr-findsize_addr;

error=MPI_Type_create_struct (6, blocklen, disp, Typ, &newtype);

MPI_Type_commit (&newtype);

}\</Quelle>

MPI-2 Konzepte

Einseitige Kommunikation

MPI-2 definiert drei einseitige Kommunikationsoperationen, Gestellt, Kommen Sie und wachsen Sie An, ein Schreiben dem entfernten Gedächtnis, einem gelesenen vom entfernten Gedächtnis und einer Verminderungsoperation auf demselben Gedächtnis über mehrere Aufgaben seiend. Auch definiert sind drei verschiedene Methoden, diese Kommunikation zu synchronisieren (global, pairwise, und entfernte Schlösser), weil die Spezifizierung nicht versichert, dass diese Operationen bis zu einem Synchronisationspunkt stattgefunden haben.

Diese Typen des Anrufs können häufig für Algorithmen nützlich sein, in denen Synchronisation (z.B verteilte Matrixmultiplikation) ungünstig sein würde, oder wo es für Aufgaben wünschenswert ist im Stande zu sein, ihre Last zu erwägen, während andere Verarbeiter auf Daten funktionieren.

Gesammelte Erweiterungen

Diese Abteilung muss entwickelt werden.

Dynamische Prozesssteuerung

Der Schlüsselaspekt ist "die Fähigkeit eines MPI-Prozesses, an der Entwicklung von neuen MPI-Prozessen teilzunehmen oder Kommunikation mit MPI-Prozessen zu gründen, die getrennt angefangen worden sind." Die MPI-2 Spezifizierung beschreibt drei Hauptschnittstellen, durch die MPI-Prozesse Kommunikationen, MPI_Comm_spawn, MPI_Comm_accept/MPI_Comm_connect und MPI_Comm_join dynamisch gründen können. Die MPI_Comm_spawn-Schnittstelle erlaubt einem MPI-Prozess, mehrere Beispiele des genannten MPI-Prozesses zu erzeugen. Der kürzlich erzeugte Satz von MPI-Prozessen bildet einen neuen MPI_COMM_WORLD Intramitteilenden, aber kann mit dem Elternteil und dem Zwischenmitteilenden den Funktionsumsatz mitteilen. MPI_Comm_spawn_multiple ist eine abwechselnde Schnittstelle, die den verschiedenen Beispielen erlaubt, die erzeugt sind, verschiedene Dualzahlen mit verschiedenen Argumenten zu sein.

EINGABE/AUSGABE

Die parallele Eingabe/Ausgabe-Eigenschaft wird manchmal MPI-IO genannt, und verweist auf eine Reihe von Funktionen, die entworfen ist, Eingabe/Ausgabe-Management auf verteilten Systemen zu MPI zu abstrahieren, und in einer gemusterten Weise leicht zuzugreifenden Dateien zu erlauben, das vorhandene zu verwenden, hat datatype Funktionalität abgeleitet.

Die wenige Forschung, die auf dieser Eigenschaft getan worden ist, zeigt die Schwierigkeit für die gute Leistung an. Zum Beispiel sind einige Durchführungen von spärlichen Matrixvektor-Multiplikationen mit der MPI Eingabe/Ausgabe-Bibliothek unglückselig ineffizient.

Durchführungen

'Klassische' Traube und Supercomputerdurchführungen

Die MPI Durchführungssprache wird nicht beschränkt, die Sprache oder Sprachen zu vergleichen, die es sich bemüht, an der Durchlaufzeit zu unterstützen. Die meisten Durchführungen verbinden C, C ++ und Zusammenbau-Sprache, und nehmen C, C ++, und Programmierer von Fortran ins Visier. Bindings sind für viele andere Sprachen, einschließlich Perl, Pythonschlange, R, Rubins, Javas, Colorado verfügbar

Die anfängliche Durchführung des MPI 1.x Standard war MPICH, von Argonne National Laboratory (ANL) und Staatlicher Universität von Mississippi. IBM war auch ein früher implementor und frühste Supercomputergesellschaften der 90er Jahre entweder hat MPICH kommerzialisiert, oder hat ihre eigene Durchführung gebaut. LAM/MPI vom Ohio Supercomputerzentrum war eine andere frühe offene Durchführung. ANL hat fortgesetzt, MPICH seit mehr als einem Jahrzehnt zu entwickeln, und bietet jetzt MPICH 2 an, den MPI-2.1 Standard durchführend. LAM/MPI und mehrere andere MPI zur Form kürzlich verschmolzene Anstrengungen Öffnen MPI. Viele andere Anstrengungen sind Ableitungen von MPICH, LAM und anderen Arbeiten, einschließlich, aber nicht beschränkt auf, kommerzielle Durchführungen vom HP, Intel und Microsoft.

Pythonschlange

MPI Pythonschlange-Durchführungen schließen ein: PyMPI, mpi4py, pypar, MYMPI und das MPI Untermodul in ScientificPython. pyMPI ist bemerkenswert, weil es ein verschiedener Pythonschlange-Dolmetscher ist, während pypar, MYMPI und das Modul von ScientificPython Importmodule sind. Sie machen es den Job des Codierers zu entscheiden, wo der Anruf zu MPI_Init gehört. Kürzlich die weithin bekannte Zunahme C ++ haben Bibliotheken Boost:MPI erworben, der die MPI Pythonschlange Bindings eingeschlossen hat. Das ist der besonderen Hilfe, um C ++ und Pythonschlange zu mischen.

Objektiver Caml

Das Modul von OCamlMPI führt eine große Teilmenge von MPI-Funktionen durch und ist im aktiven Gebrauch in der wissenschaftlichen Computerwissenschaft. Eine elftausend Linie war OCaml Programm "MPI-ified" das Verwenden des Moduls, mit zusätzlichen 500 Linien des Codes und geringen Umstrukturierens und ist mit ausgezeichneten Ergebnissen auf bis zu 170 Knoten in einem Supercomputer gelaufen.

Java

Obwohl Java keine offizielle MPI-Schwergängigkeit hat, versuchen mehrere Gruppen, die zwei, mit verschiedenen Graden des Erfolgs und der Vereinbarkeit zu überbrücken. Einer der ersten Versuche war der mpiJava von Bryan Carpenter, im Wesentlichen eine Reihe von Streifbändern von Java Native Interface (JNI) zu einem lokalen C MPI Bibliothek, auf eine hybride Durchführung mit der beschränkten Beweglichkeit hinauslaufend, die auch gegen die spezifische MPI Bibliothek kompiliert werden muss, die wird verwendet.

Jedoch hat dieses ursprüngliche Projekt auch die mpiJava API definiert (tatsächlich MPI API für Java, das nah dem gleichwertigen C ++ bindings gefolgt ist), der anderes nachfolgendes Java MPI angenommene Projekte. Eine alternative, weniger verwendete API ist MPJ API, entworfen, um mehr objektorientiert und an der Sonne-Mikrosystemcodiervereinbarung näher zu sein. Außer der API Java können MPI Bibliotheken entweder Abhängiger auf einer lokalen MPI Bibliothek sein, oder die Nachricht durchführen, die Funktionen in Java passiert, während einige P2P-MPI mögen, auch stellen Gleicher-zu-Gleicher-Funktionalität zur Verfügung und erlauben gemischte Plattform-Operation.

Einige der schwierigsten Teile von Java/MPI entstehen aus javanischen Eigenschaften wie der Mangel an ausführlichen Zeigestöcken und dem geradlinigen Speicheradressraum für seine Gegenstände, die überwechselnde mehrdimensionale Reihe und komplizierte Gegenstände ineffizient machen. Workarounds schließen gewöhnlich das Übertragen einer Linie auf einmal und/oder Durchführen ausführlicher De-Anordnung und Gussteil sowohl bei Senden als auch bei Empfangsseiten ein, C oder Fortran ähnlicher Reihe durch den Gebrauch einer eindimensionalen Reihe und Zeigestöcken zu primitiven Typen durch den Gebrauch der Reihe des einzelnen Elements vortäuschend, so auf Programmierung von von der javanischen Vereinbarung ziemlich weiten Stilen hinauslaufend.

Eine andere javanische Nachricht vorübergehendes System ist MPJ-Schnellzug. Neue Versionen können in der Traube und den Mehrkernkonfigurationen durchgeführt werden. In der Traube-Konfiguration kann es parallele javanische Anwendungen auf Trauben und Wolken durchführen. Hier können javanische Steckdosen oder spezialisierte Eingabe/Ausgabe-Verbindungen wie Myrinet Nachrichtenübermittlung zwischen MPJ-Schnellzug-Prozessen unterstützen. In der Mehrkernkonfiguration wird eine parallele javanische Anwendung auf Mehrkernverarbeitern durchgeführt. In dieser Weise werden MPJ Schnellzug-Prozesse durch javanische Fäden vertreten.

Infrastruktur der gemeinsamen Sprache

Die zwei haben Common Language Infrastructure (CLI).NET geführt Durchführungen sind Mpi.NET und MPI.NET, eine Forschungsanstrengung an der Indiana laut einer BSD-artigen Lizenz lizenzierten Universität Rein. Es ist mit dem Mono abspielbaren vereinbar, und kann vollen Gebrauch der zu Grunde liegenden niedrigen Latenz MPI Netzstoffe machen.

Hardware-Durchführungen

MPI Hardware-Forschung konzentriert sich darauf, MPI direkt in der Hardware zum Beispiel über den Verarbeiter im Gedächtnis durchzuführen, das Einbauen von MPI Operationen ins Mikroschaltsystem des RAM steuert in jeden Knoten bei. Als natürliche Folgerung ist diese Annäherung der Sprache, OS oder Zentraleinheit unabhängig, aber kann nicht sogleich aktualisiert oder entfernt werden.

Eine andere Annäherung hat Hardware-Beschleunigung zu einem oder mehr Teilen der Operation, einschließlich der Hardware-Verarbeitung von MPI Warteschlangen und des Verwendens RDMA hinzufügen sollen, um Daten zwischen dem Gedächtnis und der Netzschnittstelle ohne Zentraleinheit oder OS Kerneingreifen direkt zu übertragen.

Beispiel-Programm

Hier ist ein "Hallo" Weltprogramm in in C geschriebenem MPI. In diesem Beispiel senden wir "hallo" Nachricht an jeden Verarbeiter, manipulieren es trivial, geben die Ergebnisse in den Hauptprozess zurück, und drucken die Nachrichten.

/ *

"Hallo MPI" Welttestprogramm

*/

#include

#include #include

#define BUFSIZE 128

#define ANHÄNGSEL 0

int Hauptsache (interne Nummer argc, Rotforelle *argv [])

{\

Rotforelle idstr [32];

Rotforelle-Kenner [BUFSIZE];

interne Nummer numprocs;

interne Nummer myid;

interne Nummer i;

MPI_Status stat;

/* MPI Programme fangen mit MPI_Init an; alle Prozesse 'von N' bestehen danach * /

MPI_Init (&argc,&argv);

/* finden Sie heraus, wie groß die SPMD Welt * / ist

MPI_Comm_size (MPI_COMM_WORLD,&numprocs);

/* und diese Reihe von Prozessen ist * /

MPI_Comm_rank (MPI_COMM_WORLD,&myid);

/* An diesem Punkt laufen alle Programme gleichwertig, die Reihe

unterscheidet die Rollen der Programme im SPMD Modell mit

reihen Sie sich 0 häufig verwendet besonders... * / auf

wenn (myid == 0)

{\

printf (" %d: Wir haben %d processors\n", myid, numprocs);

für (i=1; ich

Die Laufzeitumgebung für die MPI Durchführung verwendet (hat häufig mpirun oder mpiexec genannt), erzeugt vielfache Kopien des Programms mit der Gesamtzahl von Kopien, die die Zahl von Prozess-Reihen in MPI_COMM_WORLD bestimmen, der ein undurchsichtiger Deskriptor für die Kommunikation zwischen dem Satz von Prozessen ist. Ein einzelner Prozess vielfache Daten (SPMD) wird Programmierung des Modells dadurch erleichtert, aber nicht erforderlich; viele MPI Durchführungen erlauben vielfach, verschieden, executables, in demselben MPI Job angefangen zu werden.

Jeder Prozess hat seine eigene Reihe, die Gesamtzahl von Prozessen in der Welt, und die Fähigkeit, zwischen ihnen entweder mit dem Punkt-zu-Punkt-zu kommunizieren (sendet) Kommunikation, oder durch die gesammelte Kommunikation unter der Gruppe/erhält). Es ist genug für MPI, um ein SPMD-artiges Programm mit MPI_COMM_WORLD, seiner eigenen Reihe und der Größe der Welt zu versorgen, um Algorithmen zu erlauben, zu entscheiden, was man tut. In realistischeren Situationen wird Eingabe/Ausgabe sorgfältiger geführt als in diesem Beispiel. MPI versichert nicht, wie POSIX Eingabe/Ausgabe wirklich an einem gegebenen System arbeiten würde, aber es arbeitet allgemein, mindestens von der Reihe 0.

MPI verwendet den Begriff des Prozesses aber nicht Verarbeiters. Programm-Kopien werden zu Verarbeitern durch die MPI Durchlaufzeit kartografisch dargestellt. In diesem Sinn kann die parallele Maschine zu 1 physischem Verarbeiter oder N kartografisch darstellen, wo N die Gesamtzahl von Verarbeitern verfügbar, oder etwas zwischen ist. Für die maximale parallele Beschleunigung werden mehr physische Verarbeiter verwendet. Dieses Beispiel passt sein Verhalten der Größe der Welt N an, so bemüht es sich auch, zur Laufzeitkonfiguration ohne Kompilation für jede Größe-Schwankung zu klettern, obwohl sich Laufzeitentscheidungen abhängig von diesem absoluten Betrag der verfügbaren Parallelität ändern könnten.

MPI-2 Adoption

Die Adoption von MPI-1.2 ist besonders in der Traube-Computerwissenschaft universal gewesen, aber die Annahme von MPI-2.1 ist mehr beschränkt worden. Probleme schließen ein:

  1. MPI-2 Durchführungen schließen Eingabe/Ausgabe und dynamische Prozesssteuerung ein, und die Größe des middleware ist wesentlich größer. Die meisten Seiten, die Gruppe-Terminplanungssysteme verwenden, können dynamische Prozesssteuerung nicht unterstützen. Die parallele Eingabe/Ausgabe von MPI-2 wird gut akzeptiert.
  2. Viele MPI-1.2 Programme wurden vor MPI-2 entwickelt. Beweglichkeit betrifft am Anfang verlangsamt, obwohl breitere Unterstützung das vermindert hat.
  3. Viele MPI-1.2 Anwendungen verwenden nur eine Teilmenge dieses Standards (16-25 Funktionen) ohne echtes Bedürfnis nach der MPI-2 Funktionalität.

Zukunft

Einige Aspekte der Zukunft von MPI scheinen fest; andere weniger. Das MPI Forum ist 2007 wieder zusammengekommen, um einige MPI-2-Probleme zu klären und Entwicklungen für einen möglichen MPI-3 zu erforschen.

Wie Fortran ist MPI in der technischen Computerwissenschaft allgegenwärtig, und es wird unterrichtet und weit verwendet.

Architekturen ändern sich, mit der größeren inneren Parallelität bessere (mehrkern)-Parallelitätskontrolle des feinen Kornes (das Einfädeln, die Sympathie), und mehr Niveaus der Speicherhierarchie. Mehrgewindeprogramme können diese Entwicklungen leichter ausnutzen als einzelne Gewindeanwendungen. Das hat bereits getrennte, ergänzende Standards für die symmetrische Mehrverarbeitung, nämlich OpenMP nachgegeben. MPI-2 definiert, wie sich standardanpassende Durchführungen mit Mehrgewindeproblemen befassen sollten, aber nicht verlangen, dass Durchführungen mehreingefädelt werden, oder sogar sicher einfädeln. Wenige mehrgewindefähige MPI Durchführungen bestehen. Mehrniveau-Parallelität völlig innerhalb von MPI ist eine Gelegenheit für den Standard.

Die verbesserte Schuld-Toleranz innerhalb von MPI würde klare Vorteile für die wachsende Tendenz der Bratrost-Computerwissenschaft haben.

Siehe auch

Referenzen

Links


MPI / Theodore G. Bilbo
Impressum & Datenschutz