4.12. 安装位置
运行Open MPI的常见环境是“Beowulf”类或类似的集群(例如,机架中的一堆1U服务器)。简而言之,Open MPI可以运行在一组通过网络连接的服务器或工作站上。如先决条件部分所述,但有几个注意事项(例如,通常您必须在所有机器上拥有账户,可以无需密码在节点之间ssh等)。
无论Open MPI是安装在共享/网络文件系统上还是独立安装在每个节点上,通常最简单的方法是让Open MPI在每个节点的相同文件系统路径下可用。例如,如果您在一个节点上将Open MPI安装到/opt/openmpi-|ompi_ver|,请确保它在所有节点上都位于/opt/openmpi-|ompi_ver|路径下。
重要
为简化操作,Open MPI团队强烈建议您在集群所有节点上以相同的路径安装Open MPI。这将极大简化用户在集群多节点间运行MPI作业的操作体验。
虽然可以在集群不同节点上为Open MPI设置不同的安装路径,但这样做并不推荐。
这为Open MPI系统管理员提出了一个问题:在哪里安装Open MPI的二进制文件、头文件等?本讨论主要针对同构集群(即所有节点和操作系统都相同)解答这个问题,尽管讨论中的部分内容也适用于异构集群。
4.12.1. 文件系统类型
有两种常见的方法。
4.12.1.1. 网络文件系统
在所有要使用的机器之间建立一个共享文件系统,例如NFS。安装Open MPI时,确保每个节点上的安装目录是相同的路径。这将极大简化用户的shell启动脚本(例如.bashrc、.cshrc、.profile等)——无需检查用户当前所在的机器即可设置PATH。这也简化了系统管理员的工作;当需要修补或升级Open MPI时,只需修改一个副本。
例如,考虑一个由四台机器组成的集群:inky、blinky、pinky和clyde。
在
inky的本地硬盘目录/opt/openmpi-VERSION中安装Open MPI。然后系统管理员将其挂载到其余三台机器上,使得所有机器上的/opt/openmpi-VERSION目录实际上是"相同的"。也就是说,以下目录都包含Open MPI安装:inky:/opt/openmpi-VERSION blinky:/opt/openmpi-VERSION pinky:/opt/openmpi-VERSION clyde:/opt/openmpi-VERSION
在
inky的本地硬盘目录/usr/local/openmpi-VERSION中安装Open MPI。然后系统管理员将inky:/usr/local/openmpi-VERSION挂载到所有四台机器的其他公共位置,例如/opt/openmpi-VERSION(为了提高效率,可以在inky上安装符号链接而不是挂载点)。这种策略通常用于一个目录树通过NFS导出,但另一个目录树通常用于实际安装位置的环境。例如,以下目录都包含Open MPI安装:inky:/opt/openmpi-VERSION blinky:/opt/openmpi-VERSION pinky:/opt/openmpi-VERSION clyde:/opt/openmpi-VERSION
注意,这与前面的例子有相同的四个目录,但在
inky上,该目录实际上位于/usr/local/openmpi-VERSION。
这种方法存在一定的缺点;每个远程节点在访问Open MPI目录树时都会受到NFS(或所使用的其他文件系统)的延迟影响。然而,从管理便捷性和低成本(相对而言)的角度来看,使用网络文件系统的优势通常远远超过其成本。事实上,一旦MPI应用程序完成MPI初始化阶段,它就不会频繁使用Open MPI的二进制文件。
4.12.1.2. 本地文件系统
如果您担心通过网络文件系统访问Open MPI二进制文件的成本,可以将Open MPI安装到系统中每个节点的本地硬盘上。再次强调,强烈建议在每个节点的相同目录下安装Open MPI,这样无论用户登录到哪个节点,每个用户的PATH都可以设置为相同的值。
这种方法可以减少访问Open MPI二进制文件时的网络延迟,但通常仅用于用户非常关注榨取机器每一分性能的情况,或者在极端规模下运行,当执行非常大的并行作业时,网络文件系统可能会因对Open MPI二进制文件的文件系统请求而不堪重负。
4.12.2. 在已有Open MPI安装基础上进行安装
警告
Open MPI团队不建议在已安装的旧版本Open MPI上直接覆盖安装新版本。
在默认配置下,Open MPI安装包含多个共享库、头文件、可执行文件和插件(动态共享对象——DSOs)。这些安装文件作为一个整体协同工作。具体文件名及其内容可能随Open MPI不同版本而变化。
重要
安装一个版本的Open MPI不会卸载另一个版本。
如果您在旧版本之上安装新版本的Open MPI,这可能不会覆盖旧版本的所有文件。因此,您最终可能会得到来自两个不同安装的不兼容文件混杂——这可能会导致问题。
有关更新或升级Open MPI安装的更多信息,请参阅更新Open MPI。
4.12.3. 迁移Open MPI安装
有时可能需要先将Open MPI安装到一个位置(例如/path/to/openmpi),之后再将其移动到另一个位置(例如/opt/myproduct/bundled-openmpi-a.b.c)。
注意
Open MPI在其可执行文件中硬编码了一些目录路径,这些路径基于configure脚本指定的安装路径。例如,如果您使用/opt/openmpi/作为安装前缀进行配置,Open MPI会在其可执行文件中编码表示它应该能够在/opt/openmpi/share/openmpi找到其帮助文件。
Open MPI中的"installdirs"功能允许你在运行时更改这些硬编码的目录路径(前提是你已经将PATH和/或LD_LIBRARY_PATH环境变量调整为Open MPI现在所在的新位置)。
有三种方法。
4.12.3.1. 将现有的Open MPI安装迁移到新的前缀路径
在启动Open MPI之前设置OPAL_PREFIX环境变量。例如,如果Open MPI最初安装在/opt/openmpi,而整个openmpi目录树后来被移动到/home/openmpi,将OPAL_PREFIX设置为/home/openmpi将使Open MPI能够正常运行。
注意
OPAL_PREFIX机制依赖于将所有安装目录指定为相对于configure期间指定的prefix目录的相对路径。
例如,如果Open MPI按以下方式配置:
$ ./configure --prefix=/opt/openmpi --libdir=/usr/lib ...
那么设置OPAL_PREFIX将不会影响libdir的运行效果,因为/usr/lib并未被指定为相对于/opt/openmpi的路径。
您可以将目录指定为相对于其他configure可识别目录的相对路径,而非绝对路径。例如:
$ ./configure --prefix=/opt/openmpi --libdir='${exec_prefix}/x86_64/lib' ...
注意可能需要额外的shell引号来防止shell变量扩展,以及在exec_prefix周围添加的${}对于Open MPI识别这是一个需要扩展的特殊名称是必要的。
Open MPI 识别的目录名称列在下方覆盖单个目录部分(不带OPAL_前缀且为小写)。例如,环境变量OPAL_SYSCONFDIR对应${sysconfdir}。
4.12.3.2. 将Open MPI安装"暂存"到临时位置
在创建自包含的安装包时,RPM等系统会将Open MPI安装到临时位置。随后,打包系统会将临时位置下的所有内容打包成一个可在后续安装到实际位置的软件包。例如,当创建一个将安装到/opt/openmpi的RPM包时,RPM系统会透明地为安装目录添加一个"目标目录"(或称"destdir")前缀。因此,Open MPI会认为它被安装在/opt/openmpi,但实际上它被临时安装在(例如)/var/rpm/build.1234/opt/openmpi。如果需要在暂存区域安装期间使用Open MPI,可以使用OPAL_DESTDIR环境变量;将OPAL_DESTDIR设置为/var/rpm/build.1234会自动为每个目录添加前缀,使Open MPI能够正常运行。
4.12.3.3. 覆盖单个目录
Open MPI 采用 GNU 指定的目录(基于 Autoconf/Automake 规范),并可通过设置与其常用名称直接相关的环境变量来覆盖默认配置。可使用的环境变量列表如下:
OPAL_PREFIXOPAL_EXEC_PREFIXOPAL_BINDIROPAL_SBINDIROPAL_LIBEXECDIROPAL_DATAROOTDIROPAL_DATADIROPAL_SYSCONFDIROPAL_SHAREDSTATEDIROPAL_LOCALSTATEDIROPAL_LIBDIROPAL_INCLUDEDIROPAL_INFODIROPAL_MANDIROPAL_PKGDATADIROPAL_PKGLIBDIROPAL_PKGINCLUDEDIR
请注意,上述列出的目录并非全部被Open MPI使用;此处完整列出是为了确保全面性。
还需注意,上述列出的多个目录是基于其他目录定义的。例如,$bindir默认定义为$prefix/bin。因此,覆盖$prefix(通过OPAL_PREFIX)将自动改变$bindir的前半部分(这就是上文方法1的工作原理)。或者,也可以将OPAL_BINDIR设为完全忽略$prefix的绝对路径值。
4.12.4. 安装多个Open MPI副本
Open MPI能够在一个安装中处理多种不同的运行时环境(例如ssh、Slurm、PBS等)以及多种不同的互连网络(例如以太网、InfiniBand等)。具体来说:由于Open MPI本质上由组件架构驱动,所有这些不同运行时系统和互连网络的插件都可以安装在同一个安装目录中。相关插件只会在适合它们的环境中才会被使用。
因此,无需为InfiniBand单独安装一个MPI,为以太网单独安装一个MPI,为PBS单独安装一个MPI,为ssh单独安装一个MPI等。Open MPI可以在单一安装中处理所有这些情况。
然而,Open MPI无法解决某些问题。不同编译器之间的二进制兼容性就是这样一个问题,可能需要安装多个版本的Open MPI。
让我们按语言逐一分析(务必注意文末的重要说明):
C语言: 大多数C编译器都具有良好的兼容性,因此如果您使用一个C库编译Open MPI,并将其链接到由不同C编译器编译的应用程序中,一切应该都能"正常工作"。因此,单个Open MPI安装应该适用于大多数C语言的MPI应用程序。
C++: 对于C++来说情况不一定相同。虽然Open MPI目前不包含任何C++代码(MPI C++绑定已在之前的版本中移除),且C++编译器应该会为C符号生成ABI兼容的代码,但当混合使用不同套件的编译器时,有时可能会出现难以察觉的问题。例如,如果您使用XYZ C/C++编译器编译Open MPI,可能需要在所有运行环境中安装XYZ C++运行时库。
Fortran: Fortran 存在多个问题。
Fortran编译器会进行一种称为"符号修饰"的操作,这意味着后端符号的名称可能与对应的全局变量、子程序和函数略有不同。Fortran编译器通常使用4种不同的符号修饰方案。在许多系统上(例如Linux),Open MPI会自动支持所有4种方案。因此,单个Open MPI安装应该可以与多个不同的Fortran编译器配合使用。然而,在某些系统上(例如OS X),这是不可能的,Open MPI将只支持在
configure过程中识别的Fortran编译器所使用的符号修饰方案。尽管如此,仍有两个显著的例外情况无法在"差异较大"的Fortran编译器之间通用:
- C语言常量
MPI_F_STATUS_IGNORE和MPI_F_STATUSES_IGNORE 仅能与那些使用与Open MPI配置时相同名称修饰方案的Fortran编译器所创建的Fortran应用程序正确比较。
- C语言常量
- 不同Fortran编译器对逻辑常量
.TRUE.可能有不同定义 因此,任何使用Fortran
LOGICAL类型的MPI函数,只能获取与Open MPI配置时所用Fortran编译器对应的.TRUE.值。
- 不同Fortran编译器对逻辑常量
与C++类似,链接来自不同Fortran编译器的模块和/或多态性等Fortran语言特性的目标文件很可能无法正常工作。Open MPI创建的
mpi和mpi_f08模块很可能仅适用于在configure过程中识别的Fortran编译器(并用于构建Open MPI)。
所有这些的一个重大注意事项是,Open MPI 只有在所有数据类型大小相同的情况下才能与不同编译器配合工作。例如,尽管 Open MPI 支持全部 4 种名称修饰方案,但 Fortran LOGICAL 类型的大小在某些编译器中可能是 1 字节,而在其他编译器中可能是 4 字节。这很可能会导致 Open MPI 出现不可预测的行为。
关键在于,Open MPI可以在单一安装中支持各种运行时系统和互连方式,但在某些情况下支持多个编译器"勉强"可行(即需要反复试验和调整),而在其他情况下则完全不可行。遗憾的是,我们对此无能为力——这是一个编译器兼容性问题,而编译器开发者几乎没有动力去解决这个问题。