MPI4.1文档1-MPI总览与各版本介绍

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

官方网址: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/18


MPI: A Message-Passing Interface Standard

单词表,本人常用语,不代表官方翻译

缩写/英文全称/翻译缩写/英文全称/翻译
MPIMessage-Passing Interface 消息传递接口collective集合
communicator通信器one-sided单边
non-blocking非阻塞

前言

这份文档描述了消息传递接口(MPI)标准,版本为4.1。 MPI标准包括点对点消息传递、集合通信、组和通信器概念、进程拓扑、环境管理、进程创建和管理、单边通信、扩展集合操作、外部接口、输入输出、一些杂项主题以及多种工具接口。C语言和Fortran语言的语言绑定已定义。

历史上,该标准的演变如下:

  • MPI-1.0(1994年5月5日):首次发布。
  • MPI-1.1(1995年6月12日):小更新和错误修复。
  • MPI-1.2(1997年7月18日):几处澄清和补充。
  • MPI-2.0(1997年7月18日):新增功能以及MPI-1.2的所有澄清和补充内容。
  • MPI-1.3(2008年5月30日):出于历史原因,将MPI-1.1、MPI-1.2以及几个勘误文档合并为一个文档。
  • MPI-2.1(2008年6月23日):合并前述文档。
  • MPI-2.2(2009年9月4日):进一步澄清和新增七个新的例程。
  • MPI-3.0(2012年9月21日):对MPI-2.2进行扩展。
  • MPI-3.1(2015年6月4日):澄清和对MPI-3.0进行小幅扩展。
  • MPI-4.0(2021年6月9日):在MPI-3.1基础上增加了重要的新功能。
  • MPI-4.1(2023年11月2日):对MPI-4.0进行澄清和小幅扩展。

MPI(Message Passing Interface)是一种用于编写并行计算程序的标准。以下是各个版本的简要介绍:

版本 4.1:2023年11月2日发布。主要对 MPI-4.0 文档进行了修正和澄清。一些例程、属性键 MPI_HOST 和 mpif.h Fortran 包含文件已被弃用。

版本 4.0:2021年6月9日发布。这是一个重要更新版本,包含了显著的新功能。最大的变化包括添加了许多例程的大型计数版本,以解决使用 int 或 INTEGER 作为计数参数的限制,持久性集合操作,分区通信,MPI 初始化的另一种方式,应用程序信息断言以及改进的错误处理定义。此外,还有一些较小的改进和修正。

版本 3.1:2015年6月4日发布。主要对 MPI-3.0 文档进行了修正和澄清。最大的变化是对 MPI-3.0 中引入的 Fortran 绑定进行了修正。此外,还添加了一些新函数,包括以便携方式操作 MPI_Aint 值的例程,非阻塞集合 I/O 例程以及通过名称获取 MPI_T 性能和控制变量的索引值的例程。

版本 3.0:2012年9月21日发布。与 MPI-2.2 的开发同时,MPI 论坛开始讨论对 MPI 进行重大扩展的问题。这个文档包含了 MPI-3 标准。此版本包含了对 MPI 功能的显著扩展,包括非阻塞集合操作,新的单边通信操作以及 Fortran 2008 绑定。与 MPI-2.2 不同,这个标准被视为对 MPI 标准的重大更新。与之前的版本一样,只有在用户有强烈需求时才会采用新功能。然而,一些功能可能对现有的 MPI 实现产生更多的影响。

版本 2.2:2009年9月4日发布。主要对 MPI-2.1 文档进行了修正和澄清。虽然添加了一些扩展,但所有正确的 MPI-2.1 程序也是正确的 MPI-2.2 程序。只有在用户有强烈需求、开放源代码实现和对现有 MPI 实现影响较小时才会采用新功能。

版本 2.1:2008年6月23日发布。此文档合并了之前的 MPI-1.3(2008年5月30日)和 MPI-2.0(1997年7月18日)文档。MPI-2.0 的某些部分,如第4章杂项和第7章扩展集合操作的某些部分,已经合并到 MPI-1.3 的章节中。此外,还包括了 MPI 论坛收集的其他勘误和澄清。

版本 1.3:2008年5月30日发布。此文档合并了之前的 MPI-1.1(1995年6月12日)和 MPI-2(1997年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(Message-Passing Interface)是一个消息传递库接口规范,这个定义的所有部分都很重要。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,由Dongarra,Hempel,Hey和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]。当时的工作重点集中在五个领域。

  1. MPI-1.1文档的进一步更正和澄清。
  2. MPI-1.1的补充内容,不会显著改变其功能类型(例如,新的数据类型构造函数,语言互操作性等)。
  3. 完全新的功能类型(例如,动态进程,单边通信,并行I/O等),即所有人所认为的“MPI-2功能”。
  4. Fortran 90和C++的绑定。MPI-2为MPI-1和MPI-2函数指定了C++绑定,并扩展了MPI-1和MPI-2的Fortran 77绑定,以处理Fortran 90的问题。
  5. 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 什么平台是实现的目标

消息传递范式的吸引力部分源于其广泛的可移植性。以这种方式表达的程序可以在分布式存储多处理器、工作站网络以及这些的组合上运行。此外,包括多核处理器和混合架构在内的共享内存实现也是可能的。这种范式不会被合并共享和分布式内存视图的架构或网络速度的增加所淘汰。因此,在各种机器上实现这个标准都是可能且有用的,包括由通信网络连接的其他机器的集合构成的“机器”,无论是并行的还是非并行的。

这个接口适用于完全通用的MIMD(Multiple Instruction, Multiple Data)程序的使用,也适用于以SPMD(Single 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 上找到。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

whyte王

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值