mpi4py:如果消息数量未知,如何确保所有发送的消息都收到了?

问题描述

我正在尝试在核心(工作人员)之间发送消息,但是消息的数量及其目的地是未知的。 我正在从事的工作与矩阵完成/ SGD有关。为此,我试图熟悉用于Python的MPI数据包 mpi4py

我的目标
每个工作人员都有一个本地列表,其中包含用于执行某些任务的数据。在设定的时间内,每个工作人员将不断从列表中删除项目,进行一些计算,然后将项目发送给另一位随机工作人员。该列表将很快变空,因此工作人员还必须检查其他随机工作人员发送的传入数据并将其添加到列表中。时间到时,所有工作人员都必须检索剩余的已发送消息。

由于工作人员不知道已发送给它的消息数量,因此我不知道如何确保所有消息都得到接收。在下面的尝试中,我试图让工作人员发送结束消息以表明这是最后一条消息,但此消息未收到。这是使用recv / irecv的错误时间吗?
理想的解决方案是让工作人员自己将项目添加到另一个工作人员的本地队列中。有办法吗?

import random
from mpi4py import MPI
import time

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

others = [i for i in range(size)]
others.remove(rank)
local_queue = [random.randint(0,100) for _ in range(5)]

timeout = time.time() + 2
while time.time() < timeout:
    req = comm.irecv()
    # Send data to random worker
    if len(local_queue) > 0:
        r = random.choice(others)
        comm.send(local_queue.pop(0),dest=r)
    # Try to retrieve sent messages
    status = req.test()
    if (status[0]):
        local_queue.append(status[1])
comm.Barrier()

# Send final message
for x in others:
    comm.send("Done",dest=x)
comm.Barrier()

# Retrieve remaining messages
for x in others:
    msg = comm.recv(source=x)
    while msg != "Done":
        local_queue.append(msg)
        msg = comm.recv(source=x)
    
print (rank,local_queue)

MPI.Finalize()

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)