Eine Gruppe ist lediglich eine Menge von Prozessen, innerhalb derer jeder
Prozeß einen Rang (rank) zur Identifikation besitzt.
Jegliche Art von Kommunikation in MPI ist nur über einen Kommunikator
möglich. Einem Kommunikator liegt eine Gruppe zugrunde, darüberhinaus
hat er einen eigenen Raum von Message-tags, er kann einen Errorhandler
und Attribute besitzen. Innerhalb eines Kommunikators ist jeder
Prozeß durch seinen Rang identifizierbar.
Zu jedem Kommunikator läßt sich die Gruppe ermitteln, und aus jeder Gruppe
kann man einen Kommunikator konstruieren. Einfache Operationen wie
Duplizieren und Aufspalten kann man direkt mit dem Kommunikator ausführen,
und dabei den Errorhandler (und im Fall des Duplizierens auch sämtliche
Attribute) weitervererben. Für eine spezielle Auswahl der Prozesse, die
in einem neuen Kommunikator zusammenarbeiten sollen, muß man den Weg über
Konstruktoren für Gruppen nehmen.
Einem Kommunikator können Attribute zugeordnet werden, welche beim Duplizieren auf nutzerdefinierte Art weitergegeben und später verwendet werden können. Damit können zusätzliche Informationen zu einem Kommunikator insbesondere an Bibliotheksfunktionen weitergegeben werden.
Dafür stellt MPI folgende Konzepte zur Verfügung:
Prozeßgruppen bestehen aus einer Menge durchgehend und eindeutig numerierter Prozeßidentifikatoren. Die Prozeßgruppe definiert den Raum für Prozeßnamen (Ränge) für die Punkt-zu-Punkt-Kommunikation. Außerdem legt sie fest, welche Prozesse in eine kollektive Operation einbezogen sind.
Virtuelle Topologien legen eine Zuordnung der Ränge zu den Prozessen in einer Gruppe fest.
Attribute enthalen die lokalen Informationen, die der Anwender einem Kommunikator hinzugefügt hat.
Kommunikatoren legen den Raum und Geltungsbereich für alle
Kommunikationsoperationen in MPI fest. Sie werden unterteilt in
Interkommunikatoren für die Kommunikation zwischen Prozeßgruppen
und Intrakommunikatoren für die Kommunikation innerhalb einer
Prozeßgruppe.
Ein vordefinierter Intrakommunikator ist MPI_COMM_WORLD, welcher alle
Prozesse enthält. Erfordert die Problemstellung keine keine Aufteilung
in Prozeßgruppen, so kann MPI_COMM_WORLD überall verwendet werden, wo ein
Kommunikator als Argument verlangt wird.
Aus diesem initialen Kommunikator lassen sich neue Kommunikatoren ableiten.
MPI_COMM_SELF ist ein Intrakommunikator, welcher nur den Prozeß selbst
enthält. MPI_COMM_NULL steht für ein ungültiges handle für einen
Kommunikator.
Auf einem Interkommunikator ist prinzipiell keine Topologie definiert.
Ein Prozeß kann Mitglied in mehreren Gruppen und Kommunikatoren sein. Er
besitzt dann in jedem einen Rang.
Jeder Prozeß, der Mitglied in einem Kommunikator werden soll, muß den
Konstruktor aufrufen, und erhält somit ein handle für den neuen Kommunikator.
Das Erzeugen eines Kommunikators ist also eine globale Operation. MPI
erlaubt, daß auch Prozesse, die nicht Mitglied werden, den Konstruktor rufen.
Sie erhalten anstelle eines gültigen handles MPI_COMM_NULL zurück.
Gruppen werden stets aus bereits existierenden Gruppen zusammengestellt. Als
Basisgruppe kann jede Gruppe, die einem Kommunikator (z.B. MPI_COMM_WORLD)
zugrundeliegt, genutzt werden. Gruppenkonstruktoren arbeiten lokal auf dem
rufenden Prozeß. Für diesen Vorgang ist keine Kommunikation zwischen
Prozessen notwendig, da es auf der Basis von Gruppen keine gemeinsamen
Operationen gibt. Es kann also jeder Prozeß beliebige Gruppen für sich
definieren, auch dann, wenn er selbst nicht in der Gruppe enthalten ist.
Konstruktoren für Gruppen:
Konstruktoren für Kommunikatoren:
Operationen nur für Interkommunikatoren:
Attributschlüssel: