MPI4.1文档4-MPI数据类型 MPI DataTypes

本博客参考官方文档进行介绍,全网仅此一家进行中文翻译,走过路过不要错过。

官方网址:https://www.mpi-forum.org/

参考文档:https://www.mpi-forum.org/docs/mpi-4.1/mpi41-report.pdf

引用官方4.1文档方法:

@manual{mpi41,
  author = "{Message Passing Interface Forum}",
  title  = "{MPI}: A Message-Passing Interface Standard Version 4.1",
  url   = "https://www.mpi-forum.org/docs/mpi-4.1/mpi41-report.pdf",
  year  = 2023,
  month  = nov
}

本文档分成多个博客进行介绍,在本人专栏中含有所有内容:

https://blog.csdn.net/qq_33345365/category_12610893.html

MPI-4.1为2023年11月2日发表,本专栏书写日期2024/3/18

本人会维护一个总版本,一个小章节的版本,总版本会持续更新,小版本会及时的调整错误和不合理的翻译,内容大部分使用chatGPT 3.5翻译,内容不引用文献,请自行去文档查看


开始编辑时间:2024/3/18;最后编辑时间:2024/3/21

2.5 数据类型 Datatypes

MPI管理用于缓冲消息和存储各种MPI对象的内部表示(如组、通信器、数据类型等)的系统内存。这些内存对用户不可直接访问,存储在其中的对象是不透明的:用户无法看到其大小和形状。不透明对象通过句柄访问,这些句柄存在于用户空间中。MPI操作不透明对象的过程通过传递句柄参数来访问这些对象。除了用于对象访问的MPI调用之外,句柄还可以参与赋值和比较操作。

在Fortran中,使用USE mpi或(已弃用的)INCLUDE 'mpif.h',所有句柄都具有INTEGER类型。在Fortran中使用USE mpi_f08,以及在C中,每个对象类别都定义了不同的句柄类型。使用Fortran USE mpi_f08时,句柄被定义为Fortran BIND©派生类型,只包含一个元素INTEGER :: MPI_VAL。内部句柄值与mpi模块和(已弃用的)mpif.h中使用的Fortran INTEGER值相同。运算符.EQ.、.NE.、==和/ =被重载,以允许对这些句柄进行比较。类型名称与C中的名称相同,只是它们不区分大小写。例如:

TYPE , BIND (C) :: MPI_Comm
INTEGER :: MPI_VAL
END TYPE MPI_Comm

C类型必须支持赋值操作符和相等操作符。

Advice to implementors. 在Fortran中,句柄可以是系统表中不透明对象的索引;在C中,它可以是这样的索引或指向对象的指针。(End of advice to implementors.)

Rationale. 由于Fortran整数值是等效的,应用程序可以在所有三种支持的Fortran方法之间轻松转换MPI句柄。例如,一个整数通信句柄COMM可以直接转换为一个完全等效的mpi_f08通信句柄,命名为comm_f08,通过comm_f08%MPI_VAL=COMM,反之亦然。使用INTEGER定义的句柄和BIND©派生类型句柄的方法是不同的:Fortran 2003(以及更高版本)定义了BIND©派生类型可以在用户定义的公共块内使用,但是这取决于伴随的C编译器规则,用于这些BIND©派生类型句柄的数值存储单元数量是多少。大多数编译器使用一个单位来处理整数句柄和作为BIND(C)派生类型定义的句柄。(End of rationale.)

Advice to users. 如果用户想要用 mpi_f08 模块替换 mpi 模块或者 (已弃用的) mpif.h,并且应用程序在 Fortran 公共块中存储一个句柄,那么就需要在所有使用这个公共块的应用程序子程序中改变 Fortran 支持方法,因为这个句柄的数值存储单元数量在这两个模块中可能不同。(End of advice to users.)

不透明对象由特定于每种对象类型的调用进行分配和释放。这些调用在描述对象的部分中列出。调用接受匹配类型的句柄参数。在分配调用中,这是一个OUT参数,返回一个有效的对象引用。在调用释放时,这是一个INOUT参数,返回一个“无效句柄”值。MPI为每种对象类型提供了一个“无效句柄”常量。与此常量的比较用于测试句柄的有效性。

对释放例程的调用使句柄无效,并标记对象以进行释放。在调用之后,用户无法访问该对象。但是,MPI不必立即释放对象。在释放时挂起的任何操作(在释放时)和涉及该对象的解耦MPI活动(请参阅第2.9节)将正常完成;对象将在此后被释放。

不透明对象及其句柄仅在创建对象的进程中具有重要性,并且无法转移到另一个进程。

MPI提供了一些预定义的不透明对象和这些对象的预定义静态句柄。用户不得释放这样的对象。

Rationale. 这种设计隐藏了用于MPI数据结构的内部表示,从而允许在C和Fortran中进行类似的调用。它还避免了与这些语言中的类型规则冲突,并且容易允许未来功能的扩展。这里使用的不透明对象的机制松散地遵循了POSIX Fortran绑定标准。

在用户空间中明确分离句柄和系统空间中的对象允许在用户程序中适当的时机进行空间回收和释放调用。如果不透明对象在用户空间中,就必须非常小心,不要在任何待处理的操作需要该对象完成之前超出范围。指定的设计允许标记对象以进行释放,然后用户程序可以超出范围,而对象本身仍然持久存在,直到任何待处理的操作完成为止。

句柄支持赋值/比较的要求是因为这样的操作很常见。这限制了可能实现的范围。在C中的替代方案是允许句柄是一个任意的不透明类型。这将强制引入进行赋值和比较的例程,增加了复杂性,因此被排除了。在Fortran中,句柄被定义为使赋值和比较通过语言的运算符或这些运算符的重载版本可用。(End of rationale.)

Advice to users. 用户可能会通过将一个句柄变量赋值给另一个句柄变量,然后释放与这些句柄相关联的对象,从而意外创建悬空引用。相反,如果一个句柄变量在关联的对象被释放之前被释放,那么该对象就会变得无法访问(例如,如果句柄是子程序中的局部变量,并且在关联对象被释放之前退出了子程序)。用户有责任避免向不透明对象添加或删除引用,除非是由于MPI调用分配或释放这些对象。(End of advice to users.)

Advice to implementors. 不透明对象的预期语义是不透明对象彼此独立;为了创建这样的对象,每次调用都会复制创建对象所需的所有信息。实现可以通过引用替换复制来避免过度复制。例如,派生数据类型可以包含对其组件的引用,而不是组件的副本;对MPI_COMM_GROUP的调用可能会返回与通信器关联的组的引用,而不是这个组的副本。在这种情况下,实现必须维护引用计数,并以使得可见效果就像对象已被复制的方式分配和释放对象。(End of advice to implementors.)

2.5.2 数组参数 Array Arguments

MPI调用可能需要一个参数,该参数是不透明对象的数组,或者是一个句柄的数组。句柄数组是一个常规数组,其中条目是连续位置上相同类型对象的句柄。每当使用这样的数组时,需要额外的len参数来指示有效条目的数量(除非可以通过其他方式推导出这个数字)。有效条目位于数组的开始位置;len指示其中有多少个,并且不必是整个数组的大小。其他数组参数也遵循相同的方法。在某些情况下,将NULL句柄视为有效条目。当需要将数组的状态参数设为NULL时,可以使用MPI_STATUSES_IGNORE。

2.5.3 状态 State

MPI过程在各处使用具有状态类型的参数。此类数据类型的值均由名称标识,并且没有针对它们的任何操作。例如,MPI_TYPE_CREATE_SUBARRAY例程具有一个名为order的状态参数,其值为MPI_ORDER_C和MPI_ORDER_FORTRAN。

MPI程序有时会为基本类型参数的特殊值赋予特殊含义;例如,标签是点对点通信操作的整数值参数,具有特殊的通配符值MPI_ANY_TAG。这样的参数将具有一定范围的常规值,这个范围是相应基本类型的值范围的子范围;特殊值(例如MPI_ANY_TAG)将在常规范围之外。常规值的范围,如标签,可以使用环境查询函数进行查询,参见第9章。其他值的范围,如源,取决于其他MPI例程给定的值(在源的情况下,是通信器的大小)。

MPI还提供了预定义的命名常量句柄,例如MPI_COMM_WORLD。

所有命名的MPI常量,除Fortran中以下列出的情况外,均可在初始化表达式或赋值中使用。由常量句柄访问的不透明对象在MPI初始化(例如,使用MPI_INIT)和MPI结束(例如,使用MPI_FINALIZE)之间定义并且其值不会改变。句柄本身是常量,也可以在初始化表达式或赋值中使用。

在C中,所有命名的MPI常量,其在“A.1.1节”中描述为“整数常量表达式”的常量,必须实现为指定整数类型的C整数常量表达式。在C中的其他MPI常量不要求是C整数常量表达式,但必须可以在初始化表达式和赋值中使用。因此,不能保证它们可用于数组声明或作为switch语句中的case标签。

在Fortran中,所有命名的MPI常量(以下列出的情况除外)必须声明为具有PARAMETER属性的常量。 在Fortran中不能在初始化表达式或赋值中使用的常量如下:

MPI_BOTTOM
MPI_BUFFER_AUTOMATIC
MPI_STATUS_IGNORE
MPI_STATUSES_IGNORE
MPI_ERRCODES_IGNORE
MPI_IN_PLACE
MPI_ARGV_NULL
MPI_ARGVS_NULL
MPI_UNWEIGHTED
MPI_WEIGHTS_EMPTY

Advice to implementors. 在Fortran中,实现这些特殊常数可能需要使用超出Fortran标准的语言构造。通过使用特殊值来定义常数(例如,通过PARAMETER语句),并不可行,因为实现无法区分这些值与有效数据。通常,这些常数被实现为预定义的静态变量(例如,MPI声明的COMMON块中的变量),依赖于目标编译器通过地址传递数据的事实。在子例程中,可以通过一些超出Fortran标准的机制(例如,通过Fortran扩展或在C中实现函数)来提取这个地址。(End of advice to implementors.)

2.5.5 选择 Choice

MPI函数有时会使用具有选择(或联合)数据类型的参数。对同一例程的不同调用可能会通过引用传递不同类型的实际参数。为提供这种参数,各种语言的机制会有所不同。对于使用(已弃用的)mpif.h或mpi模块的Fortran语言,文档中使用<type>表示选择变量;对于使用Fortran 2018语法TYPE(*), DIMENSION(…)声明此类参数的Fortran mpi_f08模块,对于C语言,我们使用void*。

Advice to implementors. 实现者可以自由选择如何在mpi模块中实现选择参数,例如,可以使用非标准的依赖于编译器的方法,其质量类似于隐式Fortran接口中的调用机制,或者可以使用在mpi_f08模块中定义的方法。详见第19.1.1节。(End of advice to implementors.)

2.5.6 绝对地址和相对地址位移 Absolute Addresses and Relative Address Displacements

MPI程序中的一些过程使用地址参数,这些参数代表调用程序中的绝对地址,或者相对位移参数,表示两个绝对地址的差值。这些参数的数据类型在C语言中是MPI_Aint,在Fortran中是INTEGER(KIND=MPI_ADDRESS_KIND)。这些类型必须具有相同的宽度,并以相同的方式编码地址值,以便在不进行转换的情况下,可以直接将一个语言中的地址值传递到另一个语言中。MPI提供了常量MPI_BOTTOM来指示地址范围的开始。为了检索绝对地址或进行任何绝对地址的计算,应使用第5.1.5节提供的例程和函数。第5.1.12节提供了有关正确使用绝对地址的额外规则。对于包含相对位移或其他用途而不是绝对地址的表达式,可以使用内在运算符(例如,+、-、*)。

Rationale. 字节位移值需要足够大,以编码用于表示绝对或相对内存地址的任何值。在MPI-4.0之前,一些MPI例程在C语言中使用int,在Fortran中使用INTEGER作为字节位移参数的类型。为了避免破坏向后兼容性,此版本的标准继续支持在这些例程中使用int在C语言中以及在Fortran中使用INTEGER。此外,此版本的标准支持在这些例程中在C语言中使用MPI_Aint(通过单独的“_c”后缀过程)以及在Fortran中使用INTEGER(KIND=MPI_ADDRESS_KIND)(通过新的MPI Fortran绑定中的多态接口(使用mpi_f08))。请参阅第19.2节进行详细说明。(End of rationale.)

2.5.7 文件偏移 File Offsets

为了进行I/O操作,需要给出文件的大小、位移和偏移量。这些量往往可能大于32位,而Fortran整数的默认大小可能只有32位。为了解决这个问题,在Fortran中可以声明这些量为INTEGER(KIND=MPI_OFFSET_KIND)。在C语言中,可以使用MPI_Offset。这些类型必须具有相同的宽度,并以相同的方式编码地址值,以便可以直接将一个语言中的偏移量值传递到另一个语言中而无需转换。

2.5.8 计数 Counts

MPI定义了类型(例如MPI_Aint),用于表示内存中的位置,以及其他类型(例如MPI_Offset),用于表示文件中的位置。此外,一些MPI过程使用计数参数来表示要操作的MPI数据类型的数量。此外,在MPI工具信息接口的上下文中,时间戳是自过去某个时间以来经过的时钟滴答数。有时,我们需要一个单一类型,可以用于表示内存或文件中的位置,并表示计数值,这个类型就是在C中的MPI_Count,和在Fortran中的INTEGER (KIND = MPI_COUNT_KIND)。这些类型必须具有相同的宽度,并以相同的方式编码值,以便可以直接将一个语言中的计数值传递给另一个语言而无需转换。MPI_Count类型的大小由MPI实现确定,但限制是它必须至少能够编码任何可以存储在C类型int、MPI_Aint或MPI_Offset的变量中的值,以及在Fortran中的INTEGER、INTEGER(KIND=MPI_ADDRESS_KIND)或INTEGER(KIND=MPI_OFFSET_KIND)类型的变量中的值。即使MPI_Count类型足够大以编码地址位置,MPI_Count类型也不应用于表示绝对地址。

Rationale. 计数值需要足够大,以编码用于表示元素计数、步长、偏移量、索引、位移、内存中的类型映射、文件视图中的类型映射等的任何值。在MPI-4.0之前,许多MPI例程在C中使用int类型,在Fortran中使用INTEGER作为计数参数的类型。为了避免破坏向后兼容性,该标准版本继续支持在这些例程中使用C中的int以及Fortran中的INTEGER。此外,该标准版本还支持在这些例程中使用MPI_Count(通过单独的“_c”后缀程序)作为C中的计数类型,以及在Fortran中使用INTEGER(KIND=MPI_COUNT_KIND)(通过新的MPI Fortran绑定中的多态接口(USE mpi_f08))作为计数类型。请参阅第19.2节进行全面解释。(End of rationale.)

“大计数(large count)”一词指的是使用MPI_Count和INTEGER(KIND=MPI_COUNT_KIND)参数类型。有些情况下,在大计数的OUT参数中可以返回MPI_UNDEFINED。根据A.1.1表格(第851页),MPI_UNDEFINED常量被定义为C int(或未命名的枚举)和Fortran INTEGER。因此,实现应选择MPI_Count和INTEGER(KIND=MPI_COUNT_KIND)的底层类型,以便可以将它们与MPI_UNDEFINED进行比较。

Advice to implementors. 将MPI_UNDEFINED与MPI_Count或INTEGER(KIND=MPI_COUNT_KIND)进行比较时,可能需要通过强制转换操作。(End of advice to implementors.)

相关推荐

  1. MPI4.1文档4-MPI数据类型 MPI DataTypes

    2024-03-21 14:24:05       35 阅读
  2. MPI4.1文档3-MPI过程与MPI数据类型

    2024-03-21 14:24:05       34 阅读
  3. ~MAY~

    2024-03-21 14:24:05       31 阅读
  4. deepstream读取mp4文件及不同类型视频输入bug解决

    2024-03-21 14:24:05       32 阅读
  5. nginx 配置mp4文件播放

    2024-03-21 14:24:05       40 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-03-21 14:24:05       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-03-21 14:24:05       101 阅读
  3. 在Django里面运行非项目文件

    2024-03-21 14:24:05       82 阅读
  4. Python语言-面向对象

    2024-03-21 14:24:05       91 阅读

热门阅读

  1. 邦芒解析:职场中得不到理想薪水的八大原因

    2024-03-21 14:24:05       38 阅读
  2. CSS是什么,它主要用于做什么?

    2024-03-21 14:24:05       38 阅读
  3. Android 图形渲染和显示系统关系

    2024-03-21 14:24:05       40 阅读
  4. CSS有哪些选择器?

    2024-03-21 14:24:05       40 阅读
  5. 共享旅游卡是什么?千益畅行算不算?

    2024-03-21 14:24:05       49 阅读
  6. HTML与WXML 、 CSS与WXSS的区别

    2024-03-21 14:24:05       46 阅读
  7. 设计模式(行为型设计模式——中介者模式)

    2024-03-21 14:24:05       44 阅读