2013-08-08 15 views
5

Ich versuche, eine Implementierung mit MPI und Fortran zu machen, die Prozesse weichen sind auf demselben Knoten zu Gruppen trennt. Hat MPI eine Routine, die das erkennen kann?Classify Knoten Prozesse zusammen mit MPI und Fortran

hatte ich die Idee, diese Prozesse durch ihren Host-Namen zu trennen, welche die gleichen auf dem Knoten der Maschine, die ich verwende. Aber ich weiß nicht, ob es für alle Cluster allgemein ist.

Antwort

6

Sie wollen wahrscheinlich MPI_COMM_SPLIT_TYPE überprüfen. Es ermöglicht Ihnen, eine vorhandene Kommunikator auf dem split_type basierend aufzuspalten Sie als Parameter übergeben:

int MPI_Comm_split_type(MPI_Comm comm, int split_type, int key, 
         MPI_Info info, MPI_Comm *newcomm) 

Im Moment ist die einzige split_type MPI_COMM_TYPE_SHARED, im Standard definiert als:

Diese Art teilt den Communicator in Subkommunikatoren auf, von denen jeder eine gemeinsam genutzte Speicherregion erstellen kann.

Dies ist normalerweise das Gleiche wie das, was Sie fragen, aber Sie müssen überprüfen, ob es auf Ihrem Computer wahr ist.

Das andere, was Sie wissen müssen, ist, dass dies eine neue Funktion in MPI-3 ist so könnte es nicht in allen Implementierungen von MPI zur Verfügung stehen. Ich weiß, dass es für MPICH und seine Derivate verfügbar ist. AFAIK, es ist nicht in der letzten Version von Open MPI verfügbar. Stellen Sie also sicher, dass Sie eine Version von MPI haben, die dies tatsächlich unterstützt.

+0

Wesley, danke. Es ist eine Schande, dass dies für Open MPI nicht verfügbar ist. Lassen Sie mich jedoch ein Beispiel geben, um zu sehen, ob ich verstanden habe, wie dieser Split-Typ funktioniert. Supose Ich habe 32 Prozesse auf 4 8-Core-Knoten. Meine Absicht ist es, 4 Gruppen von 8 Kernen zu erstellen, die auf gemeinsamen Speicherprozessen basieren, die sich auf demselben Knoten befinden. Ich könnte MPI_Comm_split_type verwenden. Wenn ich das benutze, könnte ich zum Beispiel nicht 8 Gruppen von 4 Gruppen erstellen (2 Gruppen in jedem Knoten), könnte ich? –

+0

Ja, das kannst du tun. Wenn Sie 8 Gruppen mit 4 Gruppen erstellen möchten, in denen jede Gruppe lokal für einen Knoten ist, müssen Sie den Schlüsselparameter verwenden, sodass die Hälfte der Prozesse einen Schlüssel und die andere Hälfte einen anderen Schlüssel beisteuern. Dies war das Verhalten des bestehenden Aufrufs MPI_COMM_SPLIT, also sollte es viele Tutorials geben, denen du folgen kannst. Sie müssen nur ein bisschen für die neuen Typ Ergänzungen hinzufügen. –

+0

OpenMPI setzt Umgebungsvariablen OMPI_COMM_WORLD_LOCAL_RANK und OMPI_COMM_WORLD_LOCAL_SIZE, die Sie verwenden, um herauszufinden, wie viele Prozesse einen Knoten („lokale Größe“) teilen. –

0

habe ich ähnliche Split-Funktion für Systeme, deren Umgebung bietet keine MPI 3.0 implementiert und es funktioniert ganz gut auf mehreren Clustern. Es verwendet MPI_GET_PROCESSOR_NAME und beruht auf der Tatsache, dass die meisten Cluster-MPI-Implementierungen den FQDN des Knotens als Ergebnis zurückgeben - getestet mit Open MPI und Intel MPI (was auf MPICH basiert, daher ist ähnliches Verhalten mit anderen MPICH-Derivaten zu erwarten). In Pseudo-Code funktioniert es wie folgt aus:

rank := MPI_COMM_RANK(communicator) 
prev_rank := rank - 1; IF (prev_rank < 0) prev_rank := MPI_PROC_NULL 
next_rank := rank + 1; IF (next_rank >= num_procs) next_rank := MPI_PROC_NULL 

proc_name := MPI_GET_PROCESSOR_NAME 

list := MPI_RECV(from prev_rank) 
IF (list does not contain proc_name) THEN 
    list := list + proc_name 
END IF 

colour := index of proc_name in list 
key := rank 

MPI_SEND(list to next_rank) 

MPI_COMM_SPLIT(communicator, colour, key, newcomm) 

Dieser Code im Grunde eine Liste von eindeutigen MPI Prozessornamen baut (Hostnamen) und jeder Prozess verwendet die Position seines MPI Prozessornamen in dieser Liste als Farbe für die üblichen Split-Funktion . In meiner C-Implementierung des Algorithmus ist die Liste einfach eine Zeichenkette - Verkettung aller Elemente mit einem Nullbyte als Trennzeichen. In Fortran könnte man jedes Symbol verwenden, das normalerweise in einem Hostnamen nicht erlaubt wäre, z. ;. Dann wird die Kette einfach als eine Anordnung von MPI_CHAR (C) oder MPI_CHARACTER (Fortran) weitergeleitet.

+0

Dieser Mechanismus funktioniert auf allen Maschinen, die ich außer einem Blue Gene/Q angetroffen habe. Dort enthält der Prozessorname die Kernnummer innerhalb eines Knotens. Sie können Ihren eigenen Prozessornamen wie folgt konstruieren:

+0

Auf der BG/Q, Prozesse können nicht zwischen den Kernen migrieren, daher ist es sinnvoll, die Core-ID in den Prozessornamen aufzunehmen. Was ist mit Cray? Ich hatte seit einiger Zeit keine Gelegenheit mehr, eins zu benutzen. –

+0

Die Crays, die ich benutzt habe, benehmen sich wie Linux. –