gpt4 book ai didi

python - mpi4py:在生成的进程之间进行通信

转载 作者:行者123 更新时间:2023-11-30 22:47:42 24 4
gpt4 key购买 nike

我有一个进程运行一个名为 t1.py 的程序,该程序生成 3 个其他进程,所有这些进程都运行 t2.py。我想将等级为 0 的生成进程中的值广播到其他两个生成的进程。但是,当调用 bcast 时,程序会阻塞。知道为什么会发生这种情况吗?我该如何解决它?

t1.py

from mpi4py import MPI
import sys

sub_comm = MPI.COMM_SELF.Spawn(sys.executable, args=['t2.py'], maxprocs=3)
print 'hi'

t2.py

from mpi4py import MPI

comm = MPI.Comm.Get_Parent()

print 'ho ', comm.Get_rank()
a = comm.bcast(comm.Get_rank(), root=0)
print a

输出

hi
ho 2
ho 0
ho 1

最佳答案

如果您只是想让 children 互相交谈,您可以使用MPI.COMM_WORLD:

a = MPI.COMM_WORLD.bcast(MPI.COMM_WORLD.Get_rank(), root=0)

通过打印 MPI.COMM_WORLD.Get_rank(), ' of ',MPI.COMM_WORLD.Get_size(),您可以检查子级的MPI.COMM_WORLD仅限于 child 。

现在,我们来调查一下,如果通过 comm=MPI.Comm.Get_parent() 获取 commcomm.bcast(...) 失败的原因。事实上,从这个通信器的大小和等级来看,它似乎与MPI.COMM_WORLD非常相似。 但是,相反,commMPI.COMM_WORLD 非常不同:它是一个 intercommunicator 。更准确地说,这是 parent 与 child 交谈的方式。可以使用集体通信,但所有进程(无论是父进程还是子进程)都必须调用该函数。请仔细阅读MPI standards ,特别是有关内部通信器集体操作的第 5.2.2 和 5.2.3 节。关于bcast(),使用MPI.ROOTMPI.PROC_NULL来代替广播者root的等级指定方向(父到子、子到父)和发送过程。最后,可以使用 Merge() 在内部通信器的基础上定义内部通信器。 (对应于 MPI_Intercomm_merge() )。在这个内部通信器中, parent 和 child 不属于两个不同的群体:像往常一样,他们是具有独特等级特征的过程。

这里是 t1.py 和 t2.py 的修改版本,其中执行了内部通信器的 bcast()。然后,内部通信器是Merge(),并且照常调用生成的内部通信器上的bcast()

t1.py

from mpi4py import MPI
import sys

sub_comm = MPI.COMM_SELF.Spawn(sys.executable, args=['t2.py'], maxprocs=3)

val=42
sub_comm.bcast(val, MPI.ROOT)

common_comm=sub_comm.Merge(False)
print 'parent in common_comm ', common_comm.Get_rank(), ' of ',common_comm.Get_size()
#MPI_Intercomm_merge(parentcomm,1,&intracomm);

val=13
c=common_comm.bcast(val, root=0)
print "value from rank 0 in common_comm", c

t2.py

from mpi4py import MPI

comm = MPI.Comm.Get_parent()

print 'ho ', comm.Get_rank(), ' of ',comm.Get_size(),' ', MPI.COMM_WORLD.Get_rank(), ' of ',MPI.COMM_WORLD.Get_size()
a = MPI.COMM_WORLD.bcast(MPI.COMM_WORLD.Get_rank(), root=0)
print "value from other child", a

print "comm.Is_inter", comm.Is_inter()
b = comm.bcast(comm.Get_rank(), root=0)
print "value from parent", b

common_comm=comm.Merge(True)
print "common_comm.Is_inter", common_comm.Is_inter()
print 'common_comm ', common_comm.Get_rank(), ' of ',common_comm.Get_size()

c=common_comm.bcast(0, root=0)
print "value from rank 0 in common_comm", c

关于python - mpi4py:在生成的进程之间进行通信,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40439987/

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