目录
从本节开始,我们来学习MPI中非常重要的概念——进程组和通信域。
通信域包括通信上下文、进程组、虚拟处理器拓扑、属性等,用于综合描述通信进程间的通信关系。通信域分为组内通信域和组间通信域。组内通信域用于描述属于同一组内进程间的通信;组间通信域用于描述属于不同进程组的进程间的通信。
进程组是通信域的一个重要组成部分,其定义了不同进程的有序集合,每一个进程都有一个编号,如0,1,……,N-1等。进程组限定了参加通信的进程的范围。进程是和实现相关的对象,MPI将进程组内的每个进程与一个整数rank相关联,序列号是连续的并从0开始。
MPI_GROUP_EMPTY是一个特殊的预定义组,它没有成员,预定义的常数MPI_GROUP_NULL是为无效组句柄使用的值。因此不应该将MPI_GROUP_EMPTY与MPI_GROUP_NULL混淆,前者是一个空组的有效句柄,后者是一个无效句柄。前者可以在组操作中作为一个参数使用,后者在组释放时被返回。
通信上下文是通信域所具有的一个特性,它允许对通信空间进行划分。一个上下文所发送的消息不能被另一个上下文所接收。进一步说,允许集合操作独立于挂起的点对点操作。上下文不是显式的MPI对象,它们仅作为通信域实现的一部分而出现。一旦MPI_INIT被调用,就会产生一个预定义组内通信域MPI_COMM_WORLD,它包括所有的进程。另外还提供了通信域MPI_COMM_SELF,该通信域仅包括自身进程。预定义的常数MPI_COMM_NULL是为无效通信域使用的值。
所有的MPI实现都要求提供MPI_COMM_WORLD通信域,在进程的生命周期中不允许将其释放。与该通信域对应的组不是以预定义常数的形式出现的,但是可以使用MPI_COMM_GROUP访问。
一、进程组管理
以下的接口用于MPI进程组的维护,这些接口的执行不要求进程间通信。
1、MPI_GROUP_SIZE
MPI_GROUP_SIZE返回指定进程组中所包含的进程的个数。
MPI_GROUP_SIZE(group, size)
IN group 进程组(句柄)
OUT size 组内的进程数(整数)
//c语言的说明
int MPI_Group_size(MPI_Group group, int *size)
//Fortran语言的说明
MPI_GROUP_SIZE(GROUP, SIZE, IERROR)
INTEGER GROUP, SIZE, IERROR
2、MPI_GROUP_RANK
MPI_GROUP_RANK返回调用进程在给定进程组中的编号rank,有些类似于MPI_COMM_RANK。如果调用进程不在给定的进程组内,则返回MPI_UNDEFINED。
MPI_GROUP_RANK(group, rank)
IN group 进程组(句柄)
OUT rank 调用进程的序列号/MPI_UNDIFINED(整数)
//c语言的说明
int MPI_Group_rank(MPI_Group group, int *rank)
//Fortran语言的说明
MPI_GROUP_RANK(GROUP, RANK, IERROR)
INTEGER GROUP, RANK, IERROR
3、MPI_GROUP_TRANSLATE_RANKS
MPI_GROUP_TRANSLATE_RANKS返回进程组group1中的n个进程(由rank1指定)在进程组group2中对应的编号(相应的编号放在rank2中)。如果进程组group2中不包括进程组group1中指定的进程,则相应的返回值为MPI_UNDEFINED。此函数可以检测两个不同进程组中相同进程的相对编号。例如,如果知道了在组MPI_COMM_WORLD中某些进程的序列号,可能也想知道在改组的子集中它们的序列号。
MPI_GROUP_TRANSLATE_RANKS(group1, n, ranks1, group2, ranks2)
IN group1 进程组1(句柄)
IN n 数组rank1和rank2的大小(整数)
IN ranks1 进程标识数组(整数数组),在进程组group1中的标识
IN group2 进程组2(句柄)
OUT ranks2 ranks1在进程组group2中对应的标识数组(整型数组)
//c语言的说明
int MPI_Group_translate_ranks(MPI_Group group1, int n, int *ranks1, MPI_Group group2, int *ranks2)
//Fortran语言的说明
MPI_GROUP_TRANSLATE_RANKS(GROUP1, N, RANKS1, GROUP2, RANKS2, IERROR)
INTEGER GROUP1, N, RANKS1(*), GROUP2, RANKS(*), IERROR
4、MPI_GROUP_COMPARE
MPI_GROUP_COMPARE对两个进程组group1和group2进行比较,如果两个进程组group1和group2所包含的进程以及相同进程的编号都完全相同,则返回MPI_IDENT;如果两个进程组group1和