Python MPI4通过分散、收集和发送recv
我试图在进程之间进行通信,如下面的代码所示,这样每个处理器都有两个数据字典,即。“数据”和“数据预览”。dataPrev是来自上一个排名处理器的字典Python MPI4通过分散、收集和发送recv,python,mpi,mpi4py,Python,Mpi,Mpi4py,我试图在进程之间进行通信,如下面的代码所示,这样每个处理器都有两个数据字典,即。“数据”和“数据预览”。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.ise
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)
然后将关键数据['a']中具有最高值的字典分散到不同的处理器中。
我不确定如何“分散”&如果我使用的代码逻辑正确,或者有更简单的方法 想出了一个解决办法 发送和接收:
reqSend1 = self.comm.isend(data, dest=((self.size+self.rank+1)%self.size), tag=self.rank)
reqRecv2 = self.comm.irecv(source=((self.size+self.rank-1)%self.size), tag=self.rank-1)
dataPrev = reqRecv2.wait()
reqSend1.wait()
对于python字典的聚集和分散,代码逻辑如下所示:
聚集功能:
if rank == 0:
comm.Gather(data, root=0)
if rank == 0:
comm.Scatter(data, root=0)
散射函数:
if rank == 0:
comm.Gather(data, root=0)
if rank == 0:
comm.Scatter(data, root=0)
只是对“完成”代码的注释。您通过等待立即跟踪非阻塞发送和接收,这意味着这些调用与阻塞版本相同。因此,如果MPI允许同步实现“发送”(即未缓冲),则编写的代码可能会死锁。您需要在等待发送之前发布接收,或者使用“sendrecv”。和以往一样,也不需要屏障。但是,是的,现在我要发出四个“请求”和“等待”它们都发送和接收。关于如何收集和分发词典的任何建议。我需要定义数据类型吗?或者,如果秩=0:data=comm.gather(data,root=0),我可以简单地编写