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()
的区别。
- 任何集体行动(
Bcast
,Reduce
)都应该被调用
进程,所以把它放在 if rank == N
里面是不正确的
声明。
- 在第二个reduce中你必须指定
root=1
.
- 广播中需要赋值
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
我是使用 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()
的区别。
- 任何集体行动(
Bcast
,Reduce
)都应该被调用 进程,所以把它放在if rank == N
里面是不正确的 声明。 - 在第二个reduce中你必须指定
root=1
. - 广播中需要赋值
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