Comment utiliser MPI_Comm_spawn pour démarrer des processus de travail sur des noeuds distants?mpi_comm_spawn sur les noeuds distants
En utilisant OpenMPI 1.4.3, j'ai essayé ce code:
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);
Mais cela échoue avec ce message d'erreur:
-------------------------------------------------------------------------- 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. --------------------------------------------------------------------------
Si je remplace le "node2" avec le nom de ma machine locale, alors ça marche bien. Si je ssh dans node2 et exécute la même chose là (avec "node2" dans le dictionnaire d'info) alors cela fonctionne aussi bien.
Je ne veux pas démarrer le processus parent avec mpirun, donc je cherche juste un moyen de générer dynamiquement des processus sur des nœuds distants. Est-ce possible?
Merci. La raison pour laquelle je veux éviter mpirun est que j'écris un fichier MATLAB mex qui décharge une partie du calcul. Je n'ai donc qu'un seul fichier C que MATLAB invoque pour moi, ce qui signifie que les noms d'hôte doivent être spécifiés par programmation. Je suppose que cela signifie que je dois invoquer mpirun dans un nouveau processus de mon fichier mex en quelque sorte? – krashalot
Ah, ouais. Vous pouvez toujours avoir le système d'appel de fichier mex ("mpirun .."), si cela est autorisé, ou même l'appeler par un script bash qui appelle mpirun ... Je peux voir où vous voulez éviter ces couches multiples. Une autre chose que je viens d'essayer qui semble fonctionner avec OpenMPI - mais qui est si horrible que j'ai honte d'avoir mon nom associé sur SO - est la suivante: 'int fakeargc = 6; char ** fakeargv = {"mpirun", "--hostfile", "mpihosts.txt", "- np", "1", "./ parentjob"}; MPI_Init (& fakeargc, & fakeargv); '. Je ne peux pas imaginer que c'est recommandé, ou même travailler de manière fiable avec d'autres MPI. –
Oh bien. On dirait que les couches supplémentaires seront nécessaires. Votre tour aurait été acceptable pour moi, mais malheureusement n'a pas fonctionné ici (a dû le définir comme char * fakeargv [] en passant, et puis jeté à char ***). J'ai creusé un peu plus les docs openmpi et mpich2, et il semble qu'à ce moment-là aucun d'entre eux ne supporte les processus de génération de notes distantes sauf si invoqué via mpirun/mpiexec. – krashalot