产生mpi4py过程后的障碍

时间:2016-09-21 16:57:55

标签: python parallel-processing mpi mpi4py

我有一段代码使用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.....")

谢谢!

1 个答案:

答案 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)