1

以下の簡単なスクリプトは、ループで「ECHO」を送信するだけの最も単純なケースで Popen が最初の反復でのみ機能することを示しています (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
4

1 に答える 1

1

Popen の最初の引数 (bash に渡されるもの) は文字列である必要があります。また、常に shell=True を実行します。あなたがスクリプトを書いているのであれば、コードが何をすべきかを知っているので、安全に実行できます。

cmd = 'echo HELLO'
a = Popen(cmd, shell=True, stdout=PIPE, stdin=PIPE)
于 2013-11-22T15:44:40.150 に答える