2010-11-23 13 views
0

Wie benutzt man MPI_Comm_spawn, um Arbeitsprozesse auf entfernten Knoten zu starten?mpi_comm_spawn auf entfernten Knoten

Mit OpenMPI 1.4.3 habe ich diesen Code versucht:

MPI_Info info; 
MPI_Info_create(&info); 
MPI_Info_set(info, "host", "node2"); 
MPI_Comm intercom; 
MPI_Comm_spawn("worker", 
     MPI_ARGV_NULL, 
     nprocs, 
     info, 
     0, 
     MPI_COMM_SELF, 
     &intercom, 
     MPI_ERRCODES_IGNORE); 

Aber das schlägt mit dieser Fehlermeldung:

 
-------------------------------------------------------------------------- 
There are no allocated resources for the application 
    worker 
that match the requested mapping: 


Verify that you have mapped the allocated resources properly using the 
--host or --hostfile specification. 
-------------------------------------------------------------------------- 
-------------------------------------------------------------------------- 
A daemon (pid unknown) died unexpectedly on signal 1 while attempting to 
launch so we are aborting. 

There may be more information reported by the environment (see above). 

This may be because the daemon was unable to find all the needed shared 
libraries on the remote node. You may set your LD_LIBRARY_PATH to have the 
location of the shared libraries on the remote nodes and this will 
automatically be forwarded to the remote nodes. 
-------------------------------------------------------------------------- 

Wenn ich ersetzen die "Knoten2" mit dem Namen meine lokale Maschine, dann funktioniert es gut. Wenn ich in node2 ssh bin und dort dasselbe ausführe (mit "node2" im info dictionary), dann funktioniert es auch gut.

Ich möchte nicht den übergeordneten Prozess mit mpirun starten, also bin ich nur auf der Suche nach einer Möglichkeit, Prozesse auf Remote-Knoten dynamisch zu spawnen. Ist das möglich?

Antwort

1

Ich will nicht den übergeordneten Prozess mit mpirun starten, so dass ich nur nach einer Möglichkeit, dynamisch Prozesse auf entfernten Knoten laichen. Ist das möglich?

Ich bin mir nicht sicher, warum Sie es nicht mit mpirun starten möchten? Sie starten implizit die gesamte MPI-Maschine, sobald Sie MPI_Init() drücken, so dass Sie nur die Optionen übergeben, anstatt sich auf den Standard zu verlassen.

Das Problem hierbei ist nur, dass, wenn die MPI-Bibliothek gestartet wird (bei MPI_Init()) es keine anderen Hosts verfügbar ist zu sehen, weil Sie es für alle mit den --host oder --hostfile Optionen nicht gegeben haben nach mpirun. Es wird nicht nur Prozesse an anderer Stelle auf Ihrer Say-So starten (in der Tat, Spawn benötigt keine Info-Host, so im Allgemeinen würde es nicht einmal wissen, wo sonst zu gehen), so dass es fehlschlägt.

So brauchen Sie mpirun --host myhost,host2 -np 1 ./parentjob oder, allgemeiner, bieten einen Hostfile, vorzugsweise mit einer Anzahl von Slots zur Verfügung

myhost slots=1 
host2 slots=8 
host3 slots=8 

und starten Sie die Jobs für diese Art und Weise zu tun, mpirun --hostfile mpihosts.txt -np 1 ./parentjob Dies ist ein Merkmal, kein Fehler; Jetzt ist es Aufgabe von MPIs herauszufinden, wohin die Arbeiter gehen, und wenn Sie in den Informationen keinen expliziten Host angeben, wird er versuchen, ihn an den am wenigsten ausgelasteten Platz zu bringen. Es bedeutet auch, dass Sie nicht neu kompilieren müssen, um die Hosts zu ändern, auf die Sie spawnen.

+0

Danke. Der Grund, warum ich mpirun vermeiden möchte, ist, dass ich eine MATLAB-Mex-Datei schreibe, die einen Teil der Berechnung auslastet. Also habe ich nur eine einzige C-Datei, die MATLAB für mich aufruft, was bedeutet, dass Hostnamen programmgesteuert angegeben werden müssen. Ich nehme an, das bedeutet, ich muss mpirun in einem neuen Prozess von meiner mex-Datei irgendwie aufrufen? – krashalot

+0

Ah, ja. Sie könnten immer nur das mex-Dateiaufrufsystem ("mpirun ..") haben, wenn das erlaubt ist, oder sogar ein Bash-Skript aufrufen, das mpirun aufruft ... Ich kann sehen, wo Sie diese mehreren Ebenen vermeiden wollen. Eine andere Sache, die ich gerade versucht habe, die mit OpenMPI zu arbeiten scheint - aber so schrecklich ist, dass ich mich schäme, meinen Namen damit auf SO zu haben - ist das Folgende: 'int fakeargc = 6; char ** fakeargv = {"mpirun", "--hostfile", "mpihosts.txt", "- np", "1", "./elternjob"}; MPI_Init (& fakeargc, & fakeargv); '. Ich kann mir nicht vorstellen, dass das empfohlen wird, oder würde sogar zuverlässig mit anderen MPIs arbeiten. –

+0

Oh gut. Sieht so aus, als ob die zusätzlichen Schichten notwendig sind. Dein Trick wäre für mich akzeptabel gewesen, aber leider hat er hier nicht funktioniert (er musste ihn als char * fakeargv [] definieren und dann nach char ***). Ich habe ein wenig mehr durch OpenMPI und mpich2 docs gegraben, und es sieht so aus, als ob zu diesem Zeitpunkt keiner von beiden Spawning-Prozesse auf entfernten Notizen unterstützt, wenn sie nicht über mpirun/mpiexec aufgerufen werden. – krashalot

Verwandte Themen