10.2. 前提条件
成功启动Open MPI作业需要能够在运行时在所有节点上找到Open MPI的可执行文件和共享库。
通常情况下,Open MPI的mpicc在编译和链接应用程序时,会通过runpath链接器选项设置这些路径。
如果Open MPI可执行文件和库可以通过系统默认搜索路径或应用程序中嵌入的runpath找到(即用户无需设置或修改PATH或LD_LIBRARY_PATH),则无需额外操作。然而,如果找不到Open MPI二进制文件,可以使用以下说明来定位它们。
If the runpath embedded in an application is not sufficient to locate
the Open MPI binaries, then the PATH and LD_LIBRARY_PATH can be used
to locate them.
In general, Open MPI requires that its executables are in your
PATH on every node on which you will run and if Open MPI was
compiled as dynamic libraries (which is the default), the directory
where its libraries are located must be in your LD_LIBRARY_PATH on
every node.
For example:
如果Open MPI安装在
/usr/bin和/usr/lib目录下,通常就足够了,用户无需额外操作。如果Open MPI安装在默认不搜索的位置,用户可能需要将
$prefix/bin添加到他们的PATH中,并将$libdir(默认为$prefix/lib)添加到他们的LD_LIBRARY_PATH中。注意
在调度环境中,确保执行mpirun(1)的节点能够找到Open MPI的可执行文件和库可能就足够了。
在非调度环境中,用户可能需要在他们的shell设置文件(例如
$HOME/.bashrc)中设置PATH和LD_LIBRARY_PATH环境变量,以便基于ssh的非交互式登录能够找到Open MPI的可执行文件和库。例如,如果Open MPI安装在
/opt/openmpi前缀下,那么您的PATH和LD_LIBRARY_PATH中应包含以下内容环境变量
需要添加的值
PATH/opt/openmpi/binLD_LIBRARY_PATH/opt/openmpi/lib根据您的环境,您可能需要在shell启动文件(例如
.bashrc、.cshrc等)中设置这些值。
此外,Open MPI要求作业能够在远程节点上启动,无需任何键盘输入。例如,如果使用ssh作为远程智能体,您必须配置好环境以允许在远程节点上执行而无需输入密码或口令。
10.2.1. 将Open MPI添加到PATH和LD_LIBRARY_PATH环境变量中
Open MPI 必须能够在每个节点的PATH中找到其可执行文件(如果Open MPI被编译为动态库,则其库路径也必须出现在LD_LIBRARY_PATH中)。因此,您的配置/初始化文件需要正确地将Open MPI添加到PATH/LD_LIBRARY_PATH中。
具体操作方式可能高度依赖于您的本地配置;您可能需要咨询本地系统管理员。有些系统管理员会为您处理这些细节,有些则不会。不过,下面包含了一些常见示例。
您至少需要对shell的工作原理有基本了解,才能正确将Open MPI添加到PATH和LD_LIBRARY_PATH中。请注意,在以下情况下必须将Open MPI添加到您的PATH和LD_LIBRARY_PATH中:
当您登录交互式shell时
如果您的交互式登录环境未正确配置, 像
mpicc这样的可执行文件将无法找到,通常 很明显问题出在哪里。可以手动将Open MPI可执行文件目录 添加到PATH中,或者修改用户的启动文件, 使得每次登录时Open MPI可执行文件都会自动 添加到PATH中。后一种方法是首选方案。所有shell都有某种在登录时执行的脚本文件, 用于设置
PATH和LD_LIBRARY_PATH等 并执行其他环境设置任务。需要编辑这个启动文件 来将Open MPI添加到PATH和LD_LIBRARY_PATH中。有关具体细节, 请查阅您所用shell的手册页(例如,某些shell对 启动文件的权限很挑剔)。下表列出了一些常见 shell及其在登录时读取/执行的启动文件:Shell
交互式登录启动文件
bash如果存在则使用
.bash_profile,否则如果存在则使用.bash_login, 如果都不存在则使用.profile(按此顺序)。请注意,某些Linux发行版 自动为用户提供
.bash_profile脚本,这些脚本会自动 执行.bashrc。更多信息请查阅
bash(1)手册页。zsh.zshrc后跟.zshenvsh(或名为sh的Bash).profilecsh.cshrc后跟.logintcsh如果存在则使用
.tcshrc,否则使用.cshrc,后跟.login当您登录到远程节点的非交互式shell时
如果您的非交互式远程环境未正确配置,像mpirun(1)这样的可执行文件将无法正常工作,这可能会让人感到困惑。
这里讨论的启动文件是指那些在远程节点上为非交互式登录自动执行的文件(例如
ssh othernode ps)。请注意,并非所有shell都支持此功能,而且某些shell为此使用的文件与交互式登录列出的文件不同。一些shell会用交互式登录的文件取代非交互式登录的启动文件。也就是说,运行非交互式登录启动文件可能会自动调用交互式登录启动文件。下表列出了一些常见shell及其自动执行的启动文件,这些文件可能由Open MPI或shell本身执行:Shell
非交互式登录启动文件
bash如果存在则执行
.bashrczsh先执行
.zshrc再执行.zshenvsh(或命名为sh的Bash)此shell不会自动执行任何文件,
因此Open MPI会在远程节点上调用Open MPI可执行文件前执行
.profile脚本csh.cshrctcsh如果存在则执行
.tcshrc,否则执行.cshrc
10.2.2. 在mpirun中使用--prefix选项
如果用户无法将相关目录添加到PATH和
LD_LIBRARY_PATH中,mpirun(1)的--prefix
选项可能就足够了。
在某些情况下,您无法修改PATH或
LD_LIBRARY_PATH——例如,一些独立软件开发商(ISV)的应用程序倾向于向用户隐藏
所有并行计算细节,因此不希望用户修改其shell启动文件。另一种情况是当您希望
单个用户能够同时启动多个MPI作业,
每个作业使用不同的MPI实现时。因此,将shell
启动文件设置为指向某个MPI实现会带来问题。
在这种情况下,您有两个选择:
使用mpirun(1)的
--prefix命令行选项(如下所述)。修改包装器编译器,加入包含Open MPI库运行时搜索位置的指令。
mpirun(1)的--prefix命令行选项需要指定Open MPI的安装根目录作为参数。虽然可以使用相对路径,但根据所使用的作业启动器可能会产生歧义;强烈建议使用绝对路径。
例如,假设Open MPI安装在/opt/openmpi-VERSION目录下。您需要这样使用--prefix选项:
shell$ mpirun --prefix /opt/openmpi-VERSION -n 4 a.out
这将在本地和远程主机上分别为PATH和LD_LIBRARY_PATH添加前缀/opt/openmpi-VERSION/bin和/opt/openmpi-VERSION/lib。当使用资源管理器启动作业时(例如Slurm、Torque等),这通常是不必要的,因为它们倾向于在执行前将整个本地环境(包括PATH和LD_LIBRARY_PATH)复制到远程节点。因此,如果PATH和LD_LIBRARY_PATH在本地节点上设置正确,资源管理器会自动将这些值传播到远程节点。--prefix选项因此在基于ssh的环境(或类似环境)中最有用。
可以通过向configure传递标志--enable-mpirun-prefix-by-default来将此设为默认行为。这将使mpirun(1)的行为完全等同于mpirun --prefix $prefix ...,其中$prefix是在configure中赋予--prefix的值。
最后请注意,指定mpirun(1)的绝对路径名等同于使用--prefix参数。例如,以下命令行与上述使用--prefix的命令行效果相同:
shell$ /opt/openmpi-VERSION/bin/mpirun -n 4 a.out
错误
待办事项:Josh H指出,我们可能还需要在这里提及PRRTE的.ini文件中关于OMPIHOME的内容。由于PRRTE的.ini文件支持功能尚未实现,暂时将此作为未来的待办事项。