2017-10-24 1 views
0

Warum kann MPI (mit dem ich OpenMPI in diesem Post bedeuten) Programme nicht wie jeder andere ausgeführt werden, und stattdessen mit mpirun ausgeführt werden müssen?Warum müssen OpenMPI-Programme mit `mpirun` ausgeführt werden?

Mit anderen Worten, warum MPI bietet nicht einfach Header/Pakete/..., die Sie importieren und dann können Sie Meister in Ihrem eigenen Haus sein, indem Sie MPI wann und wo Sie wollen, in Ihrem Quellcode verwenden und Ihnen erlauben, Ihre eigenen ausführbaren Dateien mit paralleler Verarbeitung zu kompilieren?

Ich bin wirklich ein Neuling, aber zum Beispiel fühle ich wie das -np Argument übergeben mpirun könnte leicht im Quellcode behoben werden, oder könnte durch das Programm selbst aufgefordert werden, oder könnte aus einer Konfiguration eingelesen werden Datei, oder könnte einfach konfiguriert werden, um alle verfügbaren Kerne zu verwenden, deren Nummer ohnehin von einem umgebenden Scheduler-Skript bestimmt wird, oder .... (Natürlich können Sie argumentieren, dass es eine gewisse Bequemlichkeit darin gibt, mpirun dies automatisch zu tun in gewissem Sinne, aber das rechtfertigt meiner Meinung nach kaum die Möglichkeit des Coders, seine eigene ausführbare Datei zu schreiben.)

Zum Beispiel habe ich wirklich wenig Erfahrung, aber in Python können Sie multi machen Durch einfaches Aufrufen der Funktionen des Moduls multiprocessing und Ausführen des Skripts wie jedes andere. Natürlich bietet MPI mehr als Pythons multiprocessing, aber wenn MPI zum Beispiel einen Hintergrunddienst starten muss, dann verstehe ich immer noch nicht, warum es nicht automatisch auf Aufrufe von MPI Funktionen in der Quelle tun kann.

Für ein anderes möglicherweise dummes Beispiel benötigen CUDA Programme cudarun nicht. Und aus einem guten Grund, denn wenn sie es taten, und wenn Sie sowohl CUDA als auch MPI in Teilen Ihres Programms verwendet hätten, müssten Sie jetzt cudarun mpirun ./foo (oder möglicherweise mpirun cudarun ./foo) ausführen und wenn jedes Paket so funktioniert, müssten Sie das bald tun einen Abschluss in Informatik haben, um einfach ein Programm auszuführen.

All dies ist vielleicht super wichtig, da Sie einfach jedes Ihrer MPI-Executables mit einem entsprechenden Wrapper-Skript versenden können, aber das ist irgendwie ärgerlich und ich wäre immer noch daran interessiert, warum diese Design-Wahl getroffen wurde.

+0

Also sagen wir, Sie wollen auf zwei Knoten 'A' und' B' laufen, und Sie einfach 'a.out -np2 --host A, B' auf Knoten' A ', wie soll die zweite MPI-Task auf Knoten' B' erzeugt werden? –

+0

Sie führen 'a.out' (mit Ihren Befehlszeilenargumenten) auf derselben Maschine/demselben Knoten aus, wie Sie' mpirun a.out' ausführen würden, also sollten sie die gleichen Möglichkeiten haben, Aufgaben und Prozesse zu erstellen, richtig? Es könnte etwas unordentliches Arbeiten in "a.out" erfordern, aber diese Arbeit wird derzeit sowieso in 'mpirun' erledigt, also warum kann es nicht in einen Aufruf einer 'MPI'-Bibliotheksfunktion innerhalb von' a eingeschlossen werden. raus? – Bananach

+0

@GillesGouaillardet (Dieser Kommentar war für Sie, lassen Sie mich Sie darüber informieren) – Bananach

Antwort

1

Sie können Prozesse hochfahren, wie Sie möchten, Sie müssen einen Kanal haben, um Port-Informationen zwischen Prozessen zu senden, ein Befehlszeilenarg funktioniert. Ich musste Prozesse manuell hochfahren, aber es ist viel einfacher und weniger schmerzhaft, einen vorkonfektionierten Communicator zu verwenden. Wenn Sie einen guten Grund haben, können Sie es tun.

Ich habe eine Frage, wo ich ein minimales vollständiges Beispiel in die Frage redigierte. Die Tastenanrufe sind MPI_Open_port, MPI_Comm_accept, MPI_Comm_connect und MPI_Intercomm_merge. Sie müssen die Verbindungsknoten nacheinander zusammenführen. Wenn Sie danach gehen wollen, sollten Sie eine gute Idee über den Unterschied zwischen einem Inter- und einem Intra-Communicator haben. Hier ist das Beispiel für Sie: Trying to start another process and join it via MPI but getting access violation

Verwandte Themen