如何将进程的等级作为标记传递给mpi4py.MPI.COMM_WORLD.Send()函数,并使用mpi4py.MPI.COMM_WORLD.Recv()正确接收它?
我指的是sending and receiving messages between two processes using Send and Recv functions的以下代码示例
#passRandomDraw.py
import numpy
from mpi4py import MPI
comm = MPI.COMM_WORLD
rank = comm.Get_rank()
randNum = numpy.zeros(1)
if rank == 1:
randNum = numpy.random.random_sample(1)
print "Process", rank, "drew the number", randNum[0]
comm.Send(randNum, dest=0)
if rank == 0:
print "Process", rank, "before receiving has the number", randNum[0]
comm.Recv(randNum, source=1)
print "Process", rank, "received the number", randNum[0]
我想将发送进程的秩作为标记传递,以便在有多个发送者的情况下接收进程可以识别它。我就是这么做的
#passRandomDraw.py
import numpy
from mpi4py import MPI
comm = MPI.COMM_WORLD
rank = comm.Get_rank()
randNum = numpy.zeros(1)
rnk = -1 # EDIT
if rank == 1:
randNum = numpy.random.random_sample(1)
print "Process", rank, "drew the number", randNum[0]
comm.Send(randNum, dest=0, tag=rank) # EDIT
if rank == 0:
print "Process", rank, "before receiving has the number", randNum[0]
print "Sender rank:", rnk
comm.Recv(randNum, 1, rnk) # EDIT
print "Process", rank, "received the number", randNum[0]
print "Sender rank:", rnk # EDIT
我希望接收进程的rnk值为1(rank=0),但它仍然是-1。
有人能告诉我我做错了什么吗?谢谢!
函数
Recv
将在变量中存储接收到的消息。您必须提供预期发件人的排名。所以你总是知道发送者是谁。消息传递接口不需要标识某人,该信息始终是系统固有的。如果您希望同一发件人发送多封邮件,可以使用标记来区分这些邮件。你需要自己提供这些标签,没有自然的方式获得这些。把这些信息贴上标签,编号。
如果您有一个标记,
Recv
函数将只在接收到具有合适的源标记和标记的消息时返回。这是一个阻塞函数调用。在您的例子中,
tag=-1
等于通用常量MPI.ANY_TAG
(通过print MPI.ANY_TAG
验证),因此Recv
将接受任何标记。但它绝不会覆盖它的输入变量rnk
。试试rnk = -2 # EDIT
你就会明白了。您可以以不同的方式编写代码,尽管这不会改变底层逻辑(即作为程序员,您必须始终了解发送者),但它只是隐藏它,使其隐式化:
下面的示例演示如何将mpi4py中的
send
和recv
函数与列组和标记一起使用。同样的方法也适用于Send
和Recv
函数。一个MPI.Status
对象用于获取每个接收到的消息的源和标记。当mpi4py文档不足时,查阅examples and tutorials written in C通常会有帮助。相关问题 更多 >
编程相关推荐