2.4 数据类型 |
MPI 管理系统存储器, 主要用于暂存消息和存储各种MPI对象的内部表示, 如进程组, 通信组, 数据类型等MPI对象。用户不能直接对这个存储器存取,并且所存储的对象是模糊的:即他们的尺寸和形状对用户不可见。模糊对象通过存在于用户空间的句柄可以被存取。对模糊对象操作的MPI过程被传送给存取这些对象的句柄参数。句柄除了用于MPI调用这些对象存取外, 句柄能参与赋值和比较。
Fortran中, 所有句柄的类型都是INTEGER(整型)。C语言中, 对每种对象定义不同类型的句柄。这些类型应支持赋值操作和相等操作。
Fortran中, 句柄可以是系统表中的一个模糊对象表的一个索引; C语言中, 句柄可以是对模糊对象的这样的索引或者是模糊对象的一个指针。更希奇的可能存在。
对每类对象的调用能“分配”和“解出分配”模糊对象。这些在描述对象那节给出列表。调用接受一个相应类型的句柄参数。在一个分配调用中,这是一个OUT参数, 它返回这个对象的一个有效引用。在一个解出分配调用中,这是一个INOUT参数, 带着一个" 无效的句柄" 值返回。MPI对每种对象类型提供一个" 无效的句柄" 常量。对这个常量的比较用于检测这个句柄的有效性。
对解出分配的一个调用使该句柄无效,并标记这个对象为解出分配。在这个调用之后,用户不能存取该对象。但MPI不必立刻解出分配这个对象。涉及对象的任何挂起操作(在解出分配时)将正常完成; 之后, 这个对象将被解出分配。
一个模糊对象和它的句柄仅在创建对象的进程中是重要的,而且还不能传给其他进程。
MPI提供预定义的模糊对象和这些对象的预定义的静态句柄。这些对象不能被损坏。
基本原理. 本设计隐藏了MPI数据结构所用的内部表示, 所以允许C语言和Fortran的近似调用。并避免了和这些语言的类型规则的冲突,也易于将来的功能扩展。这儿所使用的模糊对象机制大概遵从POSIX Fortran 标准。
用户空间的句柄和系统空间的对象的显示分离允许用户程序在适当点产生空间回收、解出分配的调用。如果模糊对象是在用户空间,编程者必须十分仔细,在任何要求那个对象完成的挂起操作以前,不能超出范围。特定的设计允许一个对象标记为解出分配,然后用户程序能超出范围,并且对象本身在任何挂起操作完成以前仍保持不变。
因为赋值/比较操作是普遍的, 所以要求句柄支持这些操作。这就限制了可能的实现方法的范围。这个选择必须允许句柄是任意的模糊类型。这将迫使引入赋值和比较的程序,增加了复杂性,因此被删出。(基本原理结束。)
给用户的建议. 通过给一个句柄赋另一个句柄的值, 然后解出分配与这些句柄联结的对象, 用户可以突然产生一个悬摆引用。相反地,如果一个句柄变量在相联的对象解出之前被解出分配,这个对象成为不可存取(这种情况可以发生,例如,如果这个句柄是一个子程序中的一个局部变量,这个子程序在所联接的对象解出分配以前退出)。除了分配或解出分配这些对象的调用结果以外,用户负责避免增加或删除对模糊对象的引用。(给用户的建议结束。)
给实现者的建议. 模糊对象的语义将是: 每个模糊对象相互分离; 每个分配这样一个对象的调用拷贝这个对象所要求的全部信息。实现替带引用拷贝可以避免多余的拷贝。例如,一个导出数据类型可以包含对它的组成部分的引用,而不拷贝它的组成;对MPI_COMM_GROUP的一个调用可以返回对该通信组的一个引用, 而不是这个通信组的拷贝。这种情况下,实现必须保留引用计数,并分配和解出分配对象,这样的作用好象拷贝了对象。(给实现者的建议结束。)
Copyright: NPACT |