mpi4py 程序的意外输出

Unexpected output from mpi4py program

我是使用 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 打印 None。

我不明白为什么。谁能帮帮我?

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

如果您希望通信器的每个进程都可以使用总和,可以使用comm.allreduce(a, op=MPI.SUM)。对应MPI_Allreduce(). See this page,了解MPI_Reduce()MPI_Allreduce()的区别。

  1. 任何集体行动(BcastReduce)都应该被调用 进程,所以把它放在 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