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.)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/760096.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

QT中使用GDAL多线程读取遥感图像到QImage

GDAL 是一个很强大的可以读取很多格式 的带有GIS信息的栅格型图像。前阵子项目中需要读取遥感图像&#xff0c;并显示到QT界面&#xff0c;由于遥感图像一般很大&#xff0c;所以采取新开一个读图线程的方式来读取&#xff0c;防止界面假死。下面是代码共享&#xff0c;测试通过…

x-zse-96,android端,伪dex加固,so加固,白盒AES,字符串加密

x-zse-96,android端,伪dex加固,so加固,白盒AES,字符串加密 上一篇某招聘软件的sig及sp参数被和谐掉了,所以懂得都懂啊! 因为web的api没有那么全,所以来看了下app的,ios的防护几乎没有,纸糊的一样,android端的有点复杂了,到最后我也没能完整的实现整个加密过程,我也只复现到DF…

Hadoop安装部署-单机版

Apache Hadoop是一个使用HDFS&#xff08;Hadoop Distributed File System&#xff09;分布式文件系统执行可靠的、规模化的分布式计算的开源项目&#xff0c;Hadoop是使用Java语言开发&#xff0c;其运行在Linux操作系统上集群规模最大支持几千个分布式节点&#xff0c;本文主…

【嵌入式——QT】QThread创建多线程

【嵌入式——QT】QThread创建多线程 概述主要函数图示代码示例 概述 QThread类提供不依赖于平台的管理线程的方法&#xff0c;一个QThread类的对象管理一个线程&#xff0c;一般从QThread继承一个自定义类&#xff0c;并重定义虚函数run()&#xff0c;在run()函数里实现线程需…

基于java的健身房管理系统的设计与实现论文

摘 要 现代经济快节奏发展以及不断完善升级的信息化技术&#xff0c;让传统数据信息的管理升级为软件存储&#xff0c;归纳&#xff0c;集中处理数据信息的管理方式。本健身房管理系统就是在这样的大环境下诞生&#xff0c;其可以帮助管理者在短时间内处理完毕庞大的数据信息&…

富格林:谨记可信计策安全做单

富格林悉知&#xff0c;现货黄金由于活跃的行情给投资者带来不少的盈利的机会&#xff0c;吸引着众多的投资者进场做单。但在黄金投资市场中一定要掌握可信的投资方法&#xff0c;提前布局好策略&#xff0c;这样才能增加安全获利的机会。不建议直接进入市场做单&#xff0c;因…

【MySQL】数据库的基础概念

&#x1f466;个人主页&#xff1a;Weraphael ✍&#x1f3fb;作者简介&#xff1a;目前学习计网、mysql和算法 ✈️专栏&#xff1a;MySQL学习 &#x1f40b; 希望大家多多支持&#xff0c;咱一起进步&#xff01;&#x1f601; 如果文章对你有帮助的话 欢迎 评论&#x1f4ac…

Redis 更新开源许可证 - 不再支持云供应商提供商业化的 Redis

原文&#xff1a;Rowan Trollope - 2024.03.20 未来的 Redis 版本将继续在 RSALv2 和 SSPLv1 双许可证下提供源代码的免费和宽松使用&#xff1b;这些版本将整合先前仅在 Redis Stack 中可用的高级数据类型和处理引擎。 从今天开始&#xff0c;所有未来的 Redis 版本都将以开…

Vue.js前端开发零基础教学(二)

目录 前言 2.1 单文件组件 2.2 数据绑定 2.2.2 响应式数据绑定 2.3 指令 2.3.1 内容渲染指令 2.3.2 属性绑定指令 ​编辑 2.3.3 事件绑定指令 2.3.4 双向数据绑定指令 2.3.5 条件渲染指令 2.3.6 列表渲染指令 2.4 事件对象 2.5 事件修饰符 学习目标&am…

优化您的部署:Docker 镜像最佳实践

介绍 在快速发展的软件开发和部署领域&#xff0c;Docker 已成为容器化的强大工具&#xff0c;为打包、分发和运行应用程序提供了一种标准化的高效方式。Docker 镜像在这一过程中发挥着至关重要的作用&#xff0c;是容器化应用程序的基础。为确保最佳性能、可扩展性和安全性&a…

sentinel使用控制台实现

1、添加依赖 <!--整合控制台--><dependency> <groupId>com.alibaba.csp</groupId> <artifactId>sentinel-transport-simple-http</artifactId> <version>1.8.0</version></dependency> 此项方法&#xff0…

HarmonyOS入门学习

HarmonyOS入门学习 前言快速入门ArkTS组件基础组件Image组件Text组件TextInput 文本输入框Buttonslider 滑动组件 页面布局循环控制ForEach循环创建组件 List自定义组件创建自定义组件Builder 自定义函数 状态管理Prop和LinkProvide和ConsumeObjectLink和Observed ArkUI页面路由…

JVM第八讲:GC - Java 垃圾回收基础知识

GC - Java 垃圾回收基础知识 本文是JVM第八讲&#xff0c; Java 垃圾回收基础知识。垃圾收集主要是针对堆和方法区进行&#xff1b;程序计数器、虚拟机栈和本地方法栈这三个区域属于线程私有的&#xff0c;只存在于线程的生命周期内&#xff0c;线程结束之后也会消失&#xff0…

蓝桥杯day6刷题日记-航班时间-完全二叉树的权值-砝码称重

P8665 [蓝桥杯 2018 省 A] 航班时间 注意输出形式和读取数据的形式 #include <iostream> #include <algorithm> using namespace std; int n,h1,m1,s1,h2,m2,s2; int q[1000];int gettime() {int day 0;scanf("%d:%d:%d %d:%d:%d", &h1, &m1,…

单片机第四季-第二课:uCos2源码-BSP

1&#xff0c;初始uCos2 文件中uC开头的为uCos相关的。 2&#xff0c;uCos2源码工程建立 建立Source Insight工程 寻找main函数 (1)RTOS其实就是一个大的裸机程序&#xff0c;也是从main开始运行的 (2)main之前也是有一个汇编的启动文件的 (3)main中调用了很多初始化函数 bsp部…

html2canvas实现原理

html2canvas 是一个 JavaScript 库&#xff0c;可以将 HTML 元素转换为 Canvas 元素&#xff0c;进而实现对网页内容的截图功能。它的实现原理主要包括以下几个步骤&#xff1a; 1、解析和构建 DOM 树&#xff1a;html2canvas 首先会解析网页上指定的 HTML 元素&#xff0c;包…

开机动画结束正常进入桌面

systemUI 添加壁纸 1128 I am_proc_start: [0,1485,10019,com.android.systemui,service,{com.android.systemui/com.android.systemui.ImageWallpaper}] Line 87550: 03-08 17:29:15.680346 947 1128 I ActivityManager: Start proc 1485:com.android.systemui/u0a19 …

Linux信号补充——信号发送和保存

三、信号的发送与保存 3.1信号的发送 ​ 必须有操作系统来保存信号&#xff0c;因为他是管理者&#xff1b; ​ 信号给进程的task_struct发送信号&#xff0c;在task_struct中维护了一个整数signal有0-31位&#xff0c;共32个bit位&#xff1b;对于信号的管理使用的是位图结…

Java常见的垃圾回收器GC

本节讲解一下常见的垃圾回收器。需要特别注意的是&#xff0c;每一种垃圾回收器都会存在用户线程&#xff08;即用户程序&#xff09;暂停的问题&#xff0c;只不过每种回收器用户线程暂停的时长优化程度不一样。在启动JVM时&#xff0c;可以通过“指定参数-xx:垃圾回收器名称”…

Android静默安装一(Root版)

近期开发上线一个常驻app&#xff0c;项目已上线&#xff0c;今天随笔记录一下静默安装相关内容。我分三篇静默安装&#xff08;root版&#xff09;、静默安装&#xff08;无障碍版&#xff09;、监听系统更新、卸载、安装。先说说我的项目需求&#xff1a;要求app一直运行&…