5

我是使用 Python 的 MPI 新手,我在这里遇到了一些问题。这是我的代码:

from mpi4py import MPI

comm = MPI.COMM_WORLD
rank = comm.Get_rank()

if rank == 0:
        a = 1 
        comm.bcast(a, root=0)
        s = comm.reduce(a, op=MPI.SUM)
        print 'From process 0, sum =', s
elif rank == 1:
        b = 2
        comm.bcast(b, root=1)  
        x = comm.reduce(b, op=MPI.SUM)
        print 'From process 1, sum =', x

我想打印:From process PROCESS_NUMBER, sum = 3

进程 0 打印正确,但进程 1 打印无。

我不明白为什么。有人可以帮我吗?

4

2 回答 2

4
  1. 任何集体操作(Bcast, Reduce)都应在所有进程上调用,因此将其放在if rank == N 语句中是不正确的。
  2. 在第二个 reduce 中,您必须指定root=1.
  3. 广播中需要赋值a = comm.bcast(a, root=0)

更正的代码:

from mpi4py import MPI

comm = MPI.COMM_WORLD
rank = comm.Get_rank()

if rank == 0:
        a = 1
else:
        a = None
a = comm.bcast(a, root=0)
s = comm.reduce(a, op=MPI.SUM)
if rank == 0:
        print 'From process 0, sum =', s

if rank == 1:
        b = 2
else:
        b = None
b = comm.bcast(b, root=1)
x = comm.reduce(b, op=MPI.SUM, root=1)

if rank == 1:
        print 'From process 1, sum =', x

在 3 个进程上运行的结果:

From process 0, sum = 3
From process 1, sum = 6
于 2015-07-03T18:47:35.753 回答
1

comm.reduce(a, op=MPI.SUM)对应于MPI_Reduce():总和仅在根进程上可用。

如果您希望总和可用于通信器的每个进程,您可以使用comm.allreduce(a, op=MPI.SUM). 它对应于MPI_Allreduce()。请参阅此页面MPI_Reduce()以了解有关和之间区别的更多信息MPI_Allreduce()

于 2015-07-03T17:59:40.123 回答