我有一段代码使用mpi4py来生成mpi exectuable的几个实例。我希望代码在这些进程完成时停止,然后调用同一个可执行文件的第二组。
问题是所有对mpi可执行文件的调用都会立即生成。
似乎没有办法使用障碍来防止这种情况发生。有谁知道这是否正确,如果有的话,是否有人有一个明智的想法来获得我需要的结果。
#!/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()
directory=os.path.join(cwd,str(rank))
print(rank,directory)
os.chdir(directory)
new_comm.Spawn("SOME_F90_MPI_EXECUTABLE",
args=None,
maxprocs=4)
'''I want to pause here until the spawned processes finish running...'''
new_comm.Barrier()
MPI.COMM_WORLD.Barrier()
print(new_comm.Get_rank())
cwd=os.getcwd()
directory=os.path.join(cwd,str(rank))
print(rank,directory)
os.chdir(directory+"_2")
new_comm.Spawn("SOME_F90_MPI_EXECUTABLE",
args=["> output"],
maxprocs=4)
new_comm.Disconnect()
print("All finished here.....")
谢谢!
答案 0 :(得分:1)
您必须使用Spawn
返回的 intercommunicator :
child_comm = MPI.COMM_WORLD.Spawn("./spawnchild.py", args=None, maxprocs=2)
child_comm.Barrier()
对于孩子,获取父 intercommunicator (类似于Fortran):
parent = MPI.COMM_WORLD.Get_parent()
assert(parent != MPI.COMM_NULL)
parent.Barrier();
请注意,由两组进程组成的 intercommunicator 的行为与传统的 intercommunicator 不同。例如。对于屏障,以下语义适用:
如果comm是一个intercommunicator,
MPI_BARRIER
涉及两个组。只有在另一组(组B)的所有成员都已进入呼叫(反之亦然)之后,呼叫才会在内部通信器的一个组(组A)中的进程处返回。进程可以在其自己的组中的所有进程都已进入呼叫之前从呼叫返回。
(MPI 3.1 Standard,5.3)