2010-11-23 5 views
0

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?

Répondre

1

Je ne veux pas commencer le processus parent avec mpirun, donc je suis juste à la recherche d'un moyen de frayer dynamiquement processus sur les nœuds distants. Est-ce possible?

Je ne sais pas pourquoi vous ne voulez pas le démarrer avec mpirun? De toute façon, vous lancez implicitement tout le mécanisme MPI dès que vous cliquez sur MPI_Init(), de cette façon vous pouvez simplement passer les options au lieu de vous fier à la valeur par défaut. Le problème ici est simplement que quand la bibliothèque MPI démarre (à MPI_Init()) elle ne voit aucun autre hôte disponible, parce que vous ne lui en avez pas donné avec les options --host ou --hostfile à mpirun. Il ne lancera pas seulement des processus ailleurs sur votre say-so (en effet, spawn ne nécessite pas d'hôte Info, donc en général il ne sait même pas où aller sinon), donc ça échoue.

Vous aurez besoin de faire mpirun --host myhost,host2 -np 1 ./parentjob ou, plus généralement, fournir un hostfile, de préférence avec un certain nombre de créneaux horaires disponibles

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

et de lancer les travaux de cette façon, mpirun --hostfile mpihosts.txt -np 1 ./parentjob Ceci est une caractéristique, pas un bug; maintenant c'est le travail de MPI de comprendre où les ouvriers vont, et si vous ne spécifiez pas un hôte explicitement dans l'information, il essayera de le mettre dans l'endroit le plus sous-utilisé. Cela signifie également que vous n'avez pas à recompiler pour modifier les hôtes auxquels vous allez revenir.

+0

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

+0

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. –

+0

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

Questions connexes