2012-06-06 4 views
13

Wenn ich einen MPI-Job mit mpirun oder mpiexec starte, kann ich verstehen, wie man jeden einzelnen Prozess starten kann. Wie aber kommunizieren diese Wrapper-Executables ohne die Compiler-Magie die Anordnung (MPI-Communicator) mit den MPI-Prozessen?Wie werden MPI-Prozesse gestartet?

Ich interessiere mich für die Details oder einen Zeiger auf, wo Sie suchen.

Antwort

23

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.

    +0

    Ausgezeichnete Antwort, danke! Ich dachte an Umgebungsvariablen als eine Möglichkeit, konnte aber keine Bestätigung finden. –