[英]Mpi4py scatter, gather and send-recv
我正在嘗試在下面的代碼中在進程之間進行通信,以便每個處理器都有兩個數據字典,即。 “數據”和“ dataPrev”。 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)
然后將關鍵數據['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字典的Gather和Scatter,代碼邏輯如下:Gather函數:
if rank == 0:
comm.Gather(data, root=0)
分散功能:
if rank == 0:
comm.Scatter(data, root=0)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.