5.3 组的管理 BACKWARD FORWARD


本节描述MPI中进程组的维护。这些操作是本地的而且它们的执行不要求进程间通信。

5.3.1 组访问子

MPI_GROUP_SIZE(group,size)

int MPI_Group_size(MPI_Group group,int *size)

MPI_GROUP_SIZE(GROUP,SIZE,IERROR)

MPI_GROUP_RANK(group,rank)

int MPI_Group_rank(MPI_Group group,int *rank)

MPI_GROUP_RANK(GROUP,RANK,IERROR)

MPI_GROUP_TRANSLATE_RANKS(group1,n,ranks1,group2,ranks2)

int MPI_Group_translate_ranks(MPI_Group group1,int n,int *ranks1,MPI_Group group2,int *ranks2)

MPI_GROUP_TRANSLATE_RANKS(GROUP1,N,RANKS1,GROUP2,RANKS2,IERROR)

此函数对于检测两个不同组中相同进程的相对编号是很重要的。例如,如果知道了在组MPI_COMM_WORLD中某些进程的序列号,可能也想知道在该组的子集中它们的序列号。

MPI_GROUP_COMPARE(group1,group2,result)

int MPI_Group_compare(MPI_Group group1,MPI_Group group2,int *result)

MPI_GROUP_COMPARE(GROUP1,GROUP2,RESULT,IERROR)

如果在两个组中组成员和组次序完全相等,返回MPI_IDENT。例如在group1和group2是同一句柄时就会发生这种情况。如果组成员相同而次序不同则返回MPI_SIMILAR.否则返回MPI_UNEQUAL.

5.3.2 组构造子

组构造子用于构造已存在组的子集或超集。这些构造子从已存在的组中构造新的组。这些是本地操作,不同进程上可定义不同的组;一个进程也可以定义不包括其自身的组。当组在通信子构造函数中作为参数使用时要求有一致性定义。MPI没提供从片断(scratch)构造一个组的的机制,而是仅从其它的以前定义的组中构造。基本的组是与初始通信子MPI_COMM_WORLD相联系的组(可通过函数MPI_COMM_GROUP获得〕,其它的组在 该组基础上定义。

基本原理:在紧接着的内容中,没有类似于MPI_COMM_DUP(本章的后面定义〕的组复制函数。也没有复制组的需求。一个组一旦建立后,可以通过建立句柄的拷贝对其多次引用。 后面的构造子指明了对已存在组的子集和超集的需求。(基本原理结束)

对实现者的建议:每一个组构造子执行的结果都似乎返回了一个新的组对象。当这个新组是一个已存在组的拷贝时,人们可以使用引用计数机制来避免创建这样一个新的对象。(对实现者的建议结束)

MPI_COMM_GROUP(comm,group)

MPI_COMM_GROUP(COMM,GROUP,IERROR)

MPI_GROUP_UNION(group1,group2,newgroup)

int MPI_Group_union(MPI_Group group1,MPI_Group group2,MPI_Group *newgroup)

MPI_GROUP_INTERSECTION(group1,group2,newgroup)

int MPI_Group_intersection(MPI_Group group1,MPI_Group group2,MPI_Group *newgroup)

MPI_GROUP_INTERSECTION(GROUP1,GROUP2,NEWGROUP,IERROR)

MPI_GROUP_DIFFERENCE(group1,group2,newgroup)

int MPI_Group_difference(MPI_Group group1,MPI_Group group2,MPI_Group *newgroup)

MPI_GROUP_DIFFERENCE(GROUP1,GROUP2,NEWGROUP,IERROR)

集合类操作的定义如下所示:

并集:第一组中的所有元素(group1),后面跟着不在第一组的第二组(group2)中所有元素。

交集:既在第一组又在第二组的所有元素,交集中元素次序同第一组。

差集:在第一组但不在第二组中的所有元素,差集中的元素次序同第一组。

注意:对于这些操作,输出组中的进程次序首先由第一组决定(如果可能〕,然后, 如果有必要,再由第二组决定。并和交都不是可交换的,但都是可结合的。

新组可以是空的,也就是说,等价于MPI_GROUP_EMPTY

MPI_GROUP_INCL(group,n,ranks,newgroup)

int MPI_Group_incl(MPI_Group group,int n,int *ranks,MPI_Group *newgroup) MPI_GROUP_INCL(GROUP,N,RANKS,NEWGROUP,IERROR)

函数MPI_GROUP_INCL创建了一个组newgroup,该组包括group中的n个进程,这n个进程用序列号rank[0] ... rank[n-1]表示;在newgroup中具有序列号i的是group中具有序列号ranks[i]的进程。ranks中n个元素中的每一个必须是group中的有效元素而且所有的元素都必须是不同的,否则程序就是错误的.如果n=0,则newgroup是MPI_GROUP_EMPTY.此函数可用于对一个组中的元素进行重排序.另见MPI_GROUP_COMPARE.

MPI_GROUP_EXCL(group,n,ranks,newgroup)

int MPI_Group_excl(MPI_Group group, int n , int *ranks,MPI_Group *newgroup)

MPI_GROUP_EXCL(GROUP,N,RANKS,NEWGROUP,IERROR)

函数MPI_GROUP_EXCL通过从group中删除具有序列号ranks[0],...,ranks[n-1]的进程创建了一组进程newgroup。newgroup中的进程次序与group中的次序相同。ranks中n个元素中的每一个必须是group中的有效序列号且所有的元素都必须是不同的;否则,程序就是错误的. 如果n=0, newgroup与group相同。

MPI_GROUP_RANGE_INCL(group,n,ranges,newgroup)

int MPI_Group_range_incl(MPI_Group group, int n, int ranges[][3],MPI_Group *newgroup)

MPI_GROUP_RANGE_INCL(GROUP,N,RANGES,NEWGROUP,IERROR)

INTEGER GROUP,N,RANGES(3,*),NEWGROUP,IERROR

如果ranges包含三元组

则newgroup中包含group中具有序列号

的一系列进程。

每一个被计算的序列号必须是group中的有效序列号而且所有被计算的序列号都必须是不同的,否则程序就会出错。注意我们可以使firsti>lasti,也可以让stridei为负数,但不能为0。

这一例程的功能等价于将ranges数组扩展成包含序列号的数组,并将结果序列号数组及其它参数传给MPI_GROUP_INCL。对MPI_GROUP_INCL的调用等价于将ranks中的每一个序列号i用参数ranges中的三元组(i,i,1)代替后对MPI_GROUP_RANGE_INCL的调用.

MPI_GROUP_RANGE_EXCL(group,n,ranges,newgroup)

int MPI_Group_range_excl(MPI_Group group,int n, int ranges[][3],MPI_Group *newgroup)

MPI_GROUP_RANGE_EXCL(GROUP,N,RANGES,NEWGROUP,IERROR)

每一个被计算的序列号必须是group中的有效序列号而且所有被计算的序列号等级都必须是不同的,否则程序就会出错.

此例程的功能等价于将ranges数组扩展成去除序列号的数组,并将序列号的结果数组及其它参数传给MPI_GROUP_EXCL. 对MPI_GROUP_EXCL的调用等价于将ranks中的每一个序列号i用参数ranges中的三元组(i,i,1)代替后对MPI_GROUP_RANGE_EXCL的调用.

对用户的建议: range操作没有显式地枚举序列号,因此如果有效地实现会有更好的扩展性.因此我们推荐MPI程序员尽可能使用它们. 因为高质量的实现将利用这一事实. (对用户的建议结束)

对实现者的建议: 如果可能,range操作应该通过不枚举组成员的方法实现, 以便获得更好的扩展性.(对实现者的建议结束)

5.3.3 组析构子

MPI_GROUP_FREE(group)

int MPI_Group_free(MPI_Group *group)

MPI_GROUP_FREE(GROUP,IERROR)

本操作标记了一个被释放的组对象.句柄group被调用置为MPI_GROUP_NULL.任何正在使用此组的操作将正常完成.

对实现者的建议: 可保存一个引用数,该数在每一次调用MPI_COMM_CREATE和MPI_COMM_DUP时被增值,而每次调用MPI_GROUP_FREE和MPI_COMM_FREE时被减值。当引用数降到0时组对象被完全释放.(对实现者的建议结束)


Copyright: NPACT BACKWARD FORWARD