openmpi

简介

OpenMPI(Open Message Passing Interface)是一个开源的并行计算库,用于在集群计算环境中进行并行计算。它采用消息传递编程模型,可以在多个计算节点之间进行高效的数据通信和同步操作。

OpenMPI支持多种并行计算的应用场景,包括科学计算、机器学习、数据分析等。它提供了一组丰富的函数接口,可以实现进程间的消息传递和同步操作。用户可以通过调用这些函数来编写并行程序, 利用集群中的多个计算节点进行并行计算。

OpenMPI的设计目标是提供一个高性能、可扩展、可移植的并行计算库。它可以在各种操作系统和硬件平台上运行,并具有良好的可移植性。OpenMPI支持多种传输协议,包括TCP/IP、InfiniBand、Myrinet等, 可以适应不同的网络环境。

OpenMPI还提供了一些高级功能,如动态进程管理、进程互操作等。动态进程管理允许用户在运行时动态添加或删除计算节点,从而实现动态扩展计算资源。进程互操作允许不同的并行计算库之间进行互操作, 实现资源共享和任务协同。

总之,OpenMPI是一个功能强大的并行计算库,可以帮助用户更好地利用集群计算资源进行并行计算。它是科学计算和大规模数据处理领域的重要工具,被广泛应用于各种科学研究和工程实践中。

集群中的openmpi

安装列表

序号

集群

版本

模块名

编译环境

位置

1

hpckapok1

4.1.5

openmpi4/4.1.5

gcc12.2.0

/opt/ohpc/pub/mpi/openmpi4-gnu12/4.1.5/

2

hpckapok1

5.0.3

mpi/openmpi/5.0.3_gnu

gcc13.3.0,cuda11.8

/share/software/mpi/openmpi/gnu/5.0.3/

3

hpckapok1

5.0.3

mpi/openmpi/5.0.3_intel

oneapi2024.0.1,cuda11.8

/share/software/mpi/openmpi/intel/5.0.3

4

hpckapok2

4.0.3

mpi/openmpi/gnu/4.0.3

gcc8.5.0

/public/software/mpi/openmpi/gnu/4.0.3

5

hpckapok2

5.0.3

mpi/openmpi/gnu/5.0.3

gcc11.4.0,cuda12.3

/public/software/mpi/openmpi/gnu/5.0.3

6

hpckapok2

12.3

mpi/openmpi/intel/4.0.3

intel2021.3.0

/public/software/mpi/openmpi/intel/4.0.3

使用方法

1.使用前需先加载相应的编译环境,比如要使用集群1的mpi/openmpi/5.0.3_gnu:

module load gcc/11.4.0           #其他gcc版本亦可,但不能过低或者过高
module load cuda/11.8
module swap openmpi4/4.1.5 mpi/openmpi/5.0.3_gnu   #集群1默认openmpi4/4.1.5,需要使用module swap替换掉默认的openmpi4

2.集群1和集群2的openmpi5版本均支持cuda和相应的ucx。详细了解编译选项可以执行安装位置bin目录下的ompi_info。

 $./ompi_info

                Package: Open MPI root@login04 Distribution
               Open MPI: 5.0.3
 Open MPI repo revision: v5.0.3
  Open MPI release date: Apr 08, 2024
                MPI API: 3.1.0
           Ident string: 5.0.3
                 Prefix: /share/software/mpi/openmpi/gnu/5.0.3
Configured architecture: x86_64-pc-linux-gnu
          Configured by: root
          Configured on: Sat Jun  1 16:52:36 UTC 2024
         Configure host: login04
 Configure command line: '--prefix=/share/software/mpi/openmpi/gnu/5.0.3'
                         '--with-cuda=/share/software/cuda/local/cuda-11.8/'
                         '--with-ucx=/share/software/mpi/ucx/1.16.0'
                         '--with-sge'
                         '--with-libfabric=/share/software/tools/libfabric/1.21.0/'

                       .......

3.如需了解更多的openmpi代码或者进行测试,可以查看openmpi自带的example,位置集群1的/share/case/openmpi/,集群2的/public/software/share/case/openmpi。 下面集群1中 测试验证 (仅在登录节点执行测试):

$ cd ~
$ cp -r /share/case/openmpi/example .   #拷贝至当前目录
$ cd example
$ make                                  #编译example目录下的所有文件
$ module swap openmpi4/4.1.5 mpi/openmpi/5.0.3_gnu
### export OMPI_MCA_pml=ucx            #环境变量设置ucx pml,等同如下命令
$ mpirun -n 4 --mca pml ucx hello_c    #使用ucx pml运行hello_c程序
Hello, world, I am 1 of 4, (Open MPI v5.0.3, package: Open MPI root@login04 Distribution, ident: 5.0.3, repo rev: v5.0.3, Apr 08, 2024, 107)
Hello, world, I am 0 of 4, (Open MPI v5.0.3, package: Open MPI root@login04 Distribution, ident: 5.0.3, repo rev: v5.0.3, Apr 08, 2024, 107)
Hello, world, I am 2 of 4, (Open MPI v5.0.3, package: Open MPI root@login04 Distribution, ident: 5.0.3, repo rev: v5.0.3, Apr 08, 2024, 107)
Hello, world, I am 3 of 4, (Open MPI v5.0.3, package: Open MPI root@login04 Distribution, ident: 5.0.3, repo rev: v5.0.3, Apr 08, 2024, 107)
$ mpirun -n 4 --mca mtl ^ofi hello_c   #容许除ofi mtl之外的组件运行hello_c程序
Hello, world, I am 1 of 4, (Open MPI v5.0.3, package: Open MPI root@login04 Distribution, ident: 5.0.3, repo rev: v5.0.3, Apr 08, 2024, 107)
Hello, world, I am 0 of 4, (Open MPI v5.0.3, package: Open MPI root@login04 Distribution, ident: 5.0.3, repo rev: v5.0.3, Apr 08, 2024, 107)
Hello, world, I am 2 of 4, (Open MPI v5.0.3, package: Open MPI root@login04 Distribution, ident: 5.0.3, repo rev: v5.0.3, Apr 08, 2024, 107)
Hello, world, I am 3 of 4, (Open MPI v5.0.3, package: Open MPI root@login04 Distribution, ident: 5.0.3, repo rev: v5.0.3, Apr 08, 2024, 107)

进一步了解

1 编译mpi应用

Open MPI提供了应用于编译MPI和OpenSHMEM应用程序的“wrapper”编译器:

C

mpicc, oshcc

C++

mpic++,oshc++(或者mpiCC和oshCC如果文件系统大小写敏感)

Fortran

mpifort, oshfort

名称mpif77和mpif90仍然存在,不过只是到mpifort包装编译器的符号链接。强烈鼓励用户更新所有构建脚本以使用mpifort,而不是mpif77和mpif90。

其目的是用户可以简单地调用Open MPI包装编译器,而不是他们通常的语言编译器。例如,不要调用通常的C编译器来构建MPI C应用,而是使用mpicc:

$ mpicc hello_world_mpi.c -o hello_world_mpi -g

对于OpenSHMEM应用:

$ oshcc hello_shmem.c -o hello_shmem -g

包装(wrapper)编译器所做的只是将各种编译器和链接器标志添加到命令行,然后调用后端编译器。 具体地说:包装编译器根本不解析源代码;它们只是命令行操纵器,与程序的实际编译或链接无关。最终的结果是一个MPI可执行文件,它被正确地链接到所有相关的库。

2 运行mpi应用

开放式MPI可以在各种各样的环境中启动MPI进程,但它们通常可以分为两类:

调度环境:这些系统使用资源管理器和/或调度器来控制对计算节点的访问。流行的资源管理器包括Slurm、PBS/Pro/Torque和LSF。

非调度环境:这些系统不使用调度管理器。启动通常是本地的(例如,在单个笔记本电脑或工作站上)或通过ssh(例如,跨少数节点)。

与许多MPI实现类似,Open MPI提供命令mpirun和mpiexec来启动MPI作业。本节介绍如何使用这些命令。

但是,请注意,在Open MPI中,mpirun和mpiexec完全相同。具体来说,它们是指向通用后端启动器命令的符号链接。

注:后端启动器命令的名称随着时间的推移而发生了变化(以前是orterrun,现在是prte)。这个后端名称在很大程度上与用户无关。

2.1 mpirun选项

$ mpirun -n 2 mpi-hello-world
# or
$ mpiexec -n 2 mpi-hello-world
# or
$ mpiexec -n 1 mpi-hello-world : -n 1 mpi-hello-world

mpirun支持--help选项,该选项提供使用消息和所支持选项的摘要。它应被视为提供了哪些选择的最终清单。

几个值得注意的选项是:

--hostfile:为需要在哪些主机上启动并行应用程序的启动器(如rsh启动器)指定一个主机文件。请注意,为了与其他MPI实现兼容,-machinefile是--hostfile的同义词。

--host:指定要在其上运行的主机或主机列表(有关更多详细信息,请参阅此常见问题解答条目)。

-n: 指示要启动的进程数。

--mca:设置mca参数(有关详细信息,请参阅如何设置mca的参数)。

--wdir DIRECTORY:设置启动的应用程序的工作目录。如果未提供,则假定为当前工作目录(或者$HOME,如果当前工作目录不存在于所有节点上)。

-x ENV_VARIABLE_NAME:要导出到并行应用程序的环境变量的名称。可以多次指定-x选项以将多个环境变量导出到并行应用程序。

mpirun命令支持大量选项。请务必查看 mpirun手册页 了解更多信息。

2.2 在单机上运行mpi应用

在单个笔记本电脑或工作站上开发MPI应用程序是很常见的。在这种简单的“单程序多数据single program, multiple data(SPMD)”情况下,使用mpirun并通过-n选项指定要启动的MPI进程数:

$ mpirun -n 6 mpi-hello-world
Hello world, I am 0 of 6 (running on my-laptop))
Hello world, I am 1 of 6 (running on my-laptop)
...
Hello world, I am 5 of 6 (running on my-laptop)

这将启动一个六进程并行应用程序,运行名为mpi-hello-world可执行文件的六个副本。

如果未指定-n选项,mpirun将默认启动与计算机上有处理器核心(而非超线程)一样多的MPI进程。

2.3 在无调度系统的环境中使用mpi应用(通过ssh)

通常,Open MPI需要以下内容才能启动和运行MPI应用程序:

1.您必须能够以非交互方式登录到远程节点(例如,无需输入密码或密码短语)。

2.Open MPI的可执行文件必须是可查找的(例如,在PATH中)。

3.Open MPI的库必须是可查找的(例如,在LD_LIBRARY_PATH中)。

mpirun接受--hostfile选项(及其同义词--machinefile选项),以指定每行包含一个主机名的主机文件:

$ cat my-hostfile.txt
node1.example.com
node2.example.com
node3.example.com slots=2
node4.example.com slots=10

可选插槽slots属性告诉Open MPI可以分配给该节点的最大进程数。如果没有提供插槽,Open MPI(默认情况下)将使用该节点上的处理器核心(而不是超线程)数量。

假设my-hostfile.txt中的4个节点各有16个核心:

$ mpirun --hostfile my-hostfile.txt mpi-hello-world
Hello world, I am 0 of 44 (running on node1.example.com)
Hello world, I am 1 of 44 (running on node1.example.com)
...
Hello world, I am 15 of 44 (running on node1.example.com)
Hello world, I am 16 of 44 (running on node2.example.com)
Hello world, I am 17 of 44 (running on node2.example.com)
...
Hello world, I am 31 of 44 (running on node2.example.com)
Hello world, I am 32 of 44 (running on node3.example.com)
Hello world, I am 33 of 44 (running on node3.example.com)
Hello world, I am 34 of 44 (running on node4.example.com)
...
Hello world, I am 43 of 44 (running on node4.example.com)

您可以看到Open MPI在每个节点上启动的进程数的细分:

node1:16,因为未指定插槽

node2:16,因为未指定插槽

node3:2,因为指定了slots=2

node4:10,因为指定了slots=10

但是,请注意,并非所有环境都需要主机文件。例如,Open MPI将自动检测何时在批处理/计划环境(如Slurm、PBS/Torque、SGE、LoadLeveler)中运行,并将使用这些系统提供的主机信息。

还要注意,如果使用需要主机文件且未指定主机文件的启动器,则所有进程都将在本地主机上启动。

2.4 在调度系统中使用mpi应用

在调度环境中(例如,在Slurm作业、PBS/Pro、LSF或任何其他调度系统),用户告诉调度程序要启动多少个MPI进程,并且调度程序决定使用哪个主机。然后,调度器将这两条信息(要使用的进程数量和主机)传递给Open MPI。

在调度环境中有两种启动方式。名义上,它们都实现了相同的目标:启动MPI进程。这两种方法之间用户可观察到的主要区别在于,mpirun比调度器直接启动器具有更多的功能。

2.4.1 使用open mpi的mpirun

从技术上讲,Open MPI的mpirun是PRRTE prun周围的一个薄层thin layer。因此,这里描述的大多数功能实际上都是关于prun的。然而,为了简单起见,文档将以mpirun的形式描述所有内容。

在计划环境中使用功能齐全的mpirun时,无需指定要启动的主机文件或MPI进程数。mpirun将直接从调度程序接收此信息。 因此,如果您想启动一个完全“填充”您的调度器分配的MPI作业(即,计划分配中的每个插槽一个MPI进程),您可以简单地:

# Write a script that runs your MPI application
shell$ cat my-slurm-script.sh
#!/bin/sh
# There is no need to specify -n or --hostfile because that
# information will automatically be provided by Slurm.
mpirun mpi-hello-world

然后将my-slurm-script.sh脚本提交给slurm执行:

# Use -n to indicate how many MPI processes you want to run.
# Slurm will pick the specific hosts which will be used.
shell$ sbatch -n 40 my-slurm-script.sh
Submitted batch job 1234
shell$

Slurm作业1234完成后,您可以查看输出文件以了解发生了什么:

shell$ cat slurm-1234.out
Hello world, I am 0 of 40 (running on node37.example.com)
Hello world, I am 1 of 40 (running on node37.example.com)
Hello world, I am 2 of 40 (running on node37.example.com)
...
Hello world, I am 39 of 40 (running on node19.example.com)

请注意,Slurm调度程序选择了哪一些主机运行进程。

上面的示例显示,只需调用mpirun mpi-hello-world(不使用其他CLI选项),就可以从调度器中获得要运行的进程数和要使用的主机数。

mpirun还有许多中没有描述的功能。例如,虽然在计划环境中不常见,但您可以使用-n和/或--hostfile在总体计划程序分配的子集中启动。有关更多详细信息,请参阅 mpirun手册页

2.4.2 使用调度器“直接启动”(不用mpirun)

一些调度器(如Slurm)能够在不使用Open MPI的mpirun(1)的情况下“直接启动”MPI进程。例如

 $ srun -n 40 mpi-hello-world
Hello world, I am 0 of 40 (running on node14.example.com)
Hello world, I am 1 of 40 (running on node14.example.com)
Hello world, I am 2 of 40 (running on node14.example.com)
...
Hello world, I am 39 of 40 (running on node203.example.com)

与前面的示例类似,此示例启动40个mpi-hello-world副本,但它是通过Slurm-srun命令执行的,而不使用mpirun。

3 关于Modular Component Architecture(mca模块化组件体系结构)

Open MPI是一个高度可定制的系统;它可以通过配置文件、命令行参数和环境变量进行配置。Open MPI配置系统的主要功能是通过模块化组件体系结构(MCA)。

  • 本节介绍MCA本身以及如何在运行时设置MCA参数。

  • 本文档的后面部分介绍了Open MPI功能的不同部分,以及可用于影响Open MPI行为的MCA参数的特定名称和值。

备注

PMIx和PRRTE软件包也使用MCA进行配置、组合和运行时调整。

3.1 术语

模块化组件体系结构(MCA)是Open MPI大部分功能的支柱。它是一系列在运行时组装的项目、框架、组件和模块,用于创建MPI实现。

MCA参数(也称为MCA变量)用于在运行时自定义Open MPI的行为。

../../../_images/ompi_mca.png

下文对每一个实体进行描述。

3.1.1 工程(Projects)

项目本质上是开放MPI代码库中最高的抽象层划分。

Open MPI v5.0.x中存在以下项目:

  • 开放可移植性访问层(OPAL):底层操作系统和体系结构可移植性代码。

  • 开放式MPI(OMPI):MPI API和支持基础设施。

  • OpenSHMEM(OSHMEM):OpenSHMEM API和支持基础设施。

备注

早期版本的Open MPI还包括一个Open MPI Runtime Environment(ORTE)项目。ORTE本质上演变成了独立的PMIx运行时参考环境(PRRTE),现在被认为是Open MPI的第三方依赖项,而不是其包含的项目之一。

有关详细信息,请参见 PMIx和PRRTE的角色

3.1.2 框架(Frameworks)

MCA框架在运行时管理零个或多个组件,并针对特定任务(例如,提供MPI集体操作功能)。尽管每个MCA框架只支持单一类型的组件,但它可能支持该类型的多个组件。

用户可能想要或需要自定义的一些更常见的框架包括以下内容:

  • btl:字节传输层;这些组件专门用作ob1-PML组件的底层传输。

  • coll:MPI集体算法。MPI APIs 比如 MPI_BCAST, MPI_BARRIER, MPI_REDUCE, … etc。

  • io: MPI I/O。顶层MPI文件操作,MPI APIs 比如 MPI_FILE_OPEN, MPI_FILE_READ, MPI_FILE_WRITE, … etc。

  • mtl:MPI匹配传输层(mtl);这些组件专门用作cm PML组件的底层传输。

  • pml:点对点消息传递层(Point-to-Point Messaging Layer)。这些组件用于实现MPI点对点消息传递功能。MPI APIs 比如 MPI_SEND, MPI_RECV, … etc。

Open MPI中有许多框架;确切的集合在不同版本的Open MPI之间有所不同。您可以使用ompi_info命令查看Open MPI v5.0.x中包含的框架的完整列表。

3.1.3 组件(Components)

MCA组件是框架的正式接口的实现。它是一个独立的代码集合,可以绑定到一个插件中,该插件可以在运行时和/或编译时插入Open MPI代码库。

备注

Open MPI“组件”概念的好同义词是“插件”或“附加组件”。

在不同版本的Open MPI中,组件的确切集合各不相同。Open MPI的代码库包括对许多组件的支持,但并非所有组件都存在或可在您的系统中使用。您可以使用ompi_info命令查看系统上Open MPI v5.0.x中包含哪些组件。

3.1.4 模块(Modules)

MCA模块是组件的实例(在C++意义上的“实例”一词;MCA组件类似于C++类)。 例如,如果运行Open MPI应用程序的节点有两个以太网NIC,则Open MPI应用软件将包含一个TCP MPI点对点组件,但包含两个TCP点对点模块。

3.1.5 参数Parameters(变量variables)

MCA参数(有时称为MCA变量)是Open MPI运行时调优的基本单元。它们是简单的“key=value”对,在整个OpenMPI中广泛使用。开发人员使用的一般经验法则是:

不要将常量用于重要值,而是将其作为MCA参数。

如果一个任务可以以多种用户可识别的方式实现,那么就要实现尽可能多的方式,并在运行时使用MCA参数在它们之间进行选择。

例如,一个易于描述的MCA参数是TCP有线传输中短消息和长消息之间的边界。“短”消息被急切地发送,而“长”消息则使用会合协议。这两个协议之间的决定点是消息的总体大小(以字节为单位)。 通过将该值设为MCA参数,用户或系统管理员可以在运行时对其进行更改,以使用特定环境或硬件集的合理值(例如,适用于1Gpbs以太网的值可能不适用于100吉比特以太网,并且可能需要第三个不同的值用于25吉比特以太网)。

备注

可以查看源代码的目录结构可以看到框架结构。更多知识可查看 The ABCs of Open MPI

3.2 设置MCA参数值

MCA参数可以以几种不同的方式设置。

以下是设置MCA参数的不同方法,按优先级顺序列出:

1.命令行参数

最高优先级的方法是在命令行上设置MCA参数。例如:

shell$ mpirun --mca mpi_show_handle_leaks 1 -np 4 a.out

在使用4个进程运行a.out之前,将MCA参数mpi_show_handle_leaks设置为值1。通常,命令行中使用的格式为--mca<param_name><value>。

通过命令行设置Open MPI MCA参数需要使用--MCA CLI选项。通过配置文件设置特定于PMIx和PRRTE的MCA参数时,请使用不同的CLI选项:

Open MPI

--mca

PMIx

--pmixmca

PRRTE

--prtemca

2.环境变量

接下来,搜索环境变量。将使用任何名为OMPI_MCA_<param_name>的环境变量。例如,下面的效果与上一个示例相同(对于sh shell):

shell$ export OMPI_MCA_mpi_show_handle_leaks=1
shell$ mpirun -np 4 a.out

3.MCA优化参数文件

简单的文本文件可用于设置特定应用程序的MCA参数值。

mpirun --tune CLI选项允许用户在单个文件中指定MCA参数和环境变量。

优化参数文件中设置的MCA参数将覆盖全局参数文件(例如$HOME/.openmpi/MCA params.conf)中提供的任何MCA参数,但不覆盖命令行或环境参数。

考虑一个调优后的参数文件名foo.conf,它与应用程序a.out位于同一目录中。用户通常会以以下方式运行应用程序:

shell$ mpirun -np 2 a.out

要使用foo.conf调优的参数文件,此命令行将更改为:

shell$ mpirun -np 2 --tune foo.conf a.out

如果要使用多个文件,则可以耦合调谐的参数文件。如果有另一个名为bar.conf的调优参数文件,可以按如下方式将其添加到命令行:

shell$ mpirun -np 2 --tune foo.conf,bar.conf a.out

调优文件的内容由一行或多行组成,每行包含零个或多个-x和-mca选项。不允许发表评论。例如,以下优化文件:

-x envvar1=value1 -mca param1 value1 -x envvar2
-mca param2 value2
-x envvar3

相当于:

shell$ mpirun \
    -x envvar1=value1 -mca param1 value1 -x envvar2 \
    -mca param2 value2
    -x envvar3 \
    ...rest of mpirun command line...

尽管调优参数文件的典型用例是在命令行上指定的,但它们也可以在环境中设置为MCA参数。MCA参数MCA_base_envvar_file_prefix包含一个逗号分隔的优化参数文件列表, 这些文件将被传递给--tune命令行选项。MCA参数MCA_base_envvar_file_path指定搜索具有相对路径的优化文件的路径。

4.配置文件

最后,可以使用简单的配置文本文件来设置MCA参数值。参数每行设置一个(允许注释)。例如:

# This is a comment
# Set the same MCA parameter as in previous examples
mpi_show_handle_leaks = 1

请注意,在MCA参数文件中设置多字值时不需要引号。事实上,如果在MCA参数文件中使用引号,它们将被用作值本身的一部分。例如:

# The following two values are different:
param1 = value with multiple words
param2 = "value with multiple words"

默认情况下,将搜索两个文件(按顺序):

1.$HOME/.openmpi/mca-params.conf:用户提供的值集具有最高优先级。

2.$prefix/etc/openmpi-mca-params.conf:系统提供的一组值的优先级较低。

更具体地说,MCA参数MCA_param_files指定用于搜索MCA参数的文件的冒号分隔路径。左边的文件优先级较低;右边的文件具有更高的优先级。

3.3 显示MCA参数值

MCA参数是Open MPI的“生命之血”。MCA参数用于控制OpenMPI的详细和大规模行为,并存在于整个代码库中。

这就提出了一个重要的问题:由于MCA参数可以从文件、环境、命令行设置,甚至可以在Open MPI内部设置,因此我如何真正知道我工作所看到的MCA参数及其值?

当然,一种方法是使用ompi_info命令,该命令在其他地方有介绍(您可以使用man ompi_info或ompi_info --help来获取有关该命令的更多信息)。然而,这仍然不能完全回答这个问题,因为ompi_info不是MPI进程。

为了帮助解决此问题,Open MPI提供了MCA参数MPI_show_MCA_params,该参数指示MPI_COMM_WORLD秩为0的进程报告MCA参数的名称、该进程看到的当前值以及设置该值的源。 该参数可以采用多个值来定义要报告的MCA参数:

  • all:报告所有MCA参数。请注意,这通常会生成一个相当长的参数列表,因为它包括Open MPI中定义的所有默认参数

  • default:处于默认设置的MCA参数,即处于Open MPI中设置为默认值的所有MCA参数

  • file:MCA参数的值由文件设置

  • api:使用Open MPI的内部api设置MCA参数,可能是为了覆盖用户指定的一组不兼容的条件

  • enviro:MCA参数,从本地环境或命令行获得其值。Open MPI将环境参数和命令行参数视为等效参数,因此目前无法分离这两个源

这些选项可以通过逗号分隔以任意顺序组合。

以下是此参数生成的输出示例:

shell$ $ mpirun -n 4 --mca mpi_show_mca_params enviro hello_c
[login04:4194043] mca_base_component_show_load_errors=0 (environment)
[login04:4194043] mca_component_show_load_errors=0 (environment)
[login04:4194043] mpi_show_mca_params=enviro (environment)
Hello, world, I am 2 of 4, (Open MPI v5.0.3, package: Open MPI root@login04 Distribution, ident: 5.0.3, repo rev: v5.0.3, Apr 08, 2024, 107)
Hello, world, I am 0 of 4, (Open MPI v5.0.3, package: Open MPI root@login04 Distribution, ident: 5.0.3, repo rev: v5.0.3, Apr 08, 2024, 107)
Hello, world, I am 3 of 4, (Open MPI v5.0.3, package: Open MPI root@login04 Distribution, ident: 5.0.3, repo rev: v5.0.3, Apr 08, 2024, 107)
Hello, world, I am 1 of 4, (Open MPI v5.0.3, package: Open MPI root@login04 Distribution, ident: 5.0.3, repo rev: v5.0.3, Apr 08, 2024, 107)

请注意,除了用户实际设置的MCA参数外,还会显示Open MPI本身为内部使用而设置的几个MCA参数。

3.4 选择在运行时使用哪些Open MPI组件

每个MCA框架都有一个顶级MCA参数,该参数有助于指导在运行时选择使用哪些组件。具体来说,每个框架都有一个同名的MCA参数,该参数可用于从给定的运行中包括或排除组件。

例如,btl MCA参数用于控制使用哪些btl组件。它采用逗号分隔的组件名称列表,并且可以选择性地以^作为前缀。例如:

备注

字节传输层(BTL)框架与ob1点对点消息层(PML)组件一起用作底层网络传输。

# Tell Open MPI to include *only* the BTL components listed here and
# implicitly ignore all the rest:
shell$ mpirun --mca btl self,sm,usnic ...

# Tell Open MPI to exclude the tcp and uct BTL components
# and implicitly include all the rest
shell$ mpirun --mca btl ^tcp,uct ...

请注意,^只能是整个逗号分隔列表的前缀,因为包含和排除行为是互斥的。具体来说,由于排他性行为意味着“使用除这些组件外的所有组件”, 因此将其与不指定它的包容性行为(即“使用所有这些组件”)混合在一起是没有意义的。因此,类似这样的事情:

shell$ mpirun --mca btl self,sm,usnic,^tcp ...

没有意义,而且会导致错误,因为它说“只使用self、sm和usnic组件”,但也“使用除tcp之外的所有组件”。这两种说法显然相互矛盾。

参考资料

  1. OpenMPI官网

  2. OpenMPI文档

  3. OpenMPI Project

  4. mpi-forum文档

  5. The ABCs of Open MPI

  6. PMIx标准

  7. PMIx实现

  8. PMIx: Process management for exascale environments


最后更新: 2025 年 06 月 30 日