2017-10-26 11 views
0

私は最近、MPI4PYを使用してSCOOPからMPIに自分のプロジェクトを移行し始めました。Python MPIが通信中のプロセスを待っています

私は基本的にforループを定義と並列化するためにSCOOPを使用します。私はメインのプロセスが他のプロセスが完了するのを待つようにしたい(最後は何か別のことをしたいが、それは十分である)。

これを達成するには、仕上げ後のすべてのプロセスを "ASD" frmのような "メッセージ"を送信し、メインプロセスでそれを収集し、すべてを継続して受け取りました。

しかし、何らかの理由で私はこれらのメッセージを受け取ることができません。私がやりたいこと

がある:それは完全に正常に動作

from mpi4py import MPI 

comm = MPI.COMM_WORLD 
rank = comm.Get_rank() 

if rank == 0: 
    data = {'a': 7, 'b': 3.14} 
    comm.send(data, dest=1, tag=11) 
elif rank == 1: 
    data = comm.recv(source=0, tag=11) 
    print(data) 

from mpi4py import MPI 
import time 


def func(arg, rank): 
    startTime = time.time() 
    for i in arg: 
     print("Process %d: Took %f seconds for %s" % (rank, time.time() - startTime, i)) 
     comm.send("ASDASDASDAS", dest=0, tag=11) 

comm = MPI.COMM_WORLD 
rank = comm.Get_rank() 
size = comm.Get_size() 
my_lst = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18] 
if rank != 0: 
    chunk_size = (len(my_lst) // size) + 1 # number of files this process will handle 
    chunk = [x for x in range(rank * chunk_size, (rank + 1) * chunk_size)] # Fix this line to 
    func([my_lst[x] for x in chunk if x < len(my_lst)], rank) 
elif rank == 0: 
    for i in range(1,rank): 
     a = comm.recv(source=i, tag=11) 
     print(a) 
    print("Parallel done") 

私はチュートリアルのコードから始めるので、もし私が、私の問題を単純化しようとしました。しかし、私が複数のプロセスからプロセス0に送信しようとすると、出力が表示されません。

from mpi4py import MPI 

comm = MPI.COMM_WORLD 
rank = comm.Get_rank() 

if rank != 0: 
    data = {'a': 7, 'b': 3.14} 
    comm.send(data, dest=0, tag=11) 
else: 
    for i in range(1, rank): 
     data = comm.recv(source=i, tag=11) 
     print(data) 

どうしてですか?また、この「ある時点に到達するプロセスを待つ」ことが他の何かでより簡単にできる場合は、私に知らせてください!ありがとう!

答えて

1

ランク0不正な範囲のために、どのようなタスクからも受信しません。私は愚かだ

size = comm.Get_size() 
for i in range(1, size): 
+0

神と

for i in range(1, rank): 

を交換する

試して...ありがとうございました! –

+0

誰もがしばらくして目の余分なペアを必要とします:-) –

+0

私の前提は正しいですか、 'recv'はブロックしていますか? –

関連する問題