17.2.79. MPI_Comm_split

MPI_Comm_split — 基于颜色和键值创建新的通信器。

17.2.79.1. 语法

17.2.79.1.1. C语法

#include <mpi.h>

int MPI_Comm_split(MPI_Comm comm, int color, int key,
     MPI_Comm *newcomm)

17.2.79.1.2. Fortran 语法

USE MPI
! or the older form: INCLUDE 'mpif.h'
MPI_COMM_SPLIT(COMM, COLOR, KEY, NEWCOMM, IERROR)
     INTEGER COMM, COLOR, KEY, NEWCOMM, IERROR

17.2.79.1.3. Fortran 2008 语法

USE mpi_f08
MPI_Comm_split(comm, color, key, newcomm, ierror)
     TYPE(MPI_Comm), INTENT(IN) :: comm
     INTEGER, INTENT(IN) :: color, key
     TYPE(MPI_Comm), INTENT(OUT) :: newcomm
     INTEGER, OPTIONAL, INTENT(OUT) :: ierror

17.2.79.2. 输入参数

  • comm: 通信器(句柄)。

  • color: 控制子集分配(非负整数)。

  • key: 控制排名分配的键值(整数)。

17.2.79.3. 输出参数

  • newcomm: 新通信器(句柄)。

  • ierror: 仅限Fortran:错误状态(整数)。

17.2.79.4. 描述

该函数将与通信器comm关联的组划分为互不相交的子组,每个子组对应一个color值。每个子组包含所有具有相同color值的进程。在每个子组内,进程按照参数key定义的值进行排序,若key值相同则根据它们在原组中的秩来打破平局。系统会为每个子组创建一个新的通信器,并通过newcomm返回。进程可以指定color值为MPI_UNDEFINED,此时newcomm将返回MPI_COMM_NULL。这是一个集体调用,但允许每个进程为color和key提供不同的值。

当你在一个跨通信器上调用MPI_Comm_split时,左侧与右侧具有相同颜色的进程会组合创建一个新的跨通信器。key参数描述了跨通信器两侧进程的相对排名。对于仅在跨通信器单侧指定的颜色,或指定MPI_UNDEFINED作为颜色的情况,该函数会返回MPI_COMM_NULL。

调用MPI_Comm_create(comm, group, newcomm)等同于调用MPI_Comm_split(comm, color,key, newcomm),其中group的所有成员提供color = 0和key = 组内排名,而非group成员的所有进程则提供color = MPI_UNDEFINED。函数MPI_Comm_split允许更灵活地将一个组划分成一个或多个子组,并可选择重新排序。

color的值必须为非负数或MPI_UNDEFINED。

17.2.79.5. 注意事项

这是一种极其强大的机制,可将单个进程通信组划分为k个子组,其中k由用户隐式选择(通过所有进程上声明的颜色数量)。每个生成的通信器将互不重叠。这种划分对于定义计算层次结构非常有用,例如用于多重网格或线性代数。

通过多次调用MPI_Comm_split可以克服单次调用时生成通信子不能重叠的要求(每次调用时每个进程只能属于一种颜色)。这种方式可以创建多个重叠的通信结构。我们鼓励在这种分割操作中创造性地使用颜色和键值参数。

请注意,对于固定的颜色值,键(key)不需要唯一。MPI_Comm_split的责任是根据这个键以升序对进程进行排序,并以一致的方式处理键值相同的情况。如果所有键都以相同方式指定,那么给定颜色组中的所有进程将保持与其在父组中相同的相对排序。(通常情况下,它们的实际秩值会发生变化。)

本质上,将给定颜色组中所有进程的键值设为零意味着,用户实际上无需关注新通信器中进程的等级顺序。

17.2.79.6. 错误

几乎所有MPI例程都会返回一个错误值;C语言例程通过函数返回值返回,Fortran例程则通过最后一个参数返回。

在返回错误值之前,会调用与通信对象(如通信器、窗口、文件)关联的当前MPI错误处理程序。如果MPI调用未关联任何通信对象,则该调用被视为附加到MPI_COMM_SELF,并将调用关联的MPI错误处理程序。当MPI_COMM_SELF未初始化时(即在MPI_Init/MPI_Init_thread之前、MPI_Finalize之后,或仅使用会话模型时),错误会触发初始错误处理程序。初始错误处理程序可通过在使用世界模型时调用MPI_Comm_set_errhandler来修改MPI_COMM_SELF,或通过mpiexec的mpi_initial_errhandler命令行参数,或MPI_Comm_spawn/MPI_Comm_spawn_multiple的info键来设置。如果未设置其他适当的错误处理程序,则MPI I/O函数将调用MPI_ERRORS_RETURN错误处理程序,而其他所有MPI函数将调用MPI_ERRORS_ABORT错误处理程序。

Open MPI 包含三个可使用的预定义错误处理器:

  • MPI_ERRORS_ARE_FATAL 导致程序中止所有连接的MPI进程。

  • MPI_ERRORS_ABORT 一个可在通信器、窗口、文件或会话上调用的错误处理程序。当在通信器上调用时,其行为类似于在该通信器上调用MPI_Abort。如果在窗口或文件上调用,则行为类似于在包含对应窗口或文件中进程组的通信器上调用MPI_Abort。如果在会话上调用,则仅中止本地进程。

  • MPI_ERRORS_RETURN 向应用程序返回一个错误代码。

MPI应用程序也可以通过调用以下方式实现自己的错误处理程序:

请注意,MPI不保证MPI程序在出现错误后能够继续运行。

查看MPI手册页获取完整的MPI错误代码列表。

有关更多信息,请参阅MPI-3.1标准中的错误处理部分。