2016-09-21 2 views
1

J'essaie d'utiliser mpi4py pour appeler une deuxième instance d'un exécutable mpi.Imbrication des appels mpi avec mpi4py

Je reçois l'erreur:

Open MPI does not support recursive calls of mpirun 

Mais j'avais l'impression qui est exactement ce que Spawn est censé être capable de gérer - à savoir la mise en place d'un nouveau communicateur dans lequel une autre commande mpi pourrait être lancé .

Le code de test:

parent.py:

#!/usr/bin/env python 
from mpi4py import MPI 
import numpy 
import sys 


rank = MPI.COMM_WORLD.Get_rank() 
new_comm = MPI.COMM_WORLD.Split(color=rank, key=rank) 
print(new_comm.Get_rank()) 
new_comm.Spawn(sys.executable, 
          args=['test.py'], 
          maxprocs=4) 

qui appelle test.py:

#!/usr/bin/env python 
from mpi4py import MPI 
import numpy 
import os 
import sys 

comm = MPI.Comm.Get_parent() 
rank = comm.Get_rank() 

cwd=os.getcwd() 
directory=os.path.join(cwd,str(rank)) 
os.chdir(directory) 


os.system('{}'.format('mpirun -np 4 SOME_MPI_EXECUTABLE_HERE')) 



print("Finished in "+directory) 
os.chdir(cwd) 

comm.Disconnect() 

Je suis en cours d'exécution avec:

mpirun --oversubscribe -np 1 parent.py 

aide openmpi 2.0.0 avec gcc, et python/3.4.2

Quelqu'un a des idées brillantes pour expliquer pourquoi ce qui se passe .....

Merci!

+2

Qu'essayez-vous d'accomplir avec le wrapper 'test.py'? Je crois que vous êtes supposé 'spawn (SOME_MPI_EXECUTABLE_HERE), ...'. – Zulan

+0

Le wrapper est nécessaire car MPI_EXECUTABLE_HERE que j'appelle n'est pas écrit en python et ne fonctionnera donc pas avec l'interpréteur sys.executable. Le morceau de code mpi que j'appelle dans le script python est écrit en fortran. – abinitio

+0

Je suis d'accord avec @Zulan, vous devriez démarrer l'exécutable directement via l'appel MPI_Spawn. –

Répondre

2

Le code suivant semble fonctionner comme je le souhaitais.

#!/usr/bin/env python 
from mpi4py import MPI 
import numpy 
import sys 
import os 

rank = MPI.COMM_WORLD.Get_rank() 
new_comm = MPI.COMM_WORLD.Split(color=rank, key=rank) 
print(new_comm.Get_rank()) 

cwd=os.getcwd() 
os.mkdir(str(rank)) 
directory=os.path.join(cwd,str(rank)) 
print(rank,directory) 
os.chdir(directory) 


new_comm.Spawn("SOME_MPI_EXECUTABLE_HERE", 
        args=[""], 
          maxprocs=4) 

initiée avec:

mpirun --oversubscribe -np 4 parent.py

semble commencer 4 instances de chaque SOME_MPI_EXECUTABLE fonctionnant sur 4 coeurs.

(Merci à Zulan)

+0

Le commentaire de @Hristo sous la question originale s'applique toujours. Au lieu de créer 'new_comm' vous pouvez simplement utiliser' MPI.COMM_SELF.Spawn'. Cela donnera les mêmes résultats que le code que vous avez posté ici et rendra cette réponse encore plus utile (j'ai moi-même commencé à partir de cette réponse, merci btw., Et il m'a fallu un certain temps pour comprendre la signification de 'Split',' couleur ',' key' avant que j'ai compris que ce n'est même pas nécessaire) – Bananach