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!
Qu'essayez-vous d'accomplir avec le wrapper 'test.py'? Je crois que vous êtes supposé 'spawn (SOME_MPI_EXECUTABLE_HERE), ...'. – Zulan
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
Je suis d'accord avec @Zulan, vous devriez démarrer l'exécutable directement via l'appel MPI_Spawn. –