对于那些在该领域工作了很长时间的人来说,我的问题可能看起来很愚蠢,但我感谢您耐心地为我详细说明。
当他们说 MPICH 是 MPI 的“实现”时,这是什么意思?
以下类比是否正确(?):如果我们将 MPI 视为 FORTRAN 编译器的一组标准,那么 MPICH 和 OPEMPI 是 FORTRAN 编译器的不同版本,例如 Intel.Fortran、Compaq.Fortran、GNU.Fortran 和很快。
MPI 是一个标准:它概述了分布式系统中消息传递的特定模型。然而,它只给出了一系列要求:它实际上并不包含任何代码,也没有具体说明这些要求需要如何满足。例如,看一下官方 MPI 2.2 规范的摘录(截至今天):
一个有效的 MPI 实现可以保证点对点通信的某些一般属性,这将在本节中描述。
Order Messages are non-overtaking:如果一个发送者连续向同一个目的地发送两条消息,并且都匹配相同的接收,那么如果第一个消息仍然处于未决状态,则此操作无法接收第二个消息。
然后继续解释此要求背后的基本原理并提供示例,但对要求本身只字未提。
MPI 实现是一个满足 MPI 规范中所有要求的库 - 就像上面的要求一样。但是,该标准绝对不包含关于可以/不能/应该使用什么语言结构、操作系统调用、第 3 方库等的要求。有时,它会向实施者提供建议,如下所示:
给实施者的建议。实现可以保留使用该数据类型的活动通信的引用计数,以便决定何时释放它。此外,可以实现派生数据类型的构造函数,以便它们保留指向其数据类型参数的指针,而不是复制它们。在这种情况下,需要跟踪活动的数据类型定义引用,以便了解何时可以释放数据类型对象。(对实施者的建议结束。)
然而,这些仍然是模糊的,非常与语言无关,并且只有建议:实现可以忽略这些建议中的每一个,并且仍然符合标准。
所以是的,本质上它类似于编译器的各种实现。如果一个程序获取一种语言的有效源代码,并生成二进制代码,该二进制代码执行语言规范中规定的在给定原始源代码的情况下应该执行的所有操作,那么它就是该语言的合规编译器。同样,如果您可以使用库以不违反 MPI 规范的任何规则的方式传递消息,那么这就是有效的 MPI 实现。