我想知道在Python中进行DPM时是否可以使用MPI的reduce函数(小写)。
目前我有一个工作代码,明确使用带有Reduce(大写)的内存缓冲区。有没有办法不显式定义缓冲区并使用小写函数代替?
客户/父代码:
from mpi4py import MPI
import numpy
import sys
comm = MPI.COMM_SELF.Spawn(sys.executable,
args=['server.py'],
maxprocs=5)
N = numpy.array(100, 'i')
comm.Bcast([N, MPI.INT], root=MPI.ROOT)
R = numpy.array(0.0, 'd')
comm.Reduce(None, [R, MPI.DOUBLE],
op=MPI.SUM, root=MPI.ROOT)
print(R)
comm.Disconnect()
服务器/子代码:
#!/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)
R = numpy.array(N * rank, dtype='d')
comm.Reduce([R, MPI.DOUBLE], None,
op=MPI.SUM, root=0)
comm.Disconnect()
我认为按照您的要求进行操作没有问题。 client2.py:
#!/usr/bin/env python
from mpi4py import MPI
import numpy
import sys
comm = MPI.COMM_SELF.Spawn(sys.executable,
args=['server2.py'],
maxprocs=5)
#N = [100,]
N = 100
N=comm.bcast(N, root=MPI.ROOT)
#R = [.0,]
R = .0
R = comm.reduce(R, op=MPI.SUM, root=MPI.ROOT)
print(R)
comm.Disconnect()
server2.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 = rank*23
#N = [rank*23,]
N = comm.bcast(N, root=0)
#R = list([1.*rank*i for i in N])
R = 1.*rank*N
R = comm.reduce(R, op=MPI.SUM, root=0)
comm.Disconnect()
执行此操作,将按预期打印
1000.0
,并且与代码打印的内容相同。将注释行与列表一起使用会打印 [0.0, 100.0, 200.0, 300.0, 400.0]
,这可能会令人惊讶,但实际上非常有意义。它是列表求和的结果,即将 +
运算符应用于 5 个列表。此结果并非特定于 DPM,但与正常的 MPI 并行执行相同。