gpt4 book ai didi

python - mpi4py 发送/接收带标签

转载 作者:太空狗 更新时间:2023-10-29 19:34:47 27 4
gpt4 key购买 nike

如何将进程的等级作为标记传递给 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 函数将接收到的消息存储在一个变量中。您必须提供预期发件人的等级。因此,您始终知道发件人是谁。消息传递接口(interface)永远不需要识别某人,该信息始终是系统固有的。

如果您希望来自同一发件人的多封邮件,您可以使用标签来区分这些邮件。您需要自己提供这些标签,没有自然的方法可以获取这些标签。只需以某种方式标记消息,给它们编号。

如果您有标签,Recv 函数只会在收到具有合适源 标签的消息时返回。这是一个阻塞函数调用。

在您的情况下,tag=-1 等于通用常量 MPI.ANY_TAG(通过 print MPI.ANY_TAG 验证)并且因此 Recv 将接受任何标签。但它绝不会覆盖其输入变量 rnk。试试 rnk = -2 # EDIT,你会看到的。

你可以用不同的方式编写你的代码,虽然这不会改变底层逻辑(即你作为程序员必须始终知道发件人)它只是隐藏它,使其隐式:

#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
status = MPI.Status()
comm.Recv(randNum, source=MPI.ANY_SOURCE, tag=MPI.ANY_TAG, status=status) # EDIT
rnk = status.Get_source()
print "Process", rank, "received the number", randNum[0]
print "Sender rank:", rnk # EDIT

关于python - mpi4py 发送/接收带标签,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21088420/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com