mpi4py:通过send / recv向从站发送消息时出错

时间:2018-04-08 11:10:21

标签: python mpi mpi4py

我正在尝试在slurm集群上运行以下代码。逻辑很简单:主节点将列表项发送到从节点进行打印。它最终使用tag = 1的消息告诉从服务器终止循环。

$record['data']

我在本地计算机上获得此输出,这是预期的:

from mpi4py import MPI

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


if rank == 0:
    data = ['string1', 'string2', 'string3']
    for k in data:
        comm.send(k, dest=1, tag=11)
    comm.send('', dest=1, tag=1)
elif rank == 1:
    while True:
        print('trying to get something')
        item = comm.recv(source=0,status=status)

        if status.tag == 1:
            print('terminating')
            break

        print(item)

但是在集群上,它向我显示了以下输出,似乎奴隶在第一个comm.recv期间被无限期地阻塞。

trying to get something
string1
trying to get something
string2
trying to get something
string3
trying to get something
terminating

我很欣赏有关终止奴隶或解决上述问题的逻辑缺陷的任何想法。

1 个答案:

答案 0 :(得分:-1)

我能看到的唯一原因是recv的标签与任何标签都不匹配,然后recv不返回。但我认为默认标签确实是MPI.ANY_TAG,也许不是。 尝试在recv中添加:tag = MPI.ANY_TAG 如果它不起作用,请尝试不带标记的代码。然后尝试修复标签版本。

但是你可能对结果感到惊讶......可能是recv采取的第一个消息是tag = 1的消息,因此打破了。它根本不是一个安全的代码。

如果你想这样做:从给定的发件人那里获取任意数量的邮件,最好使用非阻塞通信。