Details darüber, wie einzelne Prozesse das MPI-Universum festlegen, sind implementierungsspezifisch. Sie sollten sich den Quellcode der jeweiligen Bibliothek ansehen, um zu verstehen, wie sie funktioniert. Es gibt jedoch zwei fast universelle Ansätze:
Befehlszeilenargumente: Der MPI-Launcher kann Argumente an die erzeugten Prozesse übergeben, die angeben, wie und wo eine Verbindung hergestellt werden soll, um das Universum zu erstellen. Deshalb muss MPI initialisiert werden, indem MPI_Init()
mit argc
und argv
in C aufgerufen wird - so kann die Bibliothek Zugriff auf die Befehlszeile erhalten und alle Argumente, die dafür bestimmt sind, extrahieren;
Umgebungsvariablen: Der MPI-Launcher kann bestimmte Umgebungsvariablen festlegen, deren Inhalt angeben kann, wo und wie eine Verbindung hergestellt wird.
Open MPI zum Beispiel legt Umgebungsvariablen fest und schreibt auch einen Universumstatus in einen Speicherort, der allen Prozessen bekannt ist, die auf demselben Knoten ausgeführt werden. Sie können die speziellen Variablen leicht erkennen, dass ihre Laufzeitkomponente ORTE (OpenMPI Run-Time Environment) verwendet, indem Sie einen Befehl wie mpirun -np 1 printenv
Ausführung:
$ mpiexec -np 1 printenv | grep OMPI
... <many more> ...
OMPI_MCA_orte_hnp_uri=1660944384.0;tcp://x.y.z.t:43276;tcp://p.q.r.f:43276
OMPI_MCA_orte_local_daemon_uri=1660944384.1;tcp://x.y.z.t:36541
... <many more> ...
(IPs aus Sicherheitsgründen geändert)
Sobald ein Kind Prozess wird remote gestartet und MPI_Init()
oder MPI_Init_thread()
heißt, ruft ORTE und liest diese Umgebungsvariablen. Dann verbindet er sich mit der angegebenen Netzwerkadresse mit dem "home" mpirun
/mpiexec
Prozess, der dann alle erzeugten Prozesse koordiniert, um das MPI-Universum zu erstellen.
Andere MPI-Implementierungen funktionieren in ähnlicher Weise.
Ausgezeichnete Antwort, danke! Ich dachte an Umgebungsvariablen als eine Möglichkeit, konnte aber keine Bestätigung finden. –