私の目標は、python スクリプトが別のプロセスで他の python スクリプトを開始できるようにすることです。つまり、スクリプトを n 個のプロセスに分散させたいと考えています。それを達成するために、ドキュメントに記載されている mpi4py spawn の例を実行しようとしています ( http://mpi4py.scipy.org/docs/usrman/tutorial.htmlを参照)。ただし、この例は次のメッセージで失敗します。
MPI プロセスの少なくとも 1 つのペアが、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()
worker.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