Python MPI 正在等待一个正在通信的进程

Python MPI waiting for a process with communication

我最近开始使用 MPI4PY 将我的项目从 SCOOP 迁移到 MPI。

我使用 SCOOP 基本上将 for 循环与定义并行化。我希望主进程等待其他进程完成(最后我想做一些不同的事情,但为了测试就足够了)。

为了实现这一点,我想我会在每个进程完成后发送一个 "message" 像 "ASD" frm,并在主进程中收集它,并且只继续接收所有进程。

但是由于某些原因我收不到这些消息。

我想做的是:

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")

我试图简化我的问题,所以如果我从教程代码开始:

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)

它工作得很好。但是,如果我尝试从多个进程发送到进程 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)

为什么会这样?另外,如果这个 "wait for a process to reach a certain point" 事情可以用其他东西更容易地完成,请告诉我!谢谢!

rank 0 由于范围不正确,未收到任何任务。

尝试替换

for i in range(1, rank):

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