扬州建站公司,陕西省城乡住房和建设厅网站,网站数据库是谁提供,wordpress正文本博客参考官方文档进行介绍#xff0c;全网仅此一家进行中文翻译#xff0c;走过路过不要错过。
官方网址#xff1a;https://www.mpi-forum.org/
参考文档#xff1a;https://www.mpi-forum.org/docs/mpi-4.1/mpi41-report.pdf
引用官方4.1文档方法#xff1a;
manu…本博客参考官方文档进行介绍全网仅此一家进行中文翻译走过路过不要错过。
官方网址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_CommC类型必须支持赋值操作符和相等操作符。
Advice to implementors. 在Fortran中句柄可以是系统表中不透明对象的索引在C中它可以是这样的索引或指向对象的指针。(End of advice to implementors.)
Rationale. 由于Fortran整数值是等效的应用程序可以在所有三种支持的Fortran方法之间轻松转换MPI句柄。例如一个整数通信句柄COMM可以直接转换为一个完全等效的mpi_f08通信句柄命名为comm_f08通过comm_f08%MPI_VALCOMM反之亦然。使用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_EMPTYAdvice 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(KINDMPI_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(KINDMPI_ADDRESS_KIND)通过新的MPI Fortran绑定中的多态接口使用mpi_f08。请参阅第19.2节进行详细说明。(End of rationale.)
2.5.7 文件偏移 File Offsets
为了进行I/O操作需要给出文件的大小、位移和偏移量。这些量往往可能大于32位而Fortran整数的默认大小可能只有32位。为了解决这个问题在Fortran中可以声明这些量为INTEGER(KINDMPI_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(KINDMPI_ADDRESS_KIND)或INTEGER(KINDMPI_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(KINDMPI_COUNT_KIND)通过新的MPI Fortran绑定中的多态接口USE mpi_f08作为计数类型。请参阅第19.2节进行全面解释。(End of rationale.)
“大计数(large count)”一词指的是使用MPI_Count和INTEGER(KINDMPI_COUNT_KIND)参数类型。有些情况下在大计数的OUT参数中可以返回MPI_UNDEFINED。根据A.1.1表格第851页MPI_UNDEFINED常量被定义为C int或未命名的枚举和Fortran INTEGER。因此实现应选择MPI_Count和INTEGER(KINDMPI_COUNT_KIND)的底层类型以便可以将它们与MPI_UNDEFINED进行比较。
Advice to implementors. 将MPI_UNDEFINED与MPI_Count或INTEGER(KINDMPI_COUNT_KIND)进行比较时可能需要通过强制转换操作。(End of advice to implementors.)