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 comm
newcomm
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
Wie könnten wir diese Frage ohne den Inhalt dieser Variablen beantworten? – Zulan
hinzugefügt mehr Info dazu –
Bitte verwenden Sie aussagekräftige Fragetitel. –