我在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)
答案 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/