【发布时间】:2019-01-13 19:05:59
【问题描述】:
我正在尝试在进程之间进行通信,如下面的代码所示,这样每个处理器都有两个数据字典,即。 “数据”和“数据上一个”。 dataPrev 是上一个排名处理器的字典
from Mpi4py import MPI
comm = MPI.COMM_WORLD
data = {'a': 11, 'b': b, 'c': c}
comm.barrier()
if rank == size-1: # last rank
reqSend = comm.isend(data, dest=0, tag=rank)
reqSend.wait()
else:
reqSend = comm.isend(data, dest=rank+1, tag=rank)
reqSend.wait()
if rank == 0:
reqRecv = comm.irecv(source=size-1, tag=rank)
dataPrev = reqRecv.wait()
else:
reqRecv = comm.irecv(source=rank-1, tag=rank)
dataPrev = reqRecv.wait()
comm.barrier()
一旦发送和接收发生,我将对存储在 dataPrev 键中的值进行一些更改。这一步就完成了。
然后,我将所有处理器的所有字典收集到 root = 0:如果有 P 个处理器,那么我总共有 2P 个字典。
senddata=[]
for j in range(3): # 3 keys in the data
senddata.append([1, data[j]])
for j in range(3): # 3 keys in the data
senddata.append([2, data[j]])
recvdata = None
if rank == 0:
comm.Gatherv(senddata, recvdata, root=0)
然后将 key data['a'] 中具有最高值的字典分散到不同的处理器中。 我不确定如何“分散”以及我使用的代码逻辑是否正确或者是否有更简单的方法。
【问题讨论】:
-
只是对“完成”的代码的评论。您正在通过等待立即跟踪非阻塞发送和接收,这意味着这些调用与阻塞版本相同。因此,如果允许 MPI 同步实现“发送”(即不缓冲),则编写的代码可能会死锁。您需要在等待发送之前发布接收,或使用“sendrecv”。与以往一样,也不需要屏障。
-
谢谢大卫,我尝试了文档中给出的确切代码 (mpi4py.scipy.org/docs/usrman/tutorial.html)。但是,是的,现在我要发出四个“请求”并“等待”它们全部发送和接收。关于如何收集和分散字典的任何建议。我需要定义数据类型吗?或者我可以简单地写 if rank == 0: data = comm.gather(data, root=0)