我的目标是让 python 脚本能够在不同的进程上启动另一个 python 脚本,即我想将脚本分布在 n 个进程上。为了实现这一点,我正在尝试运行文档中给出的 mpi4py spawn 示例(请参阅http://mpi4py.scipy.org/docs/usrman/tutorial.html)。但是此示例失败并显示以下消息:
至少一对 MPI 进程无法相互联系以进行 MPI 通信。这意味着......这个错误有时可能是忘记指定'self' BTL的结果。...您的 MPI 作业现在将中止。
我的安装是在带有 openMPI 1.6.1 和最新 mpi4py 安装的 Windows 7 机器上。
就我而言,代码是:master.py:
#!/usr/bin/env python
from mpi4py import MPI
import numpy
import sys
comm = MPI.COMM_SELF.Spawn(sys.executable,
args=['worker.py'],
maxprocs=5)
N = numpy.array(100, 'i')
comm.Bcast([N, MPI.INT], root=MPI.ROOT)
PI = numpy.array(0.0, 'd')
comm.Reduce(None, [PI, MPI.DOUBLE],
op=MPI.SUM, root=MPI.ROOT)
print(PI)
comm.Disconnect()
工人.py:
#!/usr/bin/env python
from mpi4py import MPI
import numpy
comm = MPI.Comm.Get_parent()
size = comm.Get_size()
rank = comm.Get_rank()
N = numpy.array(0, dtype='i')
comm.Bcast([N, MPI.INT], root=0)
h = 1.0 / N; s = 0.0
for i in range(rank, N, size):
x = h * (i + 0.5)
s += 4.0 / (1.0 + x**2)
PI = numpy.array(s * h, dtype='d')
comm.Reduce([PI, MPI.DOUBLE], None,
op=MPI.SUM, root=0)
comm.Disconnect()
产生错误的行是:
comm = MPI.COMM_SELF.Spawn(sys.executable,
args=['worker.py'],
maxprocs=5)
运行脚本的命令在 cmd 提示符下:
mpirun -n 1 python.exe master.py