使用MPI reduce(小写)进行动态流程管理

问题描述 投票:0回答:1

我想知道在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()
parallel-processing mpi mpi4py
1个回答
0
投票

我认为按照您的要求进行操作没有问题。 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 并行执行相同。

© www.soinside.com 2019 - 2024. All rights reserved.