Frage

Ich möchte kollektive Kommunikation leicht auszuführen indepandently auf jeder Maschine meines Cluster. Lassen Sie sagen, dass ich mit 8 Kernen auf jeweils 4 Maschinen haben, würde mein mpi Programm 32 MPI Aufgaben ausführen. Was ich möchte, ist, für eine gegebene Funktion:

  • auf jedem Host, nur eine Aufgabe, eine Berechnung durchführen, andere Aufgaben nichts tun, während dieser Berechnung. In meinem Beispiel tun 4 MPI Aufgaben die Berechnung, 28 andere warten.
  • , sobald die Berechnung abgeschlossen ist, jeweils MPI Aufgaben auf jeder wird eine kollektive Kommunikation nur durchführen, um lokale Aufgaben (Tasks auf demselben Host ausgeführt wird).

Konzeptionell verstehe ich, dass ich für jeden Host ein Kommunikator erstellen müssen. Ich suchte herum, und fand nichts explizit das zu tun. Ich bin nicht wirklich bequem mit MPI-Gruppen und Kommunikatoren. Hier ist meine zwei Fragen:

  • wird MPI_Get_processor_name ist einzigartig genug für ein solches Verhalten?
  • allgemeine, haben Sie ein Stück Code, das zu tun?
War es hilfreich?

Lösung

Die Spezifikation sagt, dass MPI_Get_processor_name returns „Ein eindeutiger Bezeichner für die tatsächlichen (im Gegensatz zu virtuellem) Knoten“, so dass ich denke, Sie das in Ordnung sein würden. Ich denke, Sie tun würde ein sammeln alle Hostnamen zu montieren und dann assign Gruppen von Prozessoren zu gehen und ihre Kommunikatoren zu machen; oder dup MPI_COMM_WORLD, drehen Sie die Namen in integer Hashes, und verwenden Sie MPI_Comm_split den Satz zu partitionieren.

könnten Sie nehmen auch den Ansatz janneb und Optionen Gebrauch implementierungsspezifische schlägt vor, die MPI-Implementierung Abtretungs Aufgaben mpirun, um sicherzustellen, dass auf diese Weise; OpenMPI verwendet --byslot diese Ordnung zu erzeugen; mit mpich2 können Sie -Druck-Rang-Karte zu sehen, die Zuordnung verwenden.

Aber ist das wirklich, was Sie tun wollen? Wenn die anderen Prozesse im Leerlauf sitzen, während ein Prozessor arbeitet, wie ist das besser als alle redundant die Berechnung zu tun? (Oder ist dies sehr Speicher oder I / O-intensiven, und du bist über Konkurrenz besorgt?) Wenn Sie vorhaben, eine Menge von diesem zu tun - auf Knoten Behandlung von Parallelisierung sehr verschieden von Off-Knoten Parallelisierung - dann Sie können über Hybrid-Programmiermodelle denken -. eine MPI Aufgabe pro Knoten und MPI_spawning Unteraufgaben laufen oder OpenMP mit für on-Knoten-Kommunikation, sowohl als von HPM vorgeschlagen

Andere Tipps

Ich glaube nicht, (erzogen Gedanke, nicht endgültig), dass Sie in der Lage sein zu tun, was Sie in Ihrem MPI-Programm vollständig aus wollen.

Die Reaktion des Systems auf einen Anruf zu MPI_Get_processor_name ist systemabhängig; es könnte node00, node01, node02, node03 gegebenenfalls Rückkehr auf Ihrem System, oder es könnte zurückkehren my_big_computer für was auch immer Prozessor Sie auf tatsächlich ausgeführt wird. Ersteres ist wahrscheinlicher, aber es ist nicht garantiert.

Eine Strategie wäre 32 Prozesse zu starten und, wenn Sie feststellen können, welche Knoten jeweils auf ausgeführt wird, partitionieren Communicators in 4 Gruppen, eine auf jedem Knoten. Auf diese Weise können Sie verwalten inter- und intra Kommunikation selbst, wie Sie möchten.

Eine andere Strategie wäre vier Prozesse zu starten und sie an verschiedenen Knoten fixieren. Wie Sie Prozesse Knoten (oder Prozessoren) Stift auf Ihrer MPI Laufzeit abhängen und jedem Job-Management-System, das Sie könnten, wie Grid Engine haben. Dies wird wahrscheinlich beinhalten Umgebungsvariablen - aber Sie uns nicht über Ihr Laufzeitsystem sagen, so etwas können wir nicht erraten, was sie sein könnten. Sie könnten dann Spawn weitere 7 (oder 8) Prozesse dynamisch zu jeder der 4 verarbeitet haben, und denen auf demselben Knoten wie der erste Prozess Pin. Dazu lesen Sie zum Thema Interkommunikatoren und Ihre Laufzeitsystem-Dokumentation.

Eine dritte Strategie, jetzt ist es ein wenig verrückt bekommen, wäre zu starten 4 separate MPI-Programme (8 Prozesse jeweils), eine auf jedem Knoten des Clusters, und sie zu verbinden, wie sie auszuführen. Lesen Sie mehr über MPI_Comm_connect und MPI_Open_port für Details.

Schließlich für zusätzlichen Spaß, könnten Sie Ihr Programm betrachten zu hybridisieren, auf jedem Knoten einen MPI-Prozess ausgeführt, und haben jeden dieser Prozesse ausführen, um ein OpenMP Shared-Memory (Teil-) Programm.

Normalerweise kann Ihre MPI-Laufzeitumgebung zum Beispiel gesteuert werden von Umgebungsvariablen, wie Aufgaben werden über Knoten verteilt. Der Standard neigt sequentielle Zuordnung zu sein, die über 4 8-Core-Maschinen verteilen für Ihr Beispiel mit 32 Aufgaben ist, dann würden Sie haben

  • Maschine 1: MPI Reihen 0-7
  • Maschine 2: MPI Reihen 8-15
  • Maschine 3: MPI Reihen 16-23
  • Maschine 4: MPI Reihen 24-31

Und ja, MPI_Get_processor_name sollten Sie den Host-Namen, so dass Sie herausfinden können, wo die Grenzen zwischen Hosts sind.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top