为什么 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