繁体   English   中英

Mpi4py分散,收集和发送接收

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM