图片 展示 网站模板快速seo整站优化排行

news/2025/10/8 20:41:37/文章来源:
图片 展示 网站模板,快速seo整站优化排行,咨询工程师,报价网站制作本博客参考官方文档进行介绍#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当时最新版本4.1 本人会维护一个总版本一个小章节的版本总版本会持续更新小版本会及时的调整错误和不合理的翻译内容大部分使用chatGPT 3.5翻译内容不引用文献请自行去文档查看 开始编辑时间2024/3/18最后编辑时间2024/3/24 MPI4.1文档1MPI总览与各版本介绍 MPI: A Message-Passing Interface Standard 单词表本人常用语不代表官方翻译 缩写/英文全称/翻译缩写/英文全称/翻译MPIMessage-Passing Interface 消息传递接口collective集合communicator通信器one-sided单边non-blocking非阻塞persistent持久化dynamic processes动态进程 前言 这份文档描述了消息传递接口MPI标准版本为4.1。 MPI标准包括点对点消息传递、集合通信、组和通信器概念、进程拓扑、环境管理、进程创建和管理、单边通信、扩展集合操作、外部接口、输入输出、一些杂项主题以及多种工具接口。C语言和Fortran语言的语言绑定已定义。 历史上该标准的演变如下 MPI-1.01994年5月5日首次发布。MPI-1.11995年6月12日小更新和错误修复。MPI-1.21997年7月18日几处澄清和补充。MPI-2.01997年7月18日新增功能以及MPI-1.2的所有澄清和补充内容。MPI-1.32008年5月30日出于历史原因将MPI-1.1、MPI-1.2以及几个勘误文档合并为一个文档。MPI-2.12008年6月23日合并前述文档。MPI-2.22009年9月4日进一步澄清和新增七个新的例程。MPI-3.02012年9月21日对MPI-2.2进行扩展。MPI-3.12015年6月4日澄清和对MPI-3.0进行小幅扩展。MPI-4.02021年6月9日在MPI-3.1基础上增加了重要的新功能。MPI-4.12023年11月2日对MPI-4.0进行澄清和小幅扩展。 MPIMessage Passing Interface是一种用于编写并行计算程序的标准。以下是各个版本的简要介绍 版本 4.12023年11月2日发布。主要对 MPI-4.0 文档进行了修正和澄清。一些例程、属性键 MPI_HOST 和 mpif.h Fortran 包含文件已被弃用。 版本 4.02021年6月9日发布。这是一个重要更新版本包含了显著的新功能。最大的变化包括添加了许多例程的大型计数版本以解决使用 int 或 INTEGER 作为计数参数的限制持久性集合操作分区通信MPI 初始化的另一种方式应用程序信息断言以及改进的错误处理定义。此外还有一些较小的改进和修正。 版本 3.12015年6月4日发布。主要对 MPI-3.0 文档进行了修正和澄清。最大的变化是对 MPI-3.0 中引入的 Fortran 绑定进行了修正。此外还添加了一些新函数包括以便携方式操作 MPI_Aint 值的例程非阻塞集合 I/O 例程以及通过名称获取 MPI_T 性能和控制变量的索引值的例程。 版本 3.02012年9月21日发布。与 MPI-2.2 的开发同时MPI 论坛开始讨论对 MPI 进行重大扩展的问题。这个文档包含了 MPI-3 标准。此版本包含了对 MPI 功能的显著扩展包括非阻塞集合操作新的单边通信操作以及 Fortran 2008 绑定。与 MPI-2.2 不同这个标准被视为对 MPI 标准的重大更新。与之前的版本一样只有在用户有强烈需求时才会采用新功能。然而一些功能可能对现有的 MPI 实现产生更多的影响。 版本 2.22009年9月4日发布。主要对 MPI-2.1 文档进行了修正和澄清。虽然添加了一些扩展但所有正确的 MPI-2.1 程序也是正确的 MPI-2.2 程序。只有在用户有强烈需求、开放源代码实现和对现有 MPI 实现影响较小时才会采用新功能。 版本 2.12008年6月23日发布。此文档合并了之前的 MPI-1.32008年5月30日和 MPI-2.01997年7月18日文档。MPI-2.0 的某些部分如第4章杂项和第7章扩展集合操作的某些部分已经合并到 MPI-1.3 的章节中。此外还包括了 MPI 论坛收集的其他勘误和澄清。 版本 1.32008年5月30日发布。此文档合并了之前的 MPI-1.11995年6月12日和 MPI-21997年7月18日中的 MPI-1.2 章节。MPI 论坛收集的关于 MPI-1.1 和 MPI-1.2 的其他勘误也包含在此文档中。 MPI-2.0版本1997年7月18日。在发布MPI-1.1版本后MPI论坛开始开会讨论修正和扩展事项。MPI-2.0版本着重于进程创建和管理、单边通信、扩展集合通信、外部接口和并行I/O。杂项章节讨论了其他内容特别是语言互操作性方面的内容。 MPI-1.2版本1997年7月18日。MPI-2论坛将MPI-1.2版本作为“MPI-2:消息传递界面的扩展”标准的第3章引入该标准于1997年7月18日发布。该章节包含了对MPI标准1.1版本的澄清和次要修正。MPI-1.2版本中唯一的新功能是用于确定实现符合MPI标准的版本的功能。MPI-1版本和MPI-1.1版本之间存在一些小差异而MPI-1.1版本和MPI-1.2版本之间几乎没有差异但是MPI-1.2版本和MPI-2版本之间存在较大差异。 MPI-1.1版本1995年6月。从1995年3月开始消息传递界面论坛重新召开会议以纠正错误并澄清1994年5月的MPI文档以下简称为1.0版本。这些讨论结果形成了1.1版本。与1.0版本相比1.1版本的更改是次要的。还提供了一个标记了所有更改的文档版本。 MPI-1.0版本1994年5月。消息传递界面论坛是由40多个组织参与的自1993年1月以来一直在开会讨论和定义一组消息传递的库接口标准。消息传递界面论坛未经任何官方标准组织的支持或认可。 消息传递界面的目标很简单即制定一种广泛使用的标准用于编写消息传递程序。因此该接口应该确立一种实用、可移植、高效和灵活的消息传递标准。 这是消息传递界面论坛的最终报告1.0版本。该文档包含了提议的接口的所有技术特性。这份草案是1994年5月通过LATEX处理的。 章节1 介绍MPI 1.1 总览与目标 MPI是一个消息传递库接口规范这个定义的所有部分都很重要。MPI主要针对消息传递并行编程模型其中数据通过每个进程上的协作操作从一个进程的地址空间移动到另一个进程的地址空间。在集合操作、远程内存访问操作、动态进程创建和并行I/O等方面提供了对“经典”消息传递模型的扩展。MPI是一个规范不是一个实现有多个MPI的实现。这个规范是一个库接口MPI不是一种语言所有MPI操作都表达为函数、子程序或方法根据适当的语言绑定对于C和Fortran来说这些是MPI标准的一部分。这个标准是通过一个由并行计算供应商、计算机科学家和应用开发者组成的社区的开放过程定义的。接下来的几节概述了MPI发展的历史。 建立消息传递标准的主要优势是可移植性和易用性。在一个分布式内存通信环境中高级例程和/或抽象是建立在低级消息传递例程之上的标准化的好处特别明显。此外像这里提出的消息传递标准的定义为供应商提供了一个明确定义的基本例程集供他们有效实现或在某些情况下提供硬件支持从而增强可伸缩性。 简而言之MPI的目标是开发一个广泛使用的用于编写消息传递程序的标准。因此该接口应该为消息传递建立一个实用、可移植、高效和灵活的标准。 以下是一份完整的目标列表 设计一个应用程序接口不一定是为编译器或系统实现库设计。允许高效的通信避免内存到内存的复制允许计算和通信的重叠并在可用时将任务卸载到通信协处理器。支持在异构环境中使用的实现。为接口提供方便的C和Fortran绑定。假设有可靠的通信接口用户无需处理通信失败这些失败由底层通信子系统处理。定义的接口应该能够在许多供应商的平台上实现而不需要在底层通信和系统软件中做出重大改变。接口的语义应该是语言无关的。接口应该被设计为支持线程安全。 1.2 MPI-1.0的背景 MPI寻求利用现有消息传递系统的最有吸引力的特性而不是选择其中一个并将其作为标准采用。因此MPI受到了IBM T. J. Watson研究中心的工作[3, 4]Intel的NX/2 [58]Express [15]nCUBE的Vertex [54]p4 [10, 11]和PARMACS [7, 12]的强烈影响。其他重要的贡献来自Zipcode [61, 62]Chimp [21, 22]PVM [6, 19]Chameleon [32]和PICL [27]。 MPI的标准化工作涉及来自40个组织的大约60人主要来自美国和欧洲。大多数并发计算机的主要供应商参与了MPI还有来自大学、政府实验室和工业界的研究人员。标准化过程始于1992年4月29日至30日在弗吉尼亚州威廉斯堡举办的“分布式内存环境下消息传递标准研讨会”由并行计算研究中心赞助 [70]。在这个研讨会上讨论了一个标准消息传递接口所必需的基本特性并成立了一个工作组来继续标准化过程。 一个初步的草案提议即MPI-1由DongarraHempelHey和Walker于1992年11月提出并于1993年2月完成了修订版本 [20]。MPI-1包含了在威廉斯堡研讨会上确定的主要特性被认为在消息传递标准中是必要的。由于MPI-1主要旨在促进讨论并“启动进程”因此主要集中于点对点通信。MPI-1提出了一些重要的标准化问题但没有包括任何集合通信例程并且不是线程安全的。 1992年11月在明尼阿波利斯举行了一次MPI工作组会议决定将标准化过程放在更正式的基础上并普遍采用高性能Fortran论坛的程序和组织。为标准的主要组件领域成立了小组委员会并为每个领域建立了一个电子邮件讨论服务。此外设定了在1993年秋季之前制定出草案MPI标准的目标。为了实现这一目标MPI工作组在1993年头9个月的每6周举行两天的会议并在1993年11月的超级计算93会议上提出了草案MPI标准。这些会议和电子邮件讨论共同构成了MPI论坛其成员资格对所有高性能计算社区的成员开放。 1.3 MPI-1.1 MPI-1.2和MPI-2.0的背景 从1995年3月开始MPI论坛开始会议讨论对原始MPI标准文档[24]的修正和扩展。这些讨论的第一个成果是MPI规范的1.1版本发布于1995年6月[25]。当时的工作重点集中在五个领域。 MPI-1.1文档的进一步更正和澄清。MPI-1.1的补充内容不会显著改变其功能类型例如新的数据类型构造函数语言互操作性等。完全新的功能类型例如动态进程单边通信并行I/O等即所有人所认为的“MPI-2功能”。Fortran 90和C的绑定。MPI-2为MPI-1和MPI-2函数指定了C绑定并扩展了MPI-1和MPI-2的Fortran 77绑定以处理Fortran 90的问题。MPI进程和框架似乎可能有用的领域的讨论但在标准化之前需要更多讨论和经验例如在共享内存机器上的零拷贝语义实时规范等。 以下是关于MPI-2文档第3章的纠正和澄清内容“MPI-2版本1.2”收集了这些内容。该章还包含用于识别版本号的函数。MPI-1.1的补充内容以上述列表中的2、3和4类型的项目位于MPI-2文档的其余章节中并构成MPI-2的规范。列表中第5类型的项目已经移至一个独立的文档名为“MPI开发杂志”JOD不属于MPI-2标准的一部分。这种结构使用户和实施者能够了解给定实现的MPI兼容性水平 MPI-1兼容性意味着符合MPI-1.3。这是一个有用的兼容性水平。它意味着该实现符合MPI-1.1在MPI-2文档第3章中给出的MPI-1.1函数行为的澄清。一些实现可能需要更改才能符合MPI-1。MPI-2兼容性意味着符合MPI-2.1的所有内容。MPI开发日志不是MPI标准的一部分。 需要强调的是向前兼容性得到了保留。也就是说一个有效的MPI-1.1程序既是一个有效的MPI-1.3程序也是一个有效的MPI-2.1程序而一个有效的MPI-1.3程序则是一个有效的MPI-2.1程序。 1.4 MPI-1.3和MPI-2.1的本经 在MPI-2.0发布之后MPI论坛继续致力于纠正和澄清标准文件MPI-1.1和MPI-2.0。短文档“MPI-1.1的勘误表”于1998年10月12日发布。2001年7月5日发布了对MPI-2.0的勘误和澄清的第一次投票第二次投票于2002年5月22日进行。这两次投票都是通过电子方式进行的。这两次投票合并成了一份文档“MPI-2的勘误表”发布于2002年5月15日。然后这个勘误流程中断了但论坛及其电子邮件反馈者继续处理新的澄清请求。 MPI论坛的常规工作重启始于三次会议在欧洲PVM/MPI’06波恩、欧洲PVM/MPI’07巴黎和SC’07里诺。2007年12月一个指导委员会开始组织新的MPI论坛会议定期每8周召开一次。在2008年1月14日至16日的芝加哥会议上MPI论坛决定将现有和未来的MPI文档合并为每个版本的MPI标准一个文档。出于技术和历史原因这个系列从MPI-1.3开始。额外的Ballots 3和4解决了自1995年开始的勘误清单上的旧问题直到最近几年的新问题。在将所有文档MPI-1.1、MPI-2、MPI-1.1的勘误表1998年10月12日和MPI-2.1 Ballots 1–4合并成一个草案文档后为每章定义了一个章节作者和审查团队。他们清理了文档以实现一致的MPI-2.1文档。最终的MPI-2.1标准文档于2008年6月完成并在2008年9月的Dublin会议上进行了第二次投票后正式发布就在欧洲PVM/MPI’08之前。 1.5 MPI-2.2的背景 MPI-2.2是MPI-2.1标准的一个小型更新。这个版本解决了在MPI-2.1标准中没有纠正的额外错误和歧义以及对MPI-2.1的一小部分扩展这些扩展符合以下标准 任何正确的MPI-2.1程序都是正确的MPI-2.2程序。任何扩展都必须对用户有显著的好处。任何扩展都不得需要大量的实现工作。为此所有这些变化都伴随着开源实现。 MPI-2.2的讨论与MPI-3的讨论同时进行在某些情况下扩展被提议为MPI-2.2但后来被移至MPI-3。 1.6 MPI-3.0的背景 MPI-3.0 是MPI标准的一次重大更新。更新内容包括将集合操作扩展到包括非阻塞版本、扩展单边操作以及新增Fortran 2008绑定。此外已移除不建议使用的C绑定以及许多不建议使用的例程和MPI对象如MPI_UB数据类型。任何不使用这些已移除MPI例程或对象的有效MPI-2.2程序都是有效的MPI-3.0程序。 1.7 MPI-3.1的背景 MPI-3.1是MPI标准的一个小更新。大部分更新是对标准的修正和澄清特别是对Fortran绑定部分。新增的函数包括以便于移植的方式操作MPI_Aint值的例程、非阻塞集合I/O例程以及用于获取MPI_T性能和控制变量的名称索引值的例程。还新增了一个通用索引。任何有效的MPI-3.0程序都是有效的MPI-3.1程序。 1.8 MPI-4.0的背景 MPI-4.0 是 MPI 标准的一次重大更新。最大的变化是添加了许多例程的大计数版本以解决使用 int 或 INTEGER 作为计数参数的限制添加了持久集合、分区通信、初始化 MPI 的替代方式、应用程序信息断言并改进了错误处理的定义。此外还有许多较小的改进和修正。除了第 18 章列出的语义变化外任何有效的 MPI-3.1 程序都是有效的 MPI-4.0 程序。 1.9 MPI-4.1的背景 MPI-4.1是MPI标准的一个小更新。它主要包含对MPI-4.0文档的修正和澄清。其中几个例程、属性键MPI_HOST以及mpif.h Fortran包含文件已经被弃用。一个新的例程提供了一种查询MPI程序运行硬件的方式。任何有效的MPI-4.0程序都是一个有效的MPI-4.1程序除了在第18章列出的语义更改。 1.10 谁应用使用这个标准 这个标准旨在供所有希望在Fortran和C以及通过C访问C绑定中编写可移植消息传递程序的人使用。这包括个人应用程序程序员、设计用于并行计算机的软件开发人员以及环境和工具的创建者。为了吸引这么广泛的受众群体该标准必须为基本用户提供简单易用的接口同时不在语义上排除高性能消息传递操作这些操作可在先进计算机上使用。 1.11 什么平台是实现的目标 消息传递范式的吸引力部分源于其广泛的可移植性。以这种方式表达的程序可以在分布式存储多处理器、工作站网络以及这些的组合上运行。此外包括多核处理器和混合架构在内的共享内存实现也是可能的。这种范式不会被合并共享和分布式内存视图的架构或网络速度的增加所淘汰。因此在各种机器上实现这个标准都是可能且有用的包括由通信网络连接的其他机器的集合构成的“机器”无论是并行的还是非并行的。 这个接口适用于完全通用的MIMDMultiple Instruction, Multiple Data程序的使用也适用于以SPMDSingle Program, Multiple Data更受限制的风格编写的程序。MPI提供了许多旨在提高在具有专门的处理器间通信硬件的可扩展并行计算机上性能的特性。因此我们预期在这些机器上将提供本地的、高性能的MPI实现。与此同时在标准Unix处理器间通信协议上实现MPI将为工作站集群和异构工作站网络提供可移植性。 1.12 这个标准包括什么 标准包括 点对点通信分区通信数据类型(Datatypes)集合操作进程组通信上下文MPI进程的虚拟拓扑环境管理和查询信息对象进程初始化、创建和管理单边通信外部接口并行文件I/O工具支持Fortran和C的语言绑定以及在辅助文档中的其他主题。 1.13 Side-documents 附带文档 附带文档扩展和/或修改了本文档中涵盖的特性、语义、语言绑定和其他方面。附带文档不得修改MPI标准中定义的任何方面除非提供了明确允许这些偏差的机制。执行未明确启用MPI标准偏差的程序将符合MPI标准即使使用实现了修改任何方面的附带文档的MPI实现。 每个附带文档都有一个独立于MPI标准版本和其他附带文档的版本方案。所有附带文档都规定与MPI标准版本的兼容性和互操作性并且可能定义与其他附带文档的特性和语义的互操作性。附带文档不需要提供对所有MPI概念的完整覆盖但必须记录哪些MPI概念受到影响。 符合的实现不需要遵守任何附带文档。然而如果声称符合特定版本的附带文档实现必须遵守整个附带文档。附带文档将在与MPI标准相同的位置找到1。 1.14 本文件的结构 以下是本文档中剩余章节的列表以及每个章节的简要描述 第2章MPI术语和约定解释了MPI文档中使用的符号术语和约定。第3章点对点通信定义了MPI的基本、成对通信子集。这里包括发送和接收操作以及许多旨在使基本通信功能强大高效的相关函数。第4章分区点对点通信定义了在MPI中执行分区通信的方法。分区通信允许从MPI进程中的多个参与者例如线程或任务向单个消息中进行多次数据贡献。第5章数据类型定义了描述任何数据布局的方法例如结构体数组。第6章集合通信定义了进程组的集合通信操作。这些操作的一些著名例子包括进程组上的屏障和广播不一定是所有进程。第7章进程组、上下文、通信子和缓存展示了如何形成和操作进程组如何获取唯一的通信上下文以及如何将这两者绑定到通信子中。第8章MPI进程的虚拟拓扑解释了一组旨在帮助将MPI进程组线性有序集合映射到更丰富的拓扑结构如多维网格的实用函数。第9章MPI环境管理解释了程序员如何管理和查询当前MPI环境。这些函数对于编写正确、健壮的程序至关重要尤其对于构建高度可移植的消息传递程序非常重要。第10章信息对象定义了一个不透明对象用作多个MPI例程的输入。第11章进程初始化、创建和管理定义了几种MPI初始化、进程创建和进程管理方法同时对执行环境施加最小限制。第12章单边通信定义了可以由单个进程完成的通信例程。这些例程包括共享内存操作put/get和远程累积操作。第1章3外部接口定义了旨在允许开发人员在MPI之上构建层次的例程。第14章输入/输出定义了MPI对并行I/O的支持。第15章工具支持涵盖了允许调试器、性能分析器和其他工具获取有关MPI进程操作的数据的接口。第16章已弃用接口描述了被保留供参考但不建议使用的例程。因为它们可能在未来的标准版本中被删除。第17章已移除接口描述了从MPI中移除的例程和构造。第18章语义变化和警告描述了与以前版本的MPI相比的语义变化。第19章语言绑定讨论了Fortran相关问题并描述了C和Fortran之间的语言互操作性方面。 附录包括附录A语言绑定摘要提供了所有MPI函数、常量和类型的C和Fortran特定语法。附录B变更日志总结了自上一版本以来的一些变化。几个索引页面显示了通用术语和定义、示例、常量和预定义句柄的位置、C和Fortran类型的声明、回调例程原型以及所有MPI函数。 MPI提供了各种接口来促进不同MPI实现之间的互操作性。其中包括MPI I/O的规范数据表示以及MPI_PACK_EXTERNAL和MPI_UNPACK_EXTERNAL的规范。定义实际绑定这些接口以实现互操作性的工作超出了本文档的范围。另外还有一份单独的文档记录了在MPI-2开发过程中MPI论坛讨论过的但未包含在MPI标准中的具有价值的想法。这些内容包含在“开发日志”(JOD)中旨在记录这些想法和讨论。JOD可以在https://www.mpi-forum.org/docs 上找到。 MPI4.1文档2-MPI术语与约定 第2章 MPI术语与约定 MPI Terms and Conventions 这一章节解释了MPI文档中使用的符号术语和惯例以及其中所做的一些选择和背后的原因。 2.1 文档符号表示 Document Notation Rational. 在整个文档中对界面规范中所做设计选择的理由以这个格式(首尾包裹)进行标注。某些读者可能希望跳过这些部分而对界面设计感兴趣的读者可能会仔细阅读它们。(End of advice to Rational.) Rationale. (End of rationale.) Advice to users. 在整个文档中针对用户并且展示用法的材料以这个格式(首尾包裹)进行标注。某些读者可能希望跳过这些部分而对MPI编程感兴趣的读者可能会仔细阅读它们。(End of advice to users.) Advice to users. (End of advice to users.) Advice to implementors. 在整个文档中主要针对实现者的评论性材料以这个格式(首尾包裹)进行标注。某些读者可能希望跳过这些部分而对MPI实现感兴趣的读者可能会仔细阅读它们。(End of advice to implementors.) Advice to implementors. (End of advice to implementors.) 2.2 命名约定 在许多情况下C函数的MPI名称的形式为MPI_Class_action_subset。这种约定起源于MPI-1。从MPI-2开始尝试根据以下规则对MPI函数的名称进行标准化。 在C和Fortran的mpi_f08模块中与特定类型的MPI对象相关联的所有例程应该采用MPI_Class_action_subset的形式如果不存在子集则采用MPI_Class_action的形式。在Fortran的mpi模块和已弃用的mpif.h文件中与特定类型的MPI对象相关联的所有例程应该采用MPI_CLASS_ACTION_SUBSET的形式如果不存在子集则采用MPI_CLASS_ACTION的形式。如果例程与类无关则名称应采用MPI_Action_subset或MPI_ACTION_SUBSET的形式在C和Fortran中均适用。某些动作的名称已经标准化。特别地create表示创建一个新对象get表示获取关于对象的信息set表示设置这些信息delete表示删除信息is表示询问对象是否具有某种属性。 MPI-1过程中定义的一些MPI函数的C和Fortran名称在几种情况下违反了这些规则。最常见的例外是省略了例程中的Class名称以及在可以推断出的情况下省略了Action。 2.3 程序规范 MPI 程序使用一种与语言无关的符号表示法进行规范过程调用的参数被标记为 IN、OUT 或 INOUT。它们的含义如下 IN程序调用可以使用输入值但在调用执行期间不会从调用者的角度更新参数 OUT程序调用可以更新参数但不使用其输入值 INOUT程序调用可以同时使用和更新参数。 特殊情况是如果参数是一个不透明对象的句柄这些术语在第2.5.1节中有定义并且该对象在过程调用中被更新则该参数标记为INOUT或OUT。即使句柄本身没有被修改我们也使用INOUT或OUT属性来表示句柄所引用的内容被更新了。 Rationale. MPI的定义尽可能避免使用INOUT参数因为这种使用方式容易出错特别是对于标量参数而言。 (End of rationale.) MPI对IN、OUT和INOUT的使用旨在告知用户如何使用参数但并没有提供一个严格的分类可以直接转换为所有语言绑定例如Fortran 90绑定中的INTENT或C绑定中的const。例如“常量”MPI_BOTTOM通常可以传递给OUT缓冲区参数。类似地MPI_STATUS_IGNORE可以作为OUT状态参数传递。 MPI函数中常见的一种情况是一个参数在某些进程中用作IN在其他进程中用作OUT。这样的参数在语法上是一个INOUT参数并被标记为这样尽管在语义上在单个进程中它不会在一次调用中同时用于输入和输出。 另一个常见情况是当某些进程只需要某个参数值时当参数在某个进程中不重要时可以传递任意值作为参数。 除非另有说明类型为OUT或INOUT的参数不能与传递给MPI过程的任何其他参数别名。下面是一个C中参数别名的示例。如果我们定义一个C过程如下所示 void copyIntBuffer ( int *pin, int *pout, int len) { int i;for (i0; ilen; i) *pout *pin; }以下代码片段中对它的调用存在参数别名。 int a [10]; copyIntBuffer (a, a3, 7);C语言允许这样使用但MPI过程的这种用法是禁止的除非另有规定。请注意Fortran禁止参数的别名使用。 所有MPI函数首先以与语言无关的符号表示进行规定。紧随其后是语言相关的绑定 ISO C版本的函数。与USE mpi_f08一起使用的Fortran版本。使用USE mpi或已弃用的INCLUDE mpif.h’的相同函数的Fortran版本。 一些MPI过程为特定语言支持提供了两个接口参见第2.5.6节和第2.5.8节。 一个例外是第15.3节“MPI工具信息接口”该节仅提供ISO C接口。 此文档中的“Fortran”指的是Fortran 90或更高版本请参阅第2.6节。 在本标准中词语“函数function”、“例程routine”、“过程procedure”、“过程调用procedure call”和“调用call”通常被用作同义词。 2.4 Semantic Terms 在讨论MPI过程时使用以下语义术语。术语message data buffer指的是通信过程中使用的发送/接收缓冲区。术语file data buffer指的是MPI I/O过程中使用的数据缓冲区。在本节中我们使用术语data buffer具体指的是消息数据缓冲区还是文件数据缓冲区取决于MPI过程。附录A.2显示了本节中定义的术语如何适用于所有与操作相关的MPI过程。 2.4.1 MPI操作 MPI Operation MPI操作MPI操作是由MPI库执行的一系列步骤用于建立和启用数据传输和/或同步。它包括四个阶段初始化、启动、完成和释放并且实现为一组一个或多个MPI过程详见第2.4.2节。 初始化initialization将参数列表传递给操作但不传递数据缓冲区的内容如果有。操作的规范可能规定在操作被释放之前数组参数不得更改。启动Starting将数据缓冲区如果有的控制权交给关联的操作。请注意初始initiation指的是初始化initialization和启动starting阶段的组合。完成返回数据缓冲区的内容的控制权并指示已更新输出缓冲区和参数如果有。 请注意当实现完成阶段的MPI过程返回时MPI操作已完成。释放返回剩余参数列表的控制权例如数据缓冲区地址和数组参数。 图 2.1: 阻塞操作的状态转移示意图 图 2.2: 非阻塞操作的状态转移示意图 图 2.3: 持久化(persistent)操作的状态转移示意图 MPI操作可以以阻塞、非阻塞和持久化的形式之一或多个形式提供。 阻塞操作对于阻塞操作所有四个阶段都在单个过程调用中组合如图2.1所示并在第2.4.2节中定义。 非阻塞操作对于非阻塞操作初始化和启动阶段合并为单个非阻塞过程调用完成和释放阶段合并为单独的、单个过程调用可以是阻塞的也可以是非阻塞的如图2.2所示并在第2.4.2节中定义。 持久化操作对于持久化操作每个阶段都有单独的过程如图2.3所示并在第2.4.2节中定义。每个过程可以是阻塞的也可以是非阻塞的。 对于分区发送操作需要额外调用每个分区的发送缓冲区以完成启动阶段参见第4.2.1节。对于分区接收操作在操作完成之前用户可以在验证已经到达后访问输出缓冲区的分区参见第4.2.2节。 这四个阶段导致了操作状态的初始化、启动、完成和释放。启动的(started)操作也称为活动的(active)而初始化和完成状态也称为非活动的(inactive)。 活动的(active)通信和I/O操作也称为待处理的(pending)操作。请注意待处理的操作可以是已开始但尚未完成即使请求句柄已被释放的非阻塞或持续操作也可以是尚未完成的阻塞操作例如等待接收消息的接收操作。 MPI操作还可以是集合的collective或非集合的noncollective。 集合操作一组相关操作每个MPI进程在一个组或多个MPI进程的组中执行一个操作。对于集合操作完成阶段可能在组中的所有进程开始操作之前完成也可能不会。 集合MPI操作也可以作为阻塞、非阻塞或持久操作提供。 非集合操作非集合noncollective操作被定义为not collective操作。 许多MPI操作需要在多个MPI进程中协调活动这种操作的语义要求在操作转换到完全操作状态之前必须启动一个或多个其他特定的语义相关操作。例如接收操作需要在接收完成之前启动一个相关的发送操作或者一个集合操作在所有相应组的MPI进程中启动这些操作之前可能不会完成。 Enabled: 当在特定的MPI进程中启动了所有特定语义相关的操作以确保在该MPI进程中完成时MPI操作就处于启用状态。 Rationale. MPI实现可以包含优化例如自动缓冲允许MPI操作在启用之前完成。(End of rationale.) 有些MPI操作是事先启用的(priori enabled)即它们不需要任何其他特定语义相关的操作来完成。例如一个带缓冲的发送操作可以独立于相关的接收操作而完成。 一旦MPI操作被启用该操作必须最终完成。一个操作在启动之前可能已经被启用。例如如果一个接收操作在匹配的发送操作启动之后启动则该接收操作已经被启用。 Rationale. 操作A的enabled的定义是不对称的enabled包括所有特定的语义相关操作 A i ′ A^′_i Ai′​已经开始以确保完成但不包括操作A本身已经开始。 示例 当相关的发送操作已经开始时receive被启用。标准模式send在相关的receive已经开始时被启用。如果MPI实现选择使用内部缓冲区则send操作可能在启用之前已经完成即receive操作已经开始。同步模式的send操作在相关的receive操作已经开始时被启用并且在启用之前不能完成。缓冲(buffered)模式的send操作是事先启用的。就绪(ready)模式的send操作只有在已经启用时才能开始即相关的receive操作已经开始。对于集合的广播特定MPI进程上的操作仅在组中所有其他MPI进程已经开始相关广播操作时才被启用。 具体地说对于构成可能同步的集合操作的一组MPI进程上的相关操作对于特定MPI进程p上的操作当组中所有其他MPI进程pi ! p已经开始其相关操作时该操作被启用而p上的操作不必已经开始。 (End of rationale.) MPI4.1文档3-MPI过程与MPI数据类型 2.4.2 MPI过程 MPI Procudures 所有MPI过程可以分为本地过程和非本地过程定义如下 非本地(nonlocal)过程如果在执行过程中返回可能需要调用另一个特定的与语义相关的MPI过程来在另一个MPI进程上执行则该MPI过程被称为非本地过程。 本地过程如果MPI过程不是非本地过程则称其为本地过程。 一个MPI操作实现为一组一个或多个MPI过程。MPI操作相关的过程至少实现了MPI操作的一个阶段的一部分如2.4.1节所述。MPI操作相关的过程还可以实现一个或多个MPI操作的一个或多个阶段。在某些情况下可能需要多个MPI操作相关的过程来实现一个单独的阶段。 还有其他一些MPI过程不实现任何MPI操作的阶段。 MPI操作相关的过程的语义使用两个正交独立的概念描述完整性取决于包含哪些阶段和本地性。这些过程可以是不完整的、完成的、释放的或者完成和释放的取决于过程返回时相关操作的状态。 此外所有这些过程都可以描述为阻塞的或非阻塞的但后两个术语是指完整性和本地性概念的组合。另外所有MPI操作相关的过程都可以是集合的或非集合的。 以下是与MPI操作相关的过程的属性 初始化(Initialization)过程如果从该过程返回则表示关联操作已完成初始化阶段这意味着用户已将参数列表的控制但不是数据缓冲区的内容移交给了MPI。用户仍然被允许读取或修改数据缓冲区的内容。如果初始化过程不同时也是关联操作的释放过程见下文则用户不得释放数据缓冲区或修改数组参数。 启动(starting)过程如果从该过程返回则表示关联操作已完成启动阶段这意味着用户已将数据缓冲区的控制移交给了MPI。如果启动过程不同时也是关联操作的完成过程见下文则用户不得修改输入数据缓冲区或读取输出数据缓冲区。 初始(Initiation)过程如果从该过程返回则表示初始化和启动阶段均已完成这意味着整个参数列表的控制权已移交给了MPI。 完成(Completing)过程如果从过程返回则该MPI过程被称为完成过程这意味着至少有一个关联操作已经完成了其完成阶段这意味着用户可以依赖输出数据缓冲区的内容并修改这些操作的输入和输出数据缓冲区的内容。如果完成过程不是释放过程见下文则用户不允许释放数据缓冲区或修改数组参数。 不完成(Incomplete)过程如果它不是完成过程则该MPI过程被称为不完成过程。 释放(Freeing)过程如果从过程返回则该MPI过程是释放过程这意味着至少有一个关联操作已经完成了其释放阶段这意味着用户可以重新使用初始化关联操作时指定的所有参数。 非阻塞过程如果它是不完整的并且是本地的则该MPI过程是非阻塞的。 阻塞过程如果它不是非阻塞的则该MPI过程是阻塞的。 Advice to users. MPI程序中与操作相关的MPI过程大多数情况下是不完全的程序是局部的而完全的程序是非局部的。在定义的地方标注了例外情况。在许多情况下将I作为不完全和即时的缩写字母前缀标记过程名称中的非阻塞过程。 以下是一些分类示例。 非阻塞过程 不完全且本地MPI_ISEND、MPI_IRECV、MPI_IBCAST、MPI_IMPROBE、MPI_SEND_INIT、MPI_RECV_INIT等。 阻塞过程 完全且非本地MPI_SEND、MPI_RECV、MPI_BCAST等。不完成且非本地MPI_MPROBE、MPI_BCAST_INIT等MPI_FILE_{READ|WRITE}_{AT_ALL|ALL|ORDERED}_BEGIN。完全且本地MPI_BSEND、MPI_RSEND、MPI_MRECV。 不是MPI操作相关的MPI过程 MPI_COMM_RANK、MPI_WTIME、MPI_PROBE、MPI_IPROBE等。 (End of advice to users.) 集合过程如果MPI进程组或组中的所有进程需要调用过程则该MPI过程是集合的。 对于同一进程组的集合操作的初始化过程必须由进程组的所有成员按相同顺序执行。 MPI集合过程是同步的如果关联的MPI进程组或组中的所有进程调用了相应的匹配MPI过程则它只会在所有进程都调用了适当的匹配MPI过程后返回。对于非阻塞集合操作的启动过程和持久集合操作的起始过程是本地的并且不会同步。对于其他集合操作的过程例如阻塞集合操作的过程和持久集合操作的初始化过程可能会同步也可能不会同步。 Advice to users. 当关联进程组中没有可能对所有其他进程进行相应调用时调用任何同步函数都是错误的。当关联组中所有其他进程没有可能启动相应操作时等待任何集合操作完成也是错误的。(End of advice to users.) 非集合过程非集合过程被定义为不是集合的过程。 局部和非局部MPI过程的定义也可以应用于特定的过程调用或在某些约束条件下的过程调用。例如发生在相关发送操作已经开始之后的完成接收过程的调用可能被描述为本地的即使没有约束的完成接收过程是非本地的。更普遍地发生在操作已经启用之后的任何完成过程的调用都是本地的即使没有约束的完成过程是非本地的。另一个例子使用大小为一的进程组进行阻塞集合过程调用是本地的即使没有约束的阻塞集合过程是非本地的。 2.4.3 MPI数据类型 MPI Datatypes 数据类型可以分为以下几种类型 预定义的predifined预定义数据类型是指具有预定义常量名称的数据类型如MPI_INT、MPI_FLOAT_INT或MPI_PACKED或者使用MPI_TYPE_CREATE_F90_INTEGER、MPI_TYPE_CREATE_F90_REAL或MPI_TYPE_CREATE_F90_COMPLEX构造的数据类型。前者是具有名称的而后者是无名称的。 派生的derived任何不是预定义的数据类型都属于派生数据类型。 可移植的portable如果一个数据类型是预定义数据类型或者它是从可移植数据类型派生而来并且仅使用了MPI_TYPE_CONTIGUOUS、MPI_TYPE_VECTOR、MPI_TYPE_INDEXED、MPI_TYPE_CREATE_INDEXED_BLOCK、MPI_TYPE_CREATE_SUBARRAY、MPI_TYPE_DUP和MPI_TYPE_CREATE_DARRAY这些类型构造器则该数据类型是可移植的。这样的数据类型是可移植的因为数据类型中所有的位移都是以一个预定义数据类型的范围为单位的。因此如果这样的数据类型适合一个内存中的数据布局那么如果使用相同的声明在另一个内存中对应的数据布局也将适合即使这两个系统具有不同的架构。另一方面如果一个数据类型是使用MPI_TYPE_CREATE_HINDEXED、MPI_TYPE_CREATE_HINDEXED_BLOCK、MPI_TYPE_CREATE_HVECTOR或MPI_TYPE_CREATE_STRUCT构造的那么该数据类型包含显式的字节位移例如提供填充以满足对齐限制。如果这些位移适合一个内存中的数据布局但在另一个运行在具有不同架构处理器上的进程的数据布局中使用那么这些位移可能不会被正确选择。 等价的equivalent如果两个数据类型看起来是通过相同的一系列调用和参数创建的并且因此具有相同的类型映射则它们是等价的。两个等价的数据类型不一定具有相同的缓存属性或相同的名称。 MPI4.1文档4-MPI数据类型 MPI DataTypes 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.) MPI4.1文档5-语言绑定、进程、错误处理、progress和实现 2.6 语言绑定 Language Binding 这个部分定义了MPI语言绑定的规则特别是对Fortran和ISO C的规定。请注意ANSI C已被ISO C取代。这里定义了各种对象表示方式以及用于表达该标准的命名约定。实际的调用序列在其他地方定义。 MPI绑定适用于Fortran 90或更新版本尽管最初设计是为了在Fortran 77环境中使用。使用mpi_f08模块时还需要两个新的Fortran特性即假定类型即TYPE(*)和假定rank即DIMENSION(…)详见第2.5.5节。 由于“PARAMETER”是Fortran语言中的关键字我们使用“argument”一词来表示子例程的参数。这些参数在C中通常称为参数但我们期望C程序员能理解“argument”这个词在C中没有具体的含义从而避免对Fortran程序员造成不必要的困惑。 由于Fortran是不区分大小写的链接器在解析Fortran名称时可能会使用小写或大写。使用区分大小写语言的用户应避免使用“MPI_”和“PMPI_”形式的任何前缀其中任何字母都可以是大写或小写。 2.6.1 已弃用和移除的接口 Deprecated and Removed Interfaces 一些章节提到了被弃用或替换的MPI构造。这些构造仍然是MPI标准的一部分如第16章所述但建议用户不要继续使用因为较新版本的MPI提供了更好的解决方案。例如MPI-1函数的Fortran绑定使用INTEGER作为地址参数这与C绑定不一致在具有32位INTEGER和64位地址的机器上会导致问题。在MPI-2中这些函数被赋予了新名称并为地址参数提供了新的绑定。使用旧函数被声明为不推荐使用。为了保持一致性在这里和其他几个情况下即使新函数等效于旧函数也提供了新的C函数。旧名称已被弃用。 一些之前弃用的构造现在已被移除如第17章所述。它们可能仍由实现提供以保持向后兼容性但不是必需的。 表2.1列出了所有被弃用和移除的构造列表。请注意此列表中包括了一些C typedefs和Fortran子程序名称它们是回调函数的类型。 2.6.2 Fortran绑定事务 Fortran Binding Issues MPI-1.1最初提供了对Fortran 77的绑定。这些绑定仍然保留但现在在Fortran 90标准的背景下进行解释。MPI仍然可以与大多数Fortran 77编译器一起使用如下所述。当使用术语“Fortran”时指的是Fortran 90或更新版本如果使用了mpi_f08模块则指的是Fortran 2008与TS 29113后者现在已成为Fortran 2018及更高版本的组成部分。 所有Fortran MPI名称都具有MPI_前缀。虽然Fortran不区分大小写但如果使用了mpi_f08模块则MPI_前缀后的第一个字符是大写其余字符均为小写。如果没有使用mpi_f08模块则所有字符均为大写。程序不能声明以MPI_前缀开头的名称例如变量、子程序、函数、参数、派生类型、抽象接口或模块。为了避免与分析接口冲突程序还必须避免具有PMPI_前缀的子程序和函数。这是为了避免可能的名称冲突。 所有MPI Fortran子程序的最后一个参数是错误代码。使用USE mpi_f08时此最后一个参数声明为可选的但用户定义的回调函数例如COMM_COPY_ATTR_FUNCTION及其预定义的回调例如MPI_COMM_NULL_COPY_FN除外。一些作为函数的MPI操作没有错误代码参数。成功完成的错误代码值为MPI_SUCCESS。其他错误代码是实现相关的请参阅第9章和附录A中的错误代码。 表示字符串最大长度的常量在Fortran中比在C中小一个如第19.3.9节所述。 在Fortran中句柄表示为INTEGER或者使用mpi_f08模块的BIND©派生类型请参阅第2.5.1节。二进制变量的类型为LOGICAL。 数组参数的索引从1开始。 旧版MPI Fortran绑定——使用mpi和不推荐使用的mpif.h——在几个方面与Fortran标准不一致。这些不一致性如寄存器优化问题对用户代码有影响详细讨论见第19.1.16节。 在Fortran中仅在使用较新的MPI Fortran绑定USE mpi_f08时才支持大计数和位移。为了提高可读性所有Fortran大计数过程声明都用注释“(_c)”标记。 表 2.1 已弃用和移除的构造请自行去网页查看 2.6.3 C绑定事务 C Binding Issues 我们使用ISO C声明格式。所有MPI名称都有MPI_前缀定义的常量均为全大写而定义的类型和函数在前缀后有一个大写字母。程序不得声明任何以MPI_为前缀的名称标识符例如变量、函数、常量、类型或宏其中任何一个字母都可以是大写或小写。为了支持性能分析接口程序不得声明以PMPI_为前缀的名称的函数其中任何一个字母都可以是大写或小写。 对于命名常量、函数原型和类型定义必须提供一个名为mpi.h的包含文件。 几乎所有C函数都会返回一个错误代码。成功的返回值将是MPI_SUCCESS但在失败后引发的错误代码是与实现相关的。 对于每个类别的不透明对象的句柄都提供了类型声明。 数组参数从零开始索引。 逻辑标志是整数值为0表示“false”非零值表示“true”。 选择参数是void*类型的指针。 2.6.4 函数和宏 实现允许将MPI_AINT_ADD、PMPI_AINT_ADD、MPI_AINT_DIFF和PMPI_AINT_DIFF作为宏在C语言中实现而不允许实现其他内容。 Advice to implementors. 实现者应该记录哪些例程被实现为宏。(End of advice to implementors.) Advice to users. 如果这些例程被实现为宏它们将无法与MPI性能分析接口一起工作。(End of advice to users.) 2.7 进程 Processes MPI程序由执行自己代码的自治进程组成采用MIMD多指令多数据风格。每个进程执行的代码不必相同。进程通过调用MPI通信原语进行通信。通常情况下每个进程在自己的地址空间中执行尽管也可以实现共享内存的MPI。 该文档规定了并行程序的行为假设仅使用MPI调用。MPI程序与其他可能的通信、I/O和进程管理方式的交互未予规定。除非在标准规范中另有规定否则MPI不对其与提供类似或等效功能的外部机制的交互结果提出要求。这包括但不限于与外部进程控制机制、共享和远程内存访问、文件系统访问和控制、进程间通信、进程信号和终端I/O的交互。高质量的实现应努力使这些交互的结果对用户直观并在必要时尽可能地记录限制。 Advice to implementors. 对于支持MPI中附加机制的功能的实现预期应该记录这些机制如何与MPI进行交互。(End of advice to implementors.) MPI和线程的交互在第11.6节中定义。 如果可以在MPI进程之间共享一段内存即使通过加载/存储访问使一段内存共享内存段同时从所有这些MPI进程访问则MPI进程驻留在同一共享内存域中。 对于属于多个共享内存域的进程组创建属于同一共享内存域的进程子组在第7.4.2节中定义。 2.8 错误处理 Error Handling MPI提供给用户可靠的消息传输。发送的消息始终正确接收用户无需检查传输错误、超时或其他错误条件。换句话说MPI不提供处理通信系统传输失败的机制。如果MPI实现建立在不可靠的底层机制上那么MPI子系统的实现者的任务是保护用户免受这种不可靠性并仅反映不可恢复的传输失败。尽可能地这些失败将作为相关通信调用中的错误反映出来。 同样地MPI本身不提供处理MPI进程失败的机制即当MPI进程意外并永久停止通信时例如软件或硬件崩溃导致MPI进程意外终止。 当然MPI程序仍然可能有错误。当使用不正确的参数进行MPI调用时发送操作中的不存在的目标接收操作中的缓冲区太小等程序错误可能会发生。这种类型的错误在任何实现中都会发生。此外资源错误可能会在程序超出可用系统资源的数量时发生挂起消息数量、系统缓冲区等。这种类型的错误发生取决于系统中可用资源的数量和资源分配机制的使用情况这可能因系统而异。高质量的实现将为重要资源提供宽松的限制以减轻这种可移植性问题。 在C和Fortran中几乎所有MPI调用都返回一个代码指示操作成功完成。在可能的情况下如果在调用期间发生错误则MPI调用会返回一个错误代码。默认情况下在MPI库的执行期间检测到错误将导致并行计算中止除了文件操作。然而MPI提供了机制让用户更改此默认行为并处理可恢复的错误。用户可以指定没有错误是致命的并自行处理MPI调用返回的错误代码。此外用户可以提供用户定义的错误处理程序当MPI调用异常返回时将调用这些程序。MPI的错误处理设施在第9.3节中进行了描述。 MPI调用返回有意义的错误代码时受到多种因素的限制。当出现错误时MPI可能无法检测到某些错误其他错误在正常执行模式下可能成本过高以至于无法检测到一些故障例如内存故障可能会破坏MPI库及其输出的状态最后一些错误可能是“灾难性的”可能会阻止MPI将控制权返回给调用者。 此外一些错误可能在不涉及可以获取关联错误处理程序的MPI对象的操作中被检测到。错误处理程序的关联在第9.3节中进一步描述。在这种情况下这些错误将在使用世界模型时参见第11.2节引发在通信器MPI_COMM_SELF上。当MPI_COMM_SELF未初始化即在MPI_INIT / MPI_INIT_THREAD之前在MPI_FINALIZE之后或者仅使用Sessions模型时时错误将引发初始错误处理程序在启动操作期间设置请参阅11.8.4节。Sessions模型在第11.3节中描述。 最后一些错误可能在关联操作在本地完成后被检测到。这种情况的一个示例是由于异步通信的性质而引起的MPI调用可能会启动在调用返回后继续异步进行的操作。因此操作可能会以指示成功完成的代码返回但随后可能引发错误。如果有后续调用与同一操作相关例如验证异步操作是否已完成的调用那么与此调用相关联的错误参数将用于指示错误的性质。在少数情况下错误可能会在与操作相关的所有调用都已返回之后发生因此无法使用错误值来指示错误的性质例如在发送具有准备模式的接收器中的错误程序时。 此文档不会指定发生错误的MPI调用后计算的状态。期望的行为是返回相关的错误代码并将错误的影响尽可能局限在最大范围内。例如极度希望错误的接收调用不会导致接收方内存的任何部分被覆盖超出接收消息指定区域的范围。 在支持在此处定义为错误的MPI调用方面实现可以超越此文档。例如MPI在匹配发送和接收操作之间指定了严格的类型匹配规则发送浮点变量并接收整数是错误的。实现可以超越这些类型匹配规则并在此类情况下提供自动类型转换。对于这种不符合规范行为生成警告将是有帮助的。 MPI定义了一种让用户创建新错误代码的方法如第9.5节所述。 2.9 Progress MPI通信操作或并行I/O模式通常包括在一个或多个MPI进程中执行的几个相关操作。例如点对点通信中一个MPI进程执行发送操作另一个或同一个MPI进程执行接收操作或者一个组中的所有MPI进程执行集合操作。 在每个MPI进程中通信或并行I/O模式的部分在属于该操作的MPI过程调用中执行而其他部分则是分离的MPI活动即它们可以在额外的进展线程中执行转移到网络接口控制器NIC或者在与给定通信或并行I/O模式语义不相关的其他MPI过程调用中执行。 如果MPI过程调用被阻塞那么它会延迟返回直到另一个MPI进程中发生了特定的活动或状态变化。 一个非本地的MPI过程调用它延迟返回直到另一个MPI进程上的某个特定语义相关的MPI调用完成或者一个本地的MPI过程调用它延迟返回直到另一个MPI进程上的某个不特定的MPI调用导致该进程的特定状态变化或者一个MPI终止过程MPI_FINALIZE或MPI_SESSION_FINALIZE它延迟返回或退出因为这个MPI终止必须保证在调用MPI进程中与该MPI终止调用相关的所有分离的MPI活动在这个MPI终止完成之前被执行。注意MPI终止过程可能在最终化之前执行属性删除回调函数参见第11.2.4节这些回调函数可能会生成额外的分离MPI活动。 非本地阻塞 MPI 过程调用的一些示例 MPI_SSEND 延迟返回直到目标 MPI 进程启动匹配的接收操作例如通过调用 MPI_RECV 或 MPI_IRECV。MPI_RECV 延迟返回直到源 MPI 进程启动匹配的发送操作例如通过调用 MPI_SEND 或 MPI_ISEND。 本地阻塞 MPI 过程调用的一些示例 如果消息数据无法完全缓冲MPI_RSEND 延迟返回直到目标 MPI 进程接收了无法缓冲的消息数据部分这可能需要一个或多个不特定的 MPI 过程调用在目标 MPI 进程中执行。如果消息在发送 MPI 进程处被缓冲例如使用 MPI_BSENDMPI_RECV 延迟返回直到消息被接收这可能需要一个或多个不特定的 MPI 过程调用在发送 MPI 进程中发送缓冲数据。 所有 MPI 进程都需要保证progress即所有分离的 MPI 活动最终会执行。此保证需要在以下情况下提供 阻塞的 MPI 过程以及重复调用的 MPI 测试过程见下文返回 flagfalse。 进度必须独立于MPI活动是否属于特定会话或世界模型参见第11.2节和11.3节进行提供。实现此保证的其他方法也是可能的和允许的例如专用进度线程或将其卸载到网络接口控制器NIC。 MPI测试程序包括MPI_TEST、MPI_TESTANY、MPI_TESTALL、MPI_TESTSOME、MPI_IPROBE、MPI_IMPROBE、MPI_REQUEST_GET_STATUS、MPI_WIN_TEST和MPI_PARRIVED。 如果所有本地程序都独立于其他MPI进程中的MPI过程调用与操作相关或不相关而返回则MPI实现将提供强进度。如果MPI实现没有提供强进度则提供弱进度。 Advice to users. MPI操作的性能可能会受到进展类型的影响。一个正确的MPI应用程序必须在假设仅提供弱进展的情况下编写。每个在弱进展下正确的MPI应用程序如果提供了强进展都将被正确执行。此外MPI标准的设计是这样的如果在提供强进展的情况下正确性成立那么即使实现仅提供弱进展也应该正确执行。(End of advice to users.) Rationale. MPI在使用非基于MPI程序的同步方法时不能保证进展。在MPI中没有强进展的保证可能会导致死锁可以参考第2.7节和第12.7.3节中的示例12.13。(End of rationale.) 请查阅第2.4.2节中关于本地MPI过程的定义并查看总索引中所有关于进展的引用。 2.10 实现问题 Implementation Issues MPI实现可能与操作环境和系统的许多领域进行交互。虽然MPI并不要求提供任何服务如信号处理但如果这些服务可用它确实强烈建议提供这些服务的行为。这是实现跨平台可移植性的重要点前提是提供相同服务集的平台。 2.10.1 基本运行时例程的独立性 Independence of Basic Runtime Routines MPI程序要求基本语言环境中的库例程例如Fortran中的writeISO C中的printf和malloc在MPI_INIT之后并在MPI_FINALIZE之前独立运行并且它们的完成与MPI程序中其他进程的操作无关。 请注意这并不妨碍创建提供并行服务且其操作是集体的库例程。然而以下程序在ISO C环境中应该能够完成而不管MPI_COMM_WORLD的大小假设printf在执行MPI进程中可用。 int commworld_rank; MPI_Init (( void *)0 , ( void *)0); MPI_Comm_rank ( MPI_COMM_WORLD , commworld_rank ); if (commworld_rank 0) printf ( Starting program \n); MPI_Finalize ();对应的Fortran程序也应该完成。 不需要的是这些例程在被多个MPI进程调用时的具体顺序。例如MPI对以下程序的输出既不要求也不建议假设在执行MPI进程中可以进行I/O操作。 MPI_Comm_rank ( MPI_COMM_WORLD, commworld_rank); printf ( Output from MPI process where commworld_rank %d\n, commworld_rank);此外由于资源耗尽或其他错误而导致的调用失败不被视为违反此处的要求然而它们必须完成只是不必成功完成。 2.10.2 与信号的交互 Interaction with Signals MPI不指定进程与信号的交互并且不要求MPI是信号安全的。实现可以保留一些信号供其自身使用。要求实现文档记录使用的信号并强烈建议不要使用SIGALRM、SIGFPE或SIGIO。实现还可以禁止在信号处理程序中使用MPI调用。 在多线程环境中用户可以通过仅在不执行MPI调用的线程上捕获信号来避免信号与MPI库之间的冲突。高质量的单线程实现将是信号安全的由信号挂起的MPI调用将在处理信号后正常恢复并完成。 2.11 例子 这份文档中的示例仅用于说明目的不旨在规定标准。其中许多示例是由从MPI标准的源文件中提取示例的工具编译而成的。然而这些示例并未经过仔细检查或验证。 第三章 点对点通信 MPI进程之间的消息发送和接收是基本的MPI通信机制。基本的点对点通信操作包括发送和接收。它们的使用在示例3.1中进行了说明。 例子3.1 使用点对点通信的hello world例子 #include mpi.h int main(int argc, char *argv[]) {char message[20];int myrank;MPI_Status status;MPI_Init(argc, argv);MPI_Comm_rank(MPI_COMM_WORLD, myrank);if (myrank 0) /* 0号进程的代码 */{strcpy(message, Hello , there );MPI_Send(message, strlen(message) 1, MPI_CHAR, 1, 99,MPI_COMM_WORLD);}else if (myrank 1) /* 1号进程的代码 */{MPI_Recv(message, 20, MPI_CHAR, 0, 99, MPI_COMM_WORLD, status);printf( received :%s:\n, message);}MPI_Finalize();return 0; }在例子3.1中进程零myrank 0严格地说是‘在通信器MPI_COMM_WORLD中具有排名0的MPI进程’使用发送操作MPI_SEND向进程一发送消息。该操作指定了发送缓冲区从中取出消息数据。在上述示例中发送缓冲区包括进程零内存中包含变量消息的存储。发送操作的前三个参数指定了发送缓冲区的位置、大小和类型。发送的消息将包含此变量的13个字符。此外发送操作将一个信封与消息关联。该信封指定了消息的目的地并包含可由接收操作用来选择特定消息的区分信息。发送操作的最后三个参数以及发送者的排名指定了发送消息的信封。 进程一myrank 1严格地说是‘在通信器MPI_COMM_WORLD中具有排名1的MPI进程’使用接收操作MPI_RECV接收此消息。将根据其信封的值选择要接收的消息并将消息数据存储到接收缓冲区中。在上述示例中接收缓冲区包括进程一内存中包含字符串消息的存储。接收操作的前三个参数指定了接收缓冲区的位置、大小和类型。接下来的三个参数用于选择传入的消息。最后一个参数用于返回刚接收到的消息的信息。 Advice to users. 俗语常常使用“rank 0”或“process 0”这样的表述但这些表述在严格意义上是模糊的最好在使用时加上相关的上下文来说明例如在上面的情况中指明MPI通信器。(End of advice to users.) 下面的部分描述了阻塞发送和接收操作。我们讨论了发送、接收、阻塞通信语义、类型匹配要求、异构环境中的类型转换以及更一般的通信模式。接下来介绍了非阻塞通信然后是探测和取消消息、类似通道的构造和发送-接收操作最后描述了“虚拟”MPI进程MPI_PROC_NULL。 3.2 阻塞发送和接收操作 Blocking Send and Receive Operations 3.2.1 阻塞发送 阻塞发送过程的语法如下所示。 MPI_SEND(buf, count, datatype, dest, tag, comm) IN/OUT参数含义(数据类型)INbuf发送缓冲区的初始地址 (choice)INcount发送缓冲取元素的数量 (non-negative integer)INdatatype发送缓冲区元素的数据类型 (handle)INdest目的进程号 (integer)INtag消息标记 (integer)INcomm通信器 (handle) C 绑定 int MPI_Send(const void *buf, int count, MPI_Datatype datatype, int dest, int tag, MPI_Comm comm) int MPI_Send_c(const void *buf, MPI_Count count, MPI_Datatype datatype, int dest, int tag, MPI_Comm comm)Fortran 2008 binding MPI_Send(buf, count, datatype, dest, tag, comm, ierror)TYPE(*), DIMENSION(..), INTENT(IN) :: buf INTEGER, INTENT(IN) :: count, dest, tag TYPE(MPI_Datatype), INTENT(IN) :: datatype TYPE(MPI_Comm), INTENT(IN) :: comm INTEGER, OPTIONAL, INTENT(OUT) :: ierror MPI_Send(buf, count, datatype, dest, tag, comm, ierror) !(_c)TYPE(*), DIMENSION(..), INTENT(IN) :: bufINTEGER(KINDMPI_COUNT_KIND), INTENT(IN) :: countTYPE(MPI_Datatype), INTENT(IN) :: datatypeINTEGER, INTENT(IN) :: dest, tagTYPE(MPI_Comm), INTENT(IN) :: commINTEGER, OPTIONAL, INTENT(OUT) :: ierrorFortran binding MPI_SEND(BUF, COUNT, DATATYPE, DEST, TAG, COMM, IERROR)type BUF(*)INTEGER COUNT, DATATYPE, DEST, TAG, COMM, IERROR该调用的阻塞语义将在3.4节描述。 3.2.2 消息数据 Message Data MPI_SEND过程指定的发送缓冲区由地址buf处的连续的count个数据项组成数据项的类型由datatype指定。需要注意的是我们指定消息长度是按照元素的数量而不是字节的数量。前者是与机器无关的更接近应用程序级别。 消息的数据部分由count个值的序列组成每个值的类型由datatype指定。count可以为零此时消息的数据部分为空。可以为消息数据值指定的基本数据类型对应于主机语言的基本数据类型。Fortran中的可能值及其对应的Fortran类型列在表3.1中。C中的可能值及其对应的C类型列在表3.2中。 表3.1 MPI预定义数据类型和Fortran数据类型的对应 MPI数据类型Fortran数据类型MPI_INTEGERINTEGERMPI_REALREALMPI_DOUBLE_PRECISIONDOUBLE PRECISIONMPI_COMPLEXCOMPLEXMPI_LOGICALLOGICALMPI_CHARACTERCHARACTER(1)MPI_BYTEMPI_PACKED 表3.2 MPI预定义数据类型和C数据类型的对应 MPI数据类型C数据类型MPI_CHARchar (作为可打印字符处理)MPI_SHORTsigned short intMPI_INTsigned intMPI_LONGsigned long intMPI_LONG_LONG_INTsigned long long intMPI_LONG_LONG (作为同义词)signed long long intMPI_SIGNED_CHARsigned char (作为整数值处理)MPI_UNSIGNED_CHARunsigned char (作为整数值处理)MPI_UNSIGNED_SHORTunsigned short intMPI_UNSIGNEDunsigned intMPI_UNSIGNED_LONGunsigned long intMPI_UNSIGNED_LONG_LONGunsigned long long intMPI_FLOATfloatMPI_DOUBLEdoubleMPI_LONG_DOUBLElong doubleMPI_WCHARwchar_t (stddef.h中定义作为可打印字符处理)MPI_C_BOOL_BoolMPI_INT8_Tint8_tMPI_INT16_Tint16_tMPI_INT32_Tint32_tMPI_INT64_Tint64_tMPI_UINT8_Tuint8_tMPI_UINT16_Tuint16_tMPI_UINT32_Tuint32_tMPI_UINT64_Tuint64_tMPI_C_COMPLEXfloat _ComplexMPI_C_FLOAT_COMPLEX(作为同义词)float _ComplexMPI_C_DOUBLE_COMPLEXdouble _ComplexMPI_C_LONG_DOUBLE_COMPLEXlong double _ComplexMPI_BYTEMPI_PACKED 数据类型MPI_BYTE和MPI_PACKED不对应于Fortran或C数据类型。MPI_BYTE类型的值由一个字节8个二进制位组成。一个字节是无解释的与字符不同。不同的机器可能对字符有不同的表示或者可能使用多个字节来表示字符。另一方面一个字节在所有机器上具有相同的二进制值。MPI_PACKED类型的使用在5.2节中解释。 MPI要求支持这些数据类型这些数据类型与Fortran和ISO C的基本数据类型相匹配。如果主机语言具有其他数据类型则应提供额外的MPI数据类型MPI_DOUBLE_COMPLEX用于Fortran中的双精度复数声明为DOUBLE COMPLEX类型MPI_REAL2、MPI_REAL4、MPI_REAL8和MPI_REAL16用于Fortran实数分别声明为REAL*2、REAL*4、REAL*8和REAL*16类型MPI_INTEGER1、MPI_INTEGER2、MPI_INTEGER4和MPI_INTEGER8用于Fortran整数分别声明为INTEGER*1、INTEGER*2、INTEGER*4和INTEGER*8类型MPI_COMPLEX4、MPI_COMPLEX8、MPI_COMPLEX16和MPI_COMPLEX32用于Fortran中的复数分别声明为COMPLEX*4、COMPLEX*8、COMPLEX*16和COMPLEX*32类型等等。 Rationale. 设计的一个目标是将MPI实现为一个库无需额外的预处理或编译。因此不能假设通信调用对通信缓冲区中变量的数据类型有信息这些信息必须由显式参数提供。这种数据类型信息的需求将在第3.3.2节中变得清晰。 (End of rationale.) MPI_AINT、MPI_OFFSET和MPI_COUNT这些数据类型对应于MPI定义的C类型MPI_Aint、MPI_Offset和MPI_Count以及它们的Fortran等效类型INTEGER(KINDMPI_ADDRESS_KIND)、INTEGER(KINDMPI_OFFSET_KIND)和INTEGER(KINDMPI_COUNT_KIND)。这在表3.3中有描述。所有预定义的数据类型句柄都可用于所有语言绑定。有关使用这些类型进行跨语言通信的信息请参阅页面840和847的19.3.6节和19.3.10节。如果有相应的C编译器那么表3.4中的数据类型也支持C和Fortran。 表3.3: MPI预定义数据类型到C和Fortran数据类型的对应 MPI数据类型C数据类型Fortran数据类型MPI_AINTMPI_AintINTEGER(KINDMPI_ADDRESS_KIND)MPI_OFFSETMPI_OffsetINTEGER(KINDMPI_OFFSET_KIND)MPI_COUNTMPI_CountINTEGER(KINDMPI_COUNT_KIND) 请查看第840页和第847页的19.3.6和19.3.10节了解关于这些类型的跨语言通信的信息。如果有配套的C编译器那么表3.4中的数据类型也支持C和Fortran。 表3.3: MPI预定义数据类型到C数据类型的对应 MPI datatypeC datatypeMPI_CXX_BOOLboolMPI_CXX_FLOAT_COMPLEXstd::complexMPI_CXX_DOUBLE_COMPLEXstd::complexMPI_CXX_LONG_DOUBLE_COMPLEXstd::complex 3.2.3 消息信封 Message Envelope 除了数据部分之外消息还携带可以用来区分消息并有选择性地接收它们的信息。这些信息包括一定数量的字段我们统称为消息信封。这些字段是 source destination tag communicator 消息源由消息发送者的身份隐含确定。其他字段由发送过程中的参数指定。 消息的目标进程由dest参数指定。 整数型消息标签由tag参数指定。程序可以使用这个整数来区分不同类型的消息。有效标签值的范围是0到UB其中UB的值取决于实现。可以通过查询MPI_TAG_UB属性的值来获取如第9章所述。MPI要求UB不小于32767。 comm参数指定用于发送操作的通信器。通信器在第7章中有解释下面是它们的简要用法概述。 通信器指定了通信操作的通信上下文。每个通信上下文提供一个独立的“通信宇宙”消息始终在发送它们的上下文中接收而在不同上下文中发送的消息不会相互干扰。 通信器还指定了共享该通信上下文的MPI进程组。这个MPI进程组是有序的MPI进程通过它们在这个组中的等级来标识。因此dest的有效值范围是0到n-1∪{MPI_PROC_NULL}其中n是组中的MPI进程数量。如果通信器是一个跨通信器则目标由远程组中的等级来标识。参见第7章。 一个MPI进程在每个它是成员的组中可能有不同的等级。 当使用世界模型见第11.2节时MPI提供了一个预定义的通信器MPI_COMM_WORLD。它允许与所有MPI初始化后可访问的MPI进程通信MPI进程通过在MPI_COMM_WORLD组中的等级来标识。 Advice to users. 对于熟悉大多数现有通信库提供的平坦名称空间概念和单一通信上下文的用户只需在MPI初始化时使用World模型和预定义变量MPI_COMM_WORLD作为通信参数即可。这将允许与初始化时所有可用的MPI进程进行通信。 用户可以像第7章中所述那样定义新的通信器。通信器为库和模块提供了重要的封装机制。它们允许模块拥有自己独立的通信空间和自己的MPI进程编号方案。(End of advice to users.) Advice to implementors. 消息信封通常由固定长度的消息头编码。然而实际的编码是实现相关的。一些信息例如源或目的地可能是隐含的不需要在消息中显式携带。此外MPI进程可以通过相对排名、绝对ID等进行标识。(End of advice to implementors.)

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

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

相关文章

国庆模拟赛总结

2025/10/2 T1 这道题我一眼出思路呀,直接建反边然后判断一下可达性不就秒了吗,10分钟直接秒,不过有点坑,第一个点如果没出边那它就应该标记合法,这不标直接100pts->90pts,以后还是要多注意细节。还有一点很重…

深入解析:video-audio-extractor:视频转换为音频

深入解析:video-audio-extractor:视频转换为音频pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas"…

10.8 CSP-JS 模拟赛 T4. discover

思路 不难想到用数量较少的危险点来限制长方形, 进而处理正方形 现在的问题就是如何精确地刻画任意一个本质相同的长方形, 发现我们完全可以通过枚举四个危险点来刻画一个长方形 但是这样会出现大量的不合法情况\((\)即…

20251008 模拟测 总结

\(\mathcal{Preface}\) 分数 \(50+100+40+100=290\),甚至比去年低 \(15\) 分,有点受不了了。 A 题代码上挂了 \(50\) 分,C 题思维上挂了 \(60\) 分。 简称:挂了 \(50\) 分,还“挂了”\(60\) 分。 挂的最猛烈的一次…

初中学习网站大全免费哈尔滨市城乡和建设局网站

在完成了对Exchange的UM功能进行配置之后,我们要把UM的功能与Lync做集成的话还需要在Lync这边做一些配置。首先我们打开Lync前端服务器,然后打开核心组件安装目录下的Support文件夹,然后双击OcsUmUtil。打开之后我们单击加载数据,…

详细介绍:运行shell脚本时报错/bin/bash^M: 解释器错误: 没有那个文件或目录

详细介绍:运行shell脚本时报错/bin/bash^M: 解释器错误: 没有那个文件或目录pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-fam…

VuePress v2是否支持Vue2的配置?

不,VuePress v2 不支持 Vue 2 的配置和运行时。它是一个基于 Vue 3 的全新版本,与 Vue 2 完全不兼容。 以下是详细解释:❌ VuePress v1 vs v2:核心差异特性 VuePress v1 VuePress v2Vue 版本 Vue 2 ✅ Vue 3打包工…

福建省建设局网站实名制建网站的费用包括

.gitignore的使用 1、简介 .gitignore文件用于指定哪些文件或目录应该被Git忽略,即它们不会被Git跟踪和提交到版本控制中。 2、简单语法规则 1、注释:使用#符号进行注释。 2、文件和目录规则:每行一个规则,指定要忽略的文件、…

新人UP主:晓牛开发者的第一篇自我介绍博客测试发布

晓牛、开发者、程序员、开发工程师、Java、后端开发、全栈开发,热爱技术

ubuntu20.04服务器版安装中文输入法分享

1/菜鸟,学生党,旧机,安装好ubuntu20.04服务器版(主要为旧卡GTX660和CUDA11.4考虑)后,发现旧机焕发了新春,挺好用的,哈哈; 2/为了能方便使用微信,就追加了xubuntu图形界面 & wechat,看微信消息是非常的方便了,可是…

手工艺品网站模板智慧团建官网登陆入口

一、GlusterFS简介 GlusterFS 是一个开源的分布式文件系统。由存储服务器、客户端以及NFS/Samba存储网关(可选,根据需要选择使用)组成。没有元数据服务器组件,这有助于提升整个系统的性能、可靠性和稳定性 二、GlusterFS特点 2.1 扩展性和高性能 Glu…

DeCLIP

1、第一页 密集视觉预测任务受到对预定义类别的依赖的限制,限制了它们在真实世界场景中的实用性。 视觉语言模型在开放词汇任务中显示出良好前景,但它们直接应用于密集预测任务往往性能不佳。 CLIP的图像token难以有…

商城网站开发项目描述潍坊外贸建站

geojson数据结构geojson作图方法geojson与pandashttps://blog.exploratory.io/visualizing-geospatial-data-with-your-own-geojson-f96dde0f6296​blog.exploratory.io数据结构GeoJSON是用于表示地理对象的格式。 它与常规JSON不同,因为它支持几何类型,…

为什么做民宿网站wordpress 获取链接

为了进一步加强内网安全,在原有硬WAF的基础上,又在内网使用的社区版的雷池WAF,作为应用上层的软WAF。从而实现多WAF防护的架构。 经过进一步了解,发现雷池WAF的上游转发代理是基于Tengine的,所以萌生出了一个想法&…

家居企业网站建设行情企业网站建设排名官网

在软件开发过程中,项目的构建是一个不可避免的环节。而随着项目规模的增大,手动管理编译过程变得越来越繁琐。为了简化构建流程并实现跨平台支持,CMake作为一种流行的构建系统被广泛采用。本文将介绍CMakeLists.txt文件的结构,以及…

19_win11_wsl_linux_配置jdk_mvn

windows11 java Linux系统下JDK和Maven自动安装脚本:一站式Java开发环境解决方案 项目概述 在Linux系统上搭建Java开发环境一直是许多开发者的痛点。手动安装JDK和Maven不仅过程繁琐,还容易遇到环境变量配置错误、版…

南京做网站的公司排名最好看免费观看高清大全多多电影

在LBS(基于位置服务)的一些应用中,有时我们会需要计算两个用户或两个坐标点之间的距离。要解决这类问题,就要了解空间几何的概念并结合数学中在三角函数公式计算两点之间的值。本文介绍基于经度/纬度的,两个坐标点之间的距离计算,…

在AI技术唾手可得的时代,挖掘新需求成为核心竞争力——某知名CTF资源库需求洞察

该项目是一个精心整理的CTF资源集合,涵盖创建和解题所需的各类工具框架,包括取证分析、密码学、逆向工程、网络攻防等多个安全领域,为安全研究人员和CTF爱好者提供一站式资源导航。a.内容描述核心功能定位:该项目是…

计蒜客 A1108 百度地图的实时路况

怎么要微信才能注册账号/fn 要计算删掉某个点,最短路之和。容易想到,从 Floyd 的角度考虑,就是不使用那个点为中转点。 到这里想歪了,想从最短路图来考虑。 正解是,设 \(solve(l, r)\) 表示不使用 \([l, r]\) 的点…