2016-06-28 4 views
2

Ich versuche die Spawn-Funktionalität von MPI zu verwenden, um Subprozesse auszuführen, die auch MPI verwenden. Ich verwende MPI 2x und dynamische Prozessverwaltung.MPI-Spawn: Nicht genügend Slots verfügbar/Alle für diesen Job zugewiesenen Knoten sind bereits gefüllt

Ich habe einen Master-Prozess (vielleicht sollte ich "Master-Programm" sagen), die in Python läuft (über mpi4py), die MPI verwendet, um zwischen Kernen zu kommunizieren. Dieser Master-Prozess/Programm läuft auf 16 Kernen, und es wird auch machen MPI_Comm_spawn_multiple Aufrufe an C und Fortran-Programme (die auch MPI verwenden). Während die C- und Fortran-Prozesse ausgeführt werden, wartet das Master-Python-Programm, bis sie abgeschlossen sind.

Ein wenig mehr explizit, das Master-Python-Programm hat zwei primäre Dinge:

  1. MPI Verwendet Vorverarbeitung für das Laichen zu tun, in Schritt (2). MPI_Barrier wird nach dieser Vorverarbeitung aufgerufen, um sicherzustellen, dass alle Ränge ihre Vorverarbeitung abgeschlossen haben, bevor Schritt (2) beginnt. Beachten Sie, dass die Vorverarbeitung über alle 16 Kerne verteilt ist, und am Ende der Vorverarbeitung die resultierende Information an den Stammrang zurückgegeben wird (z. B. rank == 0).
  2. Nach der Vorverarbeitung erzeugt der Stammrang 4 Worker, von denen jeder 4 Kerne verwendet (d. H. Alle 16 Kerne werden benötigt, um alle 4 Prozesse gleichzeitig auszuführen). Dies geschieht über MPI_Comm_spawn_multiple und diese Arbeiter verwenden MPI, um innerhalb ihrer 4 Kerne zu kommunizieren. Im Master-Python-Programm werden nur die C- und Fortran-Subprozesse mit erzeugt, und nach dem Spawn auf allen Rängen wird MPI_Barrier aufgerufen, so dass alle rank != 0 Cores warten, bis die erzeugten Prozesse abgeschlossen sind, bevor sie weiter ausgeführt werden.
  3. Wiederholen Sie (1) und (2) viele Male in einer for-Schleife.

Das Problem, das ich habe ist, dass wenn ich mpiexec -np 16 verwenden das Master-Python-Programm zu starten, werden alle Kerne durch das Master-Programm aufgenommen werden, und ich den Fehler:

All nodes which are allocated for this job are already filled.

wenn das Programm die MPI_Comm_spawn_multiple Zeile erreicht.

Wenn ich einen anderen Wert von weniger als 16 für -np, dann nur einen Teil des Kerns zugeordnet ist, und einige sind verfügbar (aber ich muß noch alle 16), so dass ich einen ähnlichen Fehler:

There are not enough slots available in the system to satisfy the 4 slots that were requested by the application: /home/username/anaconda/envs/myenvironment/bin/python

Either request fewer slots for your application, or make more slots available for use.

Es scheint also so, als würde ich in Schritt (2) MPI_Barrier laufen lassen, um zu blockieren, bis die erzeugten Prozesse beendet sind. MPI denkt immer noch, dass diese Kerne benutzt werden und wird keinen weiteren Prozess darüber zuweisen. Gibt es eine Möglichkeit, das zu beheben?

(Wenn die Antwort hostfiles, könnten Sie bitte erklären sie für mich? Ich bin nicht verstehen, die volle Idee und wie sie hier nützlich sein.)

+1

** Warum? ** Was Sie versuchen zu tun, scheint eine schlechte Lösung zu sein, es gibt wahrscheinlich einen besseren Weg, um das zu erreichen, was Sie wirklich brauchen. Bitte klären Sie auch Ihre Verwendung von Threads. Beachten Sie, dass in MPI 1 Prozess = 1 Rang ist, so dass es keinen Master-Prozess mit mehreren Rängen geben kann. – Zulan

+0

@Zulan, das "Warum" erfordert eine eingehende Erklärung, die meiner Meinung nach außerhalb des Umfangs dieses Beitrags liegt und eine> Seite erklären wird. Kurz gesagt, wird diese Parallelisierungstechnik in einen GA-Optimierungsrahmen für die materialwissenschaftliche Forschung integriert. Ich habe über einen Monat damit verbracht, dieses Problem zu untersuchen, und ich bin relativ zuversichtlich, dass dies die richtige Technik ist. Ich hoffe, ich habe die Threads in meinem editierten Beitrag geklärt. Sie werden sehen, dass diese Frage Python-, C- und Fortran MPI-Software betrifft. Aus diesem Grund habe ich die von Ihnen gelöschten Tags eingefügt, weil sie möglicherweise andere betreffen. –

+0

Ich glaube ich verstehe jetzt was du machen willst. Ein zusätzliches Problem mit Ihrem Ansatz, selbst wenn Sie das spezielle Problem, das Sie beobachten, beheben, ist, dass die meisten MPI-Implementierungen eine schreckliche Leistung haben, wenn sie überzeichnet arbeiten. Wenn Sie das Setup nicht sehr sorgfältig konfiguriert/abgestimmt haben, werden die ursprünglichen Vorverarbeitungsstufen die CPU-Zyklen verwenden, während sie an der Schranke warten und Ihre Mitarbeiter verlangsamen. Sie müssen auch das Batch-System berücksichtigen, wenn es sich um eine portable Infrastruktur handelt, die in HPC verwendet wird. Ich fürchte, ich kann mir keine gute Lösung für Ihr tatsächliches Problem vorstellen. – Zulan

Antwort

0

Dies ist das Plakat dieser Frage. Ich fand heraus, dass ich -oversubscribe als Argument zu mpiexec verwenden kann, um diese Fehler zu vermeiden, aber wie Zulan in seinen Kommentaren erwähnte, könnte dies eine schlechte Entscheidung sein.

Darüber hinaus weiß ich nicht, ob die Kerne abonniert werden, wie ich sie will. Zum Beispiel können möglicherweise alle 4 C/Fortran-Prozesse auf denselben 4 Kernen ausgeführt werden. Ich weiß nicht, wie ich es sagen soll.

+0

Unter Linux können Sie 'sched_getaffinity' verwenden, um zu überprüfen, welche Kerne einem Thread zugewiesen sind. Zum Beispiel hat OpenMPIs 'mpiexec' die Optionen' --report-bindings' und '-bind-to', um die Bindung zu melden und zu kontrollieren. – Zulan

Verwandte Themen