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)
どうしてですか?また、この「ある時点に到達するプロセスを待つ」ことが他の何かでより簡単にできる場合は、私に知らせてください!ありがとう!
神と
を交換する
試して...ありがとうございました! –
誰もがしばらくして目の余分なペアを必要とします:-) –
私の前提は正しいですか、 'recv'はブロックしていますか? –