was bedeutet es konfigurieren MPI für shared-memory?
Ich habe ein wenig Forschung bezogenen Fragen zu stellen.
Derzeit habe ich fertigen Umsetzung von Struktur-Skelett-frame-Arbeit basiert auf MPI (insbesondere mit openmpi 6.3). der Rahmen der Arbeit verwendet werden soll, auf eine einzige Maschine.
nun, ich bin den Vergleich mit anderen früheren Skelett-Implementierungen (wie scandium, fast-flow, ..)
Eine Sache, die ich bemerkt habe, ist, dass die Leistung meine Umsetzung ist nicht so gut wie die anderen Implementierungen.
Ich denke, das ist, weil, meine Implementierung basiert auf MPI (also eine zweiseitige Kommunikation, die verlangen, dass die übereinstimmung von sende-und Empfangsvorgang)
während die anderen Implementierungen, ich bin den Vergleich mit sind basierend auf shared memory. (... aber noch habe ich keine gute Erklärung zu Grund heraus, dass, und es ist ein Teil meiner Frage)
Gibt es einige großen Unterschied auf die Dauer von zwei Kategorien.
Ich bin heute auch eingeführt, um die Konfiguration der open-mpi für shared memory hier => openmpi-sm
und es kommen kommt meine Frage.
1. was es bedeutet, konfigurieren MPI für shared-memory? Ich meine, während der MPI-Prozesse, die Leben in Ihrer eigenen virtuellen Speicher; was ist wirklich die fahne wie in dem folgenden Befehl tun?
(Ich dachte im MPI jede Kommunikation ist, indem Sie explizit die Weitergabe einer Nachricht, kein Speicher freigegeben, zwischen Prozessen).
shell$ mpirun --mca btl self,sm,tcp -np 16 ./a.out
2. warum ist die Leistung des MPI ist so viel schlechter im Vergleich zu anderen Skelett-Umsetzung entwickelt, die für shared-memory? Zumindest bin ich auch es läuft auf einem einzigen multi-core-Maschine.
(Ich vermute, dass es ist, weil andere Implementierung verwendet, Threads, parallele Programmierung, aber ich habe keine überzeugende Erklärung dafür).
jede Anregung oder weitere Diskussion ist sehr willkommen.
Bitte lassen Sie mich wissen, wenn ich habe, um eine weitere Klärung meiner Frage.
vielen Dank für Ihre Zeit!
Du musst angemeldet sein, um einen Kommentar abzugeben.
Open MPI ist sehr modular aufgebaut. Es hat seine eigenen Komponenten-Modell, das sogenannte Modulare Komponenten-Architektur (MCA). Dies ist, wo der name des
--mca
parameter kommt aus - es wird verwendet, um Laufzeit-Werte für MCA-Parameter exportiert werden, indem die verschiedenen Komponenten in der MCA.Immer, wenn zwei Prozesse in einem communicator wollen miteinander reden, MCA findet die passenden Komponenten, die in der Lage sind, die zum übertragen der Nachrichten von einem Prozess zum anderen. Wenn beide Prozesse befinden sich auf dem gleichen Knoten, Open MPI in der Regel nimmt die shared-memory-BTL-Komponente, bekannt als
sm
. Wenn beide Prozesse auf unterschiedlichen Knoten befinden, Open MPI Spaziergänge die verfügbaren Netzwerk-Schnittstellen und wählt die Schnellste, können eine Verbindung zu den anderen Knoten. Es setzt einige Einstellungen, die auf schnelle Netze wie InfiniBand (über dieopenib
BTL-Komponente), aber wenn der cluster nicht über InfiniBand, TCP/IP als fallback verwendet, wenn dietcp
BTL-Komponente ist in der Liste der erlaubten BTLs.Standardmäßig müssen nicht etwas besonderes tun, damit die shared-memory-Kommunikation. Starten Sie Ihr Programm mit
mpiexec -np 16 ./a.out
. Was Sie verlinkt haben ist die shared-memory-Teil der Open-MPI-FAQ gibt Hinweise, auf welche Parameter dersm
BTL könnte optimiert werden, um bessere Leistungen zu erzielen. Meine Erfahrung mit Open MPI zeigt, dass die default-Parameter sind fast optimal und die Arbeit sehr gut, auch auf exotische hardware wie multilevel-NUMA-Systeme. Beachten Sie, dass die Standard shared memory-Kommunikation-Implementierung kopiert die Daten zweimal - einmal von der send-Puffer shared memory und einmal aus dem gemeinsamen Speicher zu Puffer. Eine Verknüpfung existiert in form der KNEM kernel-Gerät, aber Sie haben, um es herunterzuladen und kompilieren Sie es separat, da es nicht Teil des standard Linux kernel. Mit KNEM-Unterstützung, Open MPI ist in der Lage zu führen "zero-copy" Transfer zwischen Prozessen auf demselben Knoten - das kopieren erfolgt durch das kernel-Gerät, und es ist eine direkte Kopie aus dem Speicher des ersten Prozesses, um die Erinnerung an den zweiten Prozess. Dies verbessert die übertragung von großen Nachrichten zwischen Prozessen, die sich auf den gleichen Knoten.Andere Möglichkeit ist, zu vergessen MPI und shared memory direkt. Sie können verwenden die POSIX-Speicher-management-Schnittstelle (siehe hier) zu erstellen, ein shared-memory-block haben alle Prozesse laufen auf es direkt. Wenn die Daten im shared memory abgelegt, könnte es von Vorteil sein, da keine Kopien gemacht werden würde. Aber watch out für NUMA-Probleme auf modernen multi-socket-Systemen, wo jede Steckdose hat einen eigenen Speicher-controller und den Zugriff auf den Speicher von remote-buchsen auf der gleichen Platte ist langsamer. Prozess pinning/Bindung ist auch wichtig - pass
--bind-to-socket
zumpiexec
zu haben pinn jeder MPI-Prozess auf einem separaten CPU-Kern.modprobe
es. Es baut gegen alle kernel seit version 2.6.15.