13.6. Open MPI 术语

Open MPI是一个包含众多不同子系统和相对庞大代码库的大型项目。首先让我们了解一些基本术语,以便后续讨论更加清晰。

13.6.1. 模块化组件架构 (MCA)

See this section 关于模块化组件架构(MCA)的讨论。真的。现在就去读它。通过阅读该部分内容,在继续阅读这些文档之前,您应该理解以下术语:

  • 项目

  • 框架

  • 组件

  • 模块

  • 参数(变量)

13.6.2. 项目注意事项

项目在代码中是严格的抽象屏障。也就是说,它们被编译成独立的库:liboshmemlibmpilibopen-pal,并遵循严格的依赖顺序:OSHMEM依赖于OMPI,OMPI依赖于OPAL。例如,MPI可执行文件通过以下方式链接:

shell$ mpicc myapp.c -o myapp
# This actually turns into:
shell$ cc myapp.c -o myapp -lmpi ...

-lmpi之后可能还会列出更多系统级库,但您已经理解了核心概念。libmpi会隐式地将libopen-pal纳入整体链接步骤。

严格来说,这些并非传统软件工程意义上的"层级"(尽管将其称为层级更为方便)。以上按依赖顺序列出,但这并不意味着例如OMPI代码必须通过OPAL代码才能访问操作系统或网络接口。

因此,这种代码结构更多体现了抽象化和软件工程思想,而非必须逐层穿透才能到达底层的严格功能层级。例如,OMPI在需要时可以直接调用操作系统(而无需经过OPAL层)。事实上,许多顶层MPI API函数对性能极其敏感;若强制它们穿越任意深度的调用堆栈仅为了在网络间传输几个字节,这种做法显然不合逻辑。

框架、组件和模块可以是动态或静态的。也就是说,它们可以作为插件使用,也可以静态编译到库中(例如libmpi)。

在Open MPI v5.0.x中,configure默认设置为:

  • 将项目构建为动态库

  • 将所有组件链接到其父项目库中(而不是将它们编译为独立的动态共享对象DSO)

虽然这些默认值可以通过configure的命令行参数进行修改。

13.6.3. 必需的第三方库

请注意,Open MPI 还使用了一些第三方库来实现核心功能:

  • PMIx

  • PRRTE

  • Libevent

  • 硬件本地化("hwloc")

这些内容在必备支持库部分中有详细讨论。