⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 mpi53.htm

📁 该文件为mpich2的开发文档
💻 HTM
字号:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2//EN">
<HTML>
<HEAD>
   <TITLE> ICPSEP Content
</TITLE>
   <META NAME="GENERATOR" CONTENT="Mozilla/3.0Gold (Win95; I) [Netscape]">
</HEAD>
<BODY BGCOLOR="#F0F8FF">

<TABLE WIDTH="100%" >
<TR>
<TD align=left><FONT SIZE=+2>5.3 组的管理</FONT></TD>

<TD align=right><A HREF="mpi52.htm" tppabs="http://arch.cs.pku.edu.cn/parallelprogramming/mpispec/mpi52.htm"><IMG SRC="backward.gif" tppabs="http://arch.cs.pku.edu.cn/image/backward.gif" ALT="BACKWARD" HEIGHT=32 WIDTH=32></A>
<A HREF="mpi54.htm" tppabs="http://arch.cs.pku.edu.cn/parallelprogramming/mpispec/mpi54.htm"><IMG SRC="forward.gif" tppabs="http://arch.cs.pku.edu.cn/image/forward.gif" ALT="FORWARD" HEIGHT=32 WIDTH=32></A></TD>
</TR>
</TABLE>

<P>
<HR WIDTH="100%"></P>

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

<P><A NAME="5.3.1"></A><FONT SIZE=+1>5.3.1 组访问子 </FONT></P>

<P>MPI_GROUP_SIZE(group,size)</P>

<UL>
<P>输入:group     组(句柄〕</P>
</UL>

<UL>
<P>输出:size     组内进程数(整数〕</P>
</UL>

<P>int MPI_Group_size(MPI_Group group,int *size)</P>

<P>MPI_GROUP_SIZE(GROUP,SIZE,IERROR)</P>

<UL>
<P>INTEGER GROUP,SIZE,IERROR</P>
</UL>

<P>MPI_GROUP_RANK(group,rank)</P>

<UL>
<P>输入:group     组(句柄〕 </P>

<P>输出:rank      组内调用进程的序列号,或者若该进程不是一个成员则返回MPI_UNDEFINED
(整数〕</P>
</UL>

<P>int MPI_Group_rank(MPI_Group group,int *rank)</P>

<P>MPI_GROUP_RANK(GROUP,RANK,IERROR)</P>

<UL>
<P>INTEGER GROUP,RANK,IERROR </P>
</UL>

<P>MPI_GROUP_TRANSLATE_RANKS(group1,n,ranks1,group2,ranks2)</P>

<UL>
<P>输入:group1     组1(句柄〕</P>

<P>   n       数组rank1和rank2的序列号数(整数〕</P>

<P>   ranks1     组1中0或更多有效序列号的数组</P>

<P>   group2     组2(句柄〕</P>

<P>输出:ranks2     组2中对应序列号的数组,当无对应值存在时返回MPI_UNDEFINED.</P>
</UL>

<P>int MPI_Group_translate_ranks(MPI_Group group1,int n,int *ranks1,MPI_Group
group2,int *ranks2) </P>

<P>MPI_GROUP_TRANSLATE_RANKS(GROUP1,N,RANKS1,GROUP2,RANKS2,IERROR) </P>

<UL>
<P>INTEGER GROUP1,N,RANDS1(*),GROUP2,RANKS2,IERROR</P>
</UL>

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

<P>MPI_GROUP_COMPARE(group1,group2,result)</P>

<UL>
<P>输入:group1     第一组(句柄〕</P>

<P>group2        第二组(句柄〕</P>

<P>输出:result     结果(整数〕 </P>
</UL>

<P>int MPI_Group_compare(MPI_Group group1,MPI_Group group2,int *result)
</P>

<P>MPI_GROUP_COMPARE(GROUP1,GROUP2,RESULT,IERROR) </P>

<UL>
<P>INTEGER GROUP1,GROUP2,RESULT,IERROR </P>
</UL>

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

<P><A NAME="5.3.2"></A><FONT SIZE=+1>5.3.2 组构造子</FONT></P>

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

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

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

<P>MPI_COMM_GROUP(comm,group)</P>

<UL>
<P>输入:comm      通信子(句柄〕 </P>

<P>输出:group      对应comm(句柄〕的组</P>
</UL>

<P>MPI_COMM_GROUP(COMM,GROUP,IERROR)</P>

<UL>
<P>INTEGER COMM,GROUP,IERROR </P>

<P>MPI_COMM_GROUP 在组内返回comm组的句柄 </P>
</UL>

<P>MPI_GROUP_UNION(group1,group2,newgroup)</P>

<UL>
<P>输入:group1     第一组(句柄〕</P>

<P>   group2     第二组(句柄〕</P>

<P>输出:newgroup    求并后的组(句柄〕 </P>
</UL>

<P>int MPI_Group_union(MPI_Group group1,MPI_Group group2,MPI_Group *newgroup)</P>

<UL>
<P>INTEGER GROUP1,GROUP2,NEWGROUP,IERROR </P>
</UL>

<P>MPI_GROUP_INTERSECTION(group1,group2,newgroup)</P>

<UL>
<P>输入:group1     第一组(句柄〕 </P>

<P>   group2     第二组(句柄〕 </P>

<P>输出:newgroup    求交后的组(句柄〕 </P>
</UL>

<P>int MPI_Group_intersection(MPI_Group group1,MPI_Group group2,MPI_Group
*newgroup) </P>

<P>MPI_GROUP_INTERSECTION(GROUP1,GROUP2,NEWGROUP,IERROR)</P>

<UL>
<P>INTGETER GROUP1,GROUP2,NEWGROUP,IERROR </P>
</UL>

<P>MPI_GROUP_DIFFERENCE(group1,group2,newgroup) </P>

<UL>
<P>输入:group1     第一组(句柄〕</P>

<P>   group2     第二组(句柄〕</P>

<P>输出:newgroup    求差后的组(句柄〕</P>
</UL>

<P>int MPI_Group_difference(MPI_Group group1,MPI_Group group2,MPI_Group
*newgroup)</P>

<P>MPI_GROUP_DIFFERENCE(GROUP1,GROUP2,NEWGROUP,IERROR) </P>

<UL>
<P>INTEGER GROUP1,GROUP2,NEWGROUP,IERROR</P>
</UL>

<P>集合类操作的定义如下所示:</P>

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

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

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

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

<P>新组可以是空的,也就是说,等价于MPI_GROUP_EMPTY</P>

<P>MPI_GROUP_INCL(group,n,ranks,newgroup) </P>

<UL>
<P>输入:group      组(句柄)</P>

<P>   n        序列号数组中的元素数〔及newgroup的大小〕〔整数〕
</P>

<P>   ranks      出现在newgroup中的进程在group中的序列号〔整数数组〕</P>

<P>输出:newgroup    上面所推导出的新组,元素次序由ranks〔句柄〕定义。</P>
</UL>

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

<UL>
<P>INTEGER GROUP,NRANKS(*),NEWGROUP,IERROR</P>
</UL>

<P>函数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.此函数可用于对一个组中的元素进行重排序.另见<A HREF="mpi54.htm#compare" tppabs="http://arch.cs.pku.edu.cn/parallelprogramming/mpispec/mpi54.htm#compare">MPI_GROUP_COMPARE.
</A></P>

<P>MPI_GROUP_EXCL(group,n,ranks,newgroup)</P>

<UL>
<P>输入: group      组(句柄)</P>

<P>   n        数组ranks中的元素个数(整数)</P>

<P>   ranks      group中不出现在newgroup中的整数序列号数组</P>

<P>输出 newgroup     从上面导出的新组,保留了group所定义的次序</P>
</UL>

<P>int MPI_Group_excl(MPI_Group group, int n , int *ranks,MPI_Group *newgroup)</P>

<P>MPI_GROUP_EXCL(GROUP,N,RANKS,NEWGROUP,IERROR)</P>

<UL>
<P>INTEGER GROUP,N,RANKS(*),NEWGROUP,IERROR</P>
</UL>

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

<P>MPI_GROUP_RANGE_INCL(group,n,ranges,newgroup)</P>

<UL>
<P>输入: group      组(句柄) </P>

<P>   n        数组ranges中的三元组的个数(整数)</P>

<P>   ranges     整数三元组数组,具有形式(first rank,last rank,stride),指示了包含在newgroup中的group中进程的序列号.</P>

<P>输出: newgroup     从上面导出的新组, 保留ranges所定义的次序</P>
</UL>

<P>int MPI_Group_range_incl(MPI_Group group, int n, int ranges[][3],MPI_Group
*newgroup) </P>

<P>MPI_GROUP_RANGE_INCL(GROUP,N,RANGES,NEWGROUP,IERROR) </P>

<P>INTEGER GROUP,N,RANGES(3,*),NEWGROUP,IERROR </P>

<P>如果ranges包含三元组</P>

<UL>
<P>(first<SUB>1</SUB>,last<SUB>1</SUB>,stride<SUB>1</SUB>),...,(first<SUB>n</SUB>,last<SUB>n</SUB>,stride<SUB>n</SUB>),</P>
</UL>

<P>则newgroup中包含group中具有序列号</P>

<UL>
<P>first<SUB>1</SUB>, first<SUB>1</SUB>+stride<SUB>1</SUB>, ..., first<SUB>1</SUB>+<IMG SRC="last1.gif" tppabs="http://arch.cs.pku.edu.cn/parallelprogramming/mpispec/last1.gif" HEIGHT=36 WIDTH=98 ALIGN=ABSCENTER>stride<SUB>1</SUB>,...</P>

<P>first<SUB>n</SUB>, first<SUB>n</SUB>+stride<SUB>n</SUB>, ..., first<SUB>n</SUB>+<IMG SRC="lastn.gif" tppabs="http://arch.cs.pku.edu.cn/parallelprogramming/mpispec/lastn.gif" HEIGHT=35 WIDTH=97 ALIGN=ABSCENTER>stride<SUB>n</SUB></P>
</UL>

<P>的一系列进程。</P>

<P>每一个被计算的序列号必须是group中的有效序列号而且所有被计算的序列号都必须是不同的,否则程序就会出错。注意我们可以使first<SUB>i</SUB>&gt;last<SUB>i</SUB>,也可以让stride<SUB>i</SUB>为负数,但不能为0。</P>

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

<P>MPI_GROUP_RANGE_EXCL(group,n,ranges,newgroup)</P>

<UL>
<P>输入: group      组(句柄) </P>

<P>   n        数组ranks中的元素数(整数) </P>

<P>   ranges      一个具有(first rank,last rank,stride)形式的一维整数三元组数组,指出了从输出组newgroup中去除的group中进程的序列号</P>

<P>输出: newgroup     从上面导出的新组,保留了group中的次序(句柄) </P>
</UL>

<P>int MPI_Group_range_excl(MPI_Group group,int n, int ranges[][3],MPI_Group
*newgroup) </P>

<P>MPI_GROUP_RANGE_EXCL(GROUP,N,RANGES,NEWGROUP,IERROR)</P>

<UL>
<P>INTEGER GROUP,N,RANGES(3,*),NEWGROUP,IERROR </P>
</UL>

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

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

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

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

<P><A NAME="5.3.3"></A>5.3.3 组析构子 </P>

<P>MPI_GROUP_FREE(group)</P>

<UL>
<P>输入/输出: group      组(句柄)</P>
</UL>

<P>int MPI_Group_free(MPI_Group *group)</P>

<P>MPI_GROUP_FREE(GROUP,IERROR)</P>

<UL>
<P>INTEGER GROUP,IERROR </P>
</UL>

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

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

<P>
<HR WIDTH="100%"></P>

<TABLE WIDTH="100%" >
<TR>
<TD align=left>Copyright: NPACT </TD>

<TD align=right><A HREF="mpi52.htm" tppabs="http://arch.cs.pku.edu.cn/parallelprogramming/mpispec/mpi52.htm"><IMG SRC="backward.gif" tppabs="http://arch.cs.pku.edu.cn/image/backward.gif" ALT="BACKWARD" HEIGHT=32 WIDTH=32></A>
<A HREF="mpi54.htm" tppabs="http://arch.cs.pku.edu.cn/parallelprogramming/mpispec/mpi54.htm"><IMG SRC="forward.gif" tppabs="http://arch.cs.pku.edu.cn/image/forward.gif" ALT="FORWARD" HEIGHT=32 WIDTH=32></A>
</TD>
</TR>
</TABLE>

</BODY>
</HTML>

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -