Python:使用mpi4py将数组广播到使用spawn的其他脚本

3
我正在尝试编写两个脚本,一个是主脚本,另一个是工作脚本。主脚本将会生成多个工作脚本进程,并将一个numpy数组广播到这些工作脚本中。通过查看mpi4py的在线教程(数量较少),我感觉我已经理解了这个概念,但我编写的任何测试代码都无法成功将数组发送给工作脚本。我没有收到错误消息,但工作脚本从未接收到数组。

请问有没有人能够清晰地演示如何使用mpi4py、spawn和bcast将一个数组广播到多个工作脚本中?谢谢!

更新:例子如下:

主脚本:

#! /usr/bin/env python
# master test

import sys,time
from mpi4py import MPI
import numpy as np

comm2    = MPI.COMM_WORLD
rank     = comm2.Get_rank()
mpisize  = comm2.Get_size()

initcomm = MPI.COMM_SELF.Spawn(sys.executable, \
                           args=['test2.py'], \
                           maxprocs=5)

# Initialise the programs
test = np.array([1,2,3], 'i')
print("About to broadcast {0} from rank {1}".format(test, rank))
initcomm.Bcast([test, MPI.INT], root=0)
initcomm.Disconnect()

工作脚本:

#! /usr/bin/env python
# child test

import sys,time
from mpi4py import MPI
import numpy as np

comm2    = MPI.COMM_WORLD
rank     = comm2.Get_rank()
mpisize  = comm2.Get_size()

initcomm = MPI.Comm.Get_parent()

test = np.zeros(3, 'i')
print("Bcast coming to rank {0}".format(rank))
initcomm.Bcast([test, MPI.INT], root=0)
print("Received {0}".format(test))
initcomm.Disconnect()

他们收到了什么?广播完成了吗? - kraffenetti
你为什么要使用 mpi4py 而不是 Python 自带的 multiprocessing 模块? - hpaulj
1个回答

2

您需要将主脚本中的Bcast更改为:

initcomm.Bcast([test, MPI.INT], root=MPI.ROOT)

如果将其设置为0,主节点将认为远程/工作组中的根是等级为0,程序将会挂起。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接