为什么此设置会在 mpi4py 中形成子通信器死锁

问题描述 投票:0回答:1
system: MacOSX 14.4.1
python: 3.11.8
mpi4py: 3.1.5
OpenMPI: 5.0.2 installed with homebrew

我有以下 python 脚本。当我有 3 个 MPI 等级时就会发生僵局。我想为等级 0 和 1 创建一个子通信器,为等级 1 和 2 创建另一个子通信器。这意味着等级 1 只需要知道第一个子通信器,等级 2 需要知道第二个子通信器,但是等级 1 需要知道关于他们两个。

然而,虽然rank 1成功创建了第一个通信器,但在创建第二个通信器时却陷入了死锁。这是为什么?

from mpi4py import MPI
from typing import List

world_comm = MPI.COMM_WORLD
world_size = world_comm.Get_size()
world_rank = world_comm.Get_rank()

assert world_size == 3

communicator_ranks = [
    [(0, 1)],
    [(0, 1), (1, 2)],
    [(1, 2)]
]

communicators: List[MPI.Comm] = []
for ranks in communicator_ranks[world_rank]:
    group = world_comm.group.Incl(ranks)
    print(f"rank: {world_rank}, forming communictor for ranks: {ranks}")
    comm = world_comm.Create(group)
    print(f"rank: {world_rank}, forming communictor for ranks: {ranks} -- DONE")
    communicators.append(comm)

world_comm.barrier()
print("all done")

运行时

mpirun -n 3 python deadlock.py
我得到以下打印输出:

> mpirun -n 3 python deadlock.py
rank: 2, forming communictor for ranks: (1, 2)
rank: 1, forming communictor for ranks: (0, 1)
rank: 0, forming communictor for ranks: (0, 1)
rank: 0, forming communictor for ranks: (0, 1) -- DONE
rank: 2, forming communictor for ranks: (1, 2) -- DONE
rank: 1, forming communictor for ranks: (0, 1) -- DONE
rank: 1, forming communictor for ranks: (1, 2)

注意,最后一个条目没有

DONE
对应项,程序只是坐在那里永远等待

mpi mpi4py
1个回答
0
投票

您的程序不正确。 MPI 标准。

来自 MPI 4.2 第 7.4 章第 325 页:

如果 MPI 进程调用非空组,则所有 MPI 进程 在该组中必须调用具有相同组作为参数的函数, 即相同顺序的相同 MPI 进程。否则,调用 是错误的。

您可以尝试使用

mpi4py
绑定
MPI_Create_from_group()
,或者使用
MPI_GROUP_EMPTY

© www.soinside.com 2019 - 2024. All rights reserved.