如何访问发送到MPI中处理器的最后一条消息?

如何访问发送到MPI中处理器的最后一条消息?,mpi,Mpi,我使用的是使用消息传递接口(MPI)的主从结构,但每当我调用Receive函数时,我都需要接收从主从发送到每个处理器的最后一条消息,而不是按照发送顺序接收消息 我的问题是,是否有任何方法可以访问每个处理器的缓冲区并选择队列中的最后一条消息?不,您不能只查看队列;但您可以进行测试,查看是否有更多的消息与或一起出现,并且在出现更多消息时,继续接收并丢弃旧数据: #!/usr/bin/env python from mpi4py import MPI import time def waiter(c

我使用的是使用消息传递接口(MPI)的主从结构,但每当我调用Receive函数时,我都需要接收从主从发送到每个处理器的最后一条消息,而不是按照发送顺序接收消息


我的问题是,是否有任何方法可以访问每个处理器的缓冲区并选择队列中的最后一条消息?

不,您不能只查看队列;但您可以进行测试,查看是否有更多的消息与或一起出现,并且在出现更多消息时,继续接收并丢弃旧数据:

#!/usr/bin/env python
from mpi4py import MPI
import time

def waiter(comm, sendTask):
    # wait for messages to be present
    while not comm.Iprobe(source=sendTask, tag=1):
        time.sleep(1)

    # read all messages while more are available, discarding old
    while comm.Iprobe(source=sendTask, tag=1):
        lastMsg = comm.recv(source=sendTask, tag=1)

    if lastMsg is None:
        print "No messages pending"
    else:
        print "Last message was ", lastMsg

    comm.Barrier() 

def sender(comm, waitTask):
    for msgno in range(5):
        print "sending: ", msgno
        comm.send(msgno, dest=waitTask, tag=1)

    print "sending: ", -1
    comm.send(-1, dest=waitTask, tag=1)

    comm.Barrier() 

if __name__== "__main__":
    comm = MPI.COMM_WORLD
    sendTask = 1
    waitTask = 0
    if comm.rank == waitTask:
        waiter(comm, sendTask)
    elif comm.rank == sendTask:
        sender(comm, waitTask)
    else:
        comm.Barrier()
跑步给予

$ mpirun -np 2 ./readall.py
sending:  0
sending:  1
sending:  2
sending:  3
sending:  4
sending:  -1
Last message was  -1