我们目前正在开发一个 mpi4py 项目,我们希望将进程分组到不同的组中。然后我们将这些组分配给他们自己的传播者。这些步骤由进程 0 完成。
现在的问题是其他进程如何找出它们属于哪个通信器?
请注意,这些组的大小不同,例如,第一组包含 5 个进程,第二组包含 3 个进程。那么,进程 4(在第一组中)如何从第一组中获取通信器。
我们目前正在开发一个 mpi4py 项目,我们希望将进程分组到不同的组中。然后我们将这些组分配给他们自己的传播者。这些步骤由进程 0 完成。
现在的问题是其他进程如何找出它们属于哪个通信器?
请注意,这些组的大小不同,例如,第一组包含 5 个进程,第二组包含 3 个进程。那么,进程 4(在第一组中)如何从第一组中获取通信器。
我们通过简单地让每个进程进行相同的初始化来解决这个问题,即每个进程创建每个组和通信器,并根据相同的模式将进程分配给这些组。这样,进程就知道它们对应的通信器。
有趣的是,我们发现,虽然每个进程都创建了所有的组和通信器,但它们只知道它们所属的通信器(和组)。例如,如果属于通信器 1 但不属于通信器 2 的进程 4 想要使用通信器 2,它将崩溃。根据错误消息,这是因为它不知道通信器,尽管它在一开始就对其进行了初始化。
MPI does this for you. Take a look at MPI_COMM_SPLIT, or in mpi4py it would be COMM.Split(). The important parameters are the 'color' (which group processes will end up in) and 'key' (what order a process will be in that group).
It sounds like you already know how you want to 'color' your processes. COMM.Split() is collective over the parent communicator, so you'll compute on each node what the color should be, then split the communicator. You can likely leave the key alone, in which case the processes will be sorted according to their rank in the parent communicator.