2016-09-21 72 views
0

我有一段代码使用mpi4py来产生mpi exectuable的几个实例。我希望代码在这些进程完成时暂停,然后调用第二组相同的可执行文件。生成mpi4py进程后的屏障

问题是,所有对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

必须使用intercommunicator通过Spawn返回:

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,它由两组进程组成,其行为与传统的不同对讲机。例如。对于屏障,以下语义适用:

如果comm是通信器,MPI_BARRIER涉及两个组。只有在另一组(组B)的所有成员已经进入呼叫(反之亦然)之后,该呼叫才返回到该联通者的一个组(组A)中的进程。在自己的组中的所有进程进入呼叫之前,进程可能会从呼叫中返回。

MPI 3.1 Standard,5.3)

+0

太好了 - 谢谢Zulan。如果我正在循环产卵过程,在进入第二次循环之前是否需要断开/释放产卵返回的互通器? – abinitio

+0

我相信你应该断开intercommunicator,但我不完全确定标准是否指定。 – Zulan

+0

我不知道为什么,但f90可执行文件似乎在产生后挂起,尽管看起来已经完成 - 即所有的输出都完成了。当我运行f90可执行文件而无需从python脚本调用它时,它应该只需要几分之一秒,但是当它通过生成运行时,它会挂起几分钟。这是你之前注意到的吗? – abinitio