为什么 AllGather() 在具有不同迭代值的循环中失败?
Why AllGather() fails in for loops with different iteration values?
我编写了以下代码来试验 AllGather():
from mpi4py import MPI
comm = MPI.COMM_WORLD
rank = comm.Get_rank()
a = None
if rank == 0:
a = 2
if rank == 1:
a = 3
z = 2
for i in range(0, a):
z = comm.allgather(z)
print(z, rank)
comm.barrier()
我运行它如下:
mpiexec -n 2 python3 allgather.py
我得到以下输出:
[[2, 2], [2, 2]] 0
第二个处理器卡住,程序没有终止。
输出应该是:
[[2, 2], [2, 2]] 0
[[2, 2], [2, 2], [2, 2]] 1
我不明白为什么第二个处理器会卡住。如果我设置 a = 2,它 运行s 是正确的
在两个处理器中。我做错了什么?
第二个进程卡住了,因为它试图从所有进程中收集,第二个进程正在等待第一个进程加入它的 allgather()
操作,并将无限期地等待这种情况的发生。
在不了解实际应用的情况下很难告诉您解决此问题的好方法。
但通常所有进程都必须参与收集操作,简单的解决方法是让进程 0 参与而不使用结果:
from mpi4py import MPI
comm = MPI.COMM_WORLD
rank = comm.Get_rank()
a = None
if rank == 0:
a = 2
if rank == 1:
a = 3
z = 2
old_z = None
for i in range(0, a):
if i == a-1:
old_z = z
z = comm.allgather(z)
if rank == 0:
comm.allgather(old_z)
print(z, rank)
comm.barrier()
这不是一个非常优雅的解决方案,但它确实提供了您想要的输出。请注意,我必须如何存储上一次迭代过程中的 z 值,以获得接近您所需行为的任何结果。
如果我们不存储 z 的先前值,我们会得到以下结果:
[[2, 2], [2, 2]] 0
[[[2, 2], [2, 2]], [[2, 2], [2, 2]]] 1
我编写了以下代码来试验 AllGather():
from mpi4py import MPI
comm = MPI.COMM_WORLD
rank = comm.Get_rank()
a = None
if rank == 0:
a = 2
if rank == 1:
a = 3
z = 2
for i in range(0, a):
z = comm.allgather(z)
print(z, rank)
comm.barrier()
我运行它如下:
mpiexec -n 2 python3 allgather.py
我得到以下输出:
[[2, 2], [2, 2]] 0
第二个处理器卡住,程序没有终止。
输出应该是:
[[2, 2], [2, 2]] 0
[[2, 2], [2, 2], [2, 2]] 1
我不明白为什么第二个处理器会卡住。如果我设置 a = 2,它 运行s 是正确的 在两个处理器中。我做错了什么?
第二个进程卡住了,因为它试图从所有进程中收集,第二个进程正在等待第一个进程加入它的 allgather()
操作,并将无限期地等待这种情况的发生。
在不了解实际应用的情况下很难告诉您解决此问题的好方法。 但通常所有进程都必须参与收集操作,简单的解决方法是让进程 0 参与而不使用结果:
from mpi4py import MPI
comm = MPI.COMM_WORLD
rank = comm.Get_rank()
a = None
if rank == 0:
a = 2
if rank == 1:
a = 3
z = 2
old_z = None
for i in range(0, a):
if i == a-1:
old_z = z
z = comm.allgather(z)
if rank == 0:
comm.allgather(old_z)
print(z, rank)
comm.barrier()
这不是一个非常优雅的解决方案,但它确实提供了您想要的输出。请注意,我必须如何存储上一次迭代过程中的 z 值,以获得接近您所需行为的任何结果。
如果我们不存储 z 的先前值,我们会得到以下结果:
[[2, 2], [2, 2]] 0
[[[2, 2], [2, 2]], [[2, 2], [2, 2]]] 1