2016-04-10 17 views
-1

Kann mir jemand mehr über MPI_Comm_split communicator erklären und erzählen?MPI_Comm_split Erklärung

MPI_Comm_split(MPI_COMM_WORLD, my_row, my_rank,&my_row_comm); 

Dies ist nur Beispiel, das ich durch das Lesen einiger grundlegender Dokumentationen getroffen habe. Vielleicht könnte mir jemand sagen, wie dieser Kommunikator funktioniert?

+0

Wie könnten wir diese Frage ohne den Inhalt dieser Variablen beantworten? – Zulan

+0

hinzugefügt mehr Info dazu –

+0

Bitte verwenden Sie aussagekräftige Fragetitel. –

Antwort

2

einfach zu beginnen, lassen Sie uns auf der man-Seite einen Blick:

MPI_Comm_split(3)      MPI     MPI_Comm_split(3) 

NAME 
     MPI_Comm_split - Creates new communicators based on colors and keys 

SYNOPSIS 
     int MPI_Comm_split(MPI_Comm comm, int color, int key, MPI_Comm *newcomm) 

INPUT PARAMETERS 
     comm - communicator (handle) 
     color - control of subset assignment (nonnegative integer). Processes 
       with the same color are in the same new communicator 
     key - control of rank assignment (integer) 

OUTPUT PARAMETERS 
     newcomm 
       - new communicator (handle) 

Also, was das tut?
Nun, wie der Name schon sagt, teilt es den Kommunikator comm in disjoint Sub-Communicators newcomm. Jeder Prozess von comm wird in einen einzigen dieser Unterkommunikatoren fallen, daher die Tatsache, dass der Ausgang newcomm nur ein einziger Kommunikator (für den aktuellen Prozess) ist. Sie müssen jedoch global verstehen, dass die verschiedenen Versionen von newcomm verschiedene Sub-Communicators sind, die den Eingang comm partitionieren.

Das ist also, was die Funktion tut. Aber wie macht es das? das ist
Nun, wo die beiden Parameter color und key ins Spiel kommen:

  • color ist ein Integer-Wert, in dem der entscheiden, ermöglicht Unter Kommunikatoren der aktuelle Prozess fallen. Genauer gesagt werden alle Prozesse von comm, für die color den gleichen numerischen Wert haben wird, Teil desselben Unterkommunikators newcomm sein. Wenn Sie beispielsweise color = rank%2; (mit rank dem Rang des Prozesses in comm) definieren, würden Sie (global) zwei neue Kommunikatoren erstellen: einen für die Prozesse der ungeraden Ränge und einen für die Prozesse der geraden Ränge. Beachten Sie jedoch, dass jeder Prozess nur den einen dieser neuen Kommunikatoren sehen wird, zu denen er gehört ... Zusammenfassend lässt sich also anhand der color die verschiedenen "Teams", die Sie erstellen werden, unterscheiden, etwa die Farbe des Trikots Teams tragen, um sich während eines Spiels zu unterscheiden (daher die Namensgebung, die ich vermute).
  • key wird nur erlauben, optional zu entscheiden, wie die Prozesse in die neuen Kommunikatoren eingestuft werden, denen sie angehören. Wenn Sie z. B. key = rank; festlegen, wird die Bestellung des Rankings (nicht das Ranking selbst) in jedem neuen Communicator newcomm der Reihenfolge der Rangfolge im ursprünglichen Communicator comm folgen. Aber wenn Sie nicht über die Bestellung kümmern, können Sie auch festlegen key=0; und das Ranking in jedem der neuen Kommunikatoren sein wird, was die Bibliothek entscheidet ...

schließlich zwei triviale Beispiele:

  • MPI_Comm_split(comm, 0, rank, &newcomm) wird nur in commnewcomm duplizieren (wie MPI_Comm_dup())
  • MPI_Comm_split(comm, rank, rank, &newcomm) wird nur ein Äquivalent von MPI_COMM_SELF für jeden der Prozesse zurück