5.2 基本概念 |
在本部分,我们给出上面所阐述概念的形式化定义。
一个组是进程标志符(后面的进程〕的一个有序集。进程是与实现相关的对象。组内的每个进程与一个整数rank相联系。序列号是连续的并从0开始。组用模糊的组对象来描述,因此不能直接从一个进程到另一个进程传送。可在一个通信子使用组来描述通信空间中的参与者并对这些参与者进行分级(这样在通信空间中为它们赋予了唯一的名字)
有一个特殊的预定义组:MPI_GROUP_EMPTY,这是一个没有成员的组。预定义的常数MPI_GROUP_NULL是为无效组句柄使用的值。
对用户的建议:不应将MPI_GROUP_EMPTY与MPI_GROUP_NULL混淆,前者是一个空组的有效句柄,而后者则是一个无效句柄。前者可以在组操作中作为一个参数使用;后者在组释放时被返回,不能存在于一个有效参中。(对用户的建议结束)
对实现者的建议:一个组可以用一个虚-实进程地址翻译表来描述。每一个通信子对象(见下面)有一个指向该表的指针。 MPI的简单实现是枚举这些组,例如在一个表中。但是,对于大量的进程来说, 为提高可扩展性和存储利用率建立更高级的数据结构则很有意义的。这种实现对于MPI是可能的。
上下文是通信子所具有的一个特性,它允许对通信空间进行划分。一个上下文所发送 的消息不能被另一个上下文所接收。进一步说,允许集合操作独立于挂起的点对点操作。上下文不是显式的MPI对象;它们仅作为通信子实现的一部分而出现(见下面〕
对实现者的建议:同一进程内的不同通信子有不同的上下文。上下文实质上是一个系统管理的标志,用于保证通信子在点对点和MPI定义的集合通信中的安全性。安全意味着同一通信子内的集合和点对点通信互不干扰,而且不同通信子上的通信也互不干扰。
上下文的一个可能的实现是以一个补充标志的形式附到发送的消息上并在接收时进行匹配。每一个组内通信子都存储它的两个标志值(一个用于点对点,另一个用于集合通信〕。通信子生成函数使用一个集合通信来协调一个新的组范围内的唯一上下文。
类似的,在组间通信中(严格的点对点通信〕,每个通信子中都存放这两个上下文标志,一个在组A中用于发送,在组B中用于接收,第二个在组B中用于发送,在组中用于接收。 由于上下文不是显式的对象,其它的实现也是可能的。
组内通信子将组的概念和上下文的概念结合到一起。为支持指定实现的优化及应用拓扑(下一章中定义,第六章〕,通信子也可以缓存附加信息(见5.7节〕。MPI通信操作引用通信子来决定点对点和集合操作进行操作的范围和空间。
每一个通信子包含一组有效的成员;该组总是包含本地进程。信息的源和目的通过组内的进程序列号来标志。
对于集合通信,组内通信子指明了一系列参加集合操作的进程(及它们的次序——当需要时〕.这样通信子就约束了通信的空间范围,而且通过序列号提供了与机器无关的进程访问。
组内通信子由模糊的组内通信子对象描述,因此不能直接从一个进程传到另一个进程。
一旦MPI_INIT被调用,所有进程的初始组内通信子MPI_COMM_WORLD即被定义, 本地进程在初始化(包括自身〕后可与之通信。另外还提供了通信子MPI_COMM_SELF, 该通信子仅包括自身进程。
预定义的常数MPI_COMM_NULL是为无效通信子使用的值。
在MPI的静态进程模型中,所有参加计算的进程在MPI被初始化后都可得到。对于这种情况,MPI_COMM_WORLD是所有进程在计算时都可获得的通信子;该通信子在所有进程具有同样的值。在进程可以动态加入MPI执行的MPI实现中,可能是这样的情形:一 个进程开始一个MPI计算无需访问其它的进程。在这种情况下,MPI_COMM_WORLD是合并所有进程的通信子,每一个加入的进程都可立即与之通信。因此MPI_COMM_WORLD可能在不同的进程中同时具有不同的值。
所有的MPI实现都要求提供MPI_COMM_WORLD通信子。在进程的生命期中不允许将其释放。与该通信子对应的组不是以预定义常数的形式出现的,但是可以使用MPI_COMM_GROUP访问它(见下面〕。MPI不指明MPI_COMM_WORLD中进程序列号间的对应关系及其(与机器相关的〕绝对地址。MPI也不指明任何主进程函数。在其它相关实现中,也可以提供预定义通信子。
Copyright: NPACT |