每个节点发送特定数据并在MPI-Python中收集结果

时间:2017-06-04 03:57:38

标签: python python-3.x parallel-processing mpi mpi4py

我在mpi4py中执行此程序时遇到问题。我的目标是将特定数据发送到特定节点(这就是我不使用分散的原因)。之后,处理每个节点中的数据,最后收集所有结果。

显然,我的程序不了解如何从不同节点收集数据(可能因为聚集被设计为使用分散)。我试着用comm.send()发送日期并用comm.gather()收集。当我执行程序时,它会永远运行,我看不到任何结果。

您能帮我找出如何从不同节点收集数据吗?还有其他功能吗?我可能需要在节点上循环吗?

from mpi4py import MPI
import numpy as np

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

if rank == 0:
    data = list(np.arange(size) + 1)
    for i in range(size):
        comm.send(data[i], dest=i)
else:
    data = comm.recv(source=0)
    data += 1

print("rank", rank, "has data", data)

newData = comm.gather(data, root = 0)

if rank == 0:

    print("master collected", newData)

2 个答案:

答案 0 :(得分:1)

阻止这种情况的原因是您在发布匹配的接收之前尝试将数据从等级0发送到自身。这是一个僵局。现在您可以简单地跳过从等级0发送到自身 - 只需复制适当的数据。或者您可以使用非阻止点对点通信(isend / irecv)。

然而,你不应该。惯用方法确实是使用scatter,它的工作正常,例如:

if rank == 0:
    full_data = list(np.arange(size) + 1)
else:
    full_data = None
data = comm.scatter(full_data)

答案 1 :(得分:0)

您需要使用Scatter。它完全符合您的要求。请参阅此处以获取说明:http://mpitutorial.com/tutorials/mpi-scatter-gather-and-allgather/