mpi4py - 获取进程自己的通信器

mpi4py - Get process's own communicator

我们目前正在开发一个 mpi4py 项目,我们希望在该项目中将进程分组到不同的组中。然后,我们将这些组分配给它们自己的通讯器。这些步骤由进程 0 完成。

现在的问题是其他进程如何找出它们属于哪个通信器?

请注意,这些组的大小不一,例如第一组包含 5 个进程,第二组包含 3 个进程。那么,进程 4(在第一组中)如何从第一组中获取通信器。

MPI 为您做这件事。看看 MPI_COMM_SPLIT,或者在 mpi4py 中它将是 COMM.Split()。重要的参数是 'color'(进程将在哪个组中结束)和 'key'(进程在该组中的顺序)。

听起来您已经知道要如何 'color' 您的流程。 COMM.Split() 是父通信器的集合,因此您将在每个节点上计算颜色应该是什么,然后拆分通信器。您可能不理会密钥,在这种情况下,进程将根据它们在父通信器中的排名进行排序。

我们通过简单地让每个进程进行相同的初始化来解决这个问题,即每个进程创建每个组和通信器,并根据相同的模式将进程分配给这些组。这样,进程就知道它们对应的通信器。

有趣的是,我们发现,虽然每个进程都创建了所有的组和通信器,但它们只知道自己所属的通信器(和组)。 例如,如果属于通信器 1 但不属于通信器 2 的进程 4 想要使用通信器 2,它将崩溃。根据错误信息,这是因为它不知道通信器,尽管它在一开始就初始化了它。