在使用mpi4py的并行环境中第一次迭代完成后,在for循环中使用Popen的系统调用失败

时间:2013-04-17 18:14:43

标签: python python-2.7 subprocess mpi hpc

下面的一个简单的脚本将显示Popen在最简单的情况下只在循环中发送“ECHO”只能在第一次迭代中运行(在带有RHEL 5的IBM iDataplex x86系统上运行)。第一次迭代它可以对Popen进行多次调用而没有任何问题,但之后只有4个进程可以访问Popen。因此,如果存在需要将信息传递给所有进程的调用(例如,allgather以便需要屏障),则不会传递任何内容,因为对于除4个进程之外的所有进程,stdo =''(空字符串)。如果使用while循环,那么它永远不会退出,因为除了4个进程之外的所有进程都会被循环捕获。这是特定于这个系统还是这里的任何人都知道这是怎么回事?

如果在4个或更少的进程上运行,它可以正常工作。

from mpi4py import MPI
from subprocess import Popen, PIPE

comm = MPI.COMM_WORLD
rank = comm.Get_rank()
num_proc = comm.Get_size()
if rank == 0:
    start_time = MPI.Wtime()
for i in range(10):
    stdo = ''
    cmd = ['echo','HELLO']
    # while stdo == '':
    a = Popen(cmd, shell=False, stdout=PIPE, stdin=PIPE)
    stdo, stder = a.communicate("Input")
    a.wait()
    if stdo != "HELLO\n":
        print "Rank", rank, "ITER: ", i, "OUT: ", stdo
    # comm.barrier()
    # r = comm.allgather(stdo) #Causes infinite loop because any number above 4 processors after the first iteration will never exit the while loop
#if any collective operation or barrier is removed, it will work properly
if rank == 0:
    print "Num Proc is", num_proc, "Time is",  MPI.Wtime() - start_time

1 个答案:

答案 0 :(得分:1)

Popen的第一个参数(传递给bash的内容)需要是一个字符串。我也总是做shell = True。如果你是编写脚本的人,你知道代码应该做什么,所以运行是安全的。

cmd = 'echo HELLO'
a = Popen(cmd, shell=True, stdout=PIPE, stdin=PIPE)