openmpi使用mpirun命令执行串行或并行作业,以下介绍常用mpirun参数,mpirun参数的详细介绍见:
https://www.open-mpi.org/doc/current/man1/mpirun.1.php
--allow-run-as-root
允许使用root用户运行程序。
-np,-n <num>
执行MPI程序的进程总数。
-N, --npernode <num>
每个节点运行的进程数,已弃用,但也可以用,建议使用--map-by ppr:n:node,如--map-by ppr:32:node:每个节点运行32个进程。
--hostfile, --machinefile <filename>
MPI进程分配文件,记录进程在那些节点上运行,如下文件表示进程运行在node1~node4节点上。也可以写ip代替,建议使用ip。
node1
node2
node3
node4
--host <hostname1:num1,hostname2:num2,…>
列出运行MPI程序的主机列表,以及每个节点上运行的进程数。
--map-by node
将进程数映射到节点上,通常与-np, --hostfile一起使用,如:
mpirun -np 64 --hostfile nodes --map-by node …
将64个进程平均映射到nodes指定的节点上。
--bind-to core
将MPI进程绑定到CPU核上,避免进程在CPU核之间切换带来的开销,可以减轻cache争抢现象,提高MPI 程序的性能。
map-by和bind-to的区别
map-by是将MPI进程分配到指定位置(节点级别),比如某个节点上;bind-to是将MPI进程绑定到指定处理器上,比如CPU核上,粒度更小。可使用--report-bindings参数查看绑定情况,如下图所示:
1.将8个MPI进程平均分配到2个节点,绑定到固定CPU核上。

2. 将8个MPI进程平均分配到2个节点,绑定到socket上,进程在绑定socket里的CPU上随机分配。


--map-by ppr:n:node:PE=m
为每个节点分配n个MPI进程,每个MPI进程分配m个CPU核

-x NAME[=value]
在执行程序之前将指定的环境变量NAME传递给远程节点,或者将环境变量NAME设置为value并传递给远程节点。如:
mpirun -x UCX_TLS=self,sm,rc -x UCX_NET_DEVICES=mlx5_0:1 …
使用环境变量UCX_TLS设置MPI使用的通信协议为self,sm,rc;使用环境变量UCX_NET_DEVICES指定ib网络端口。
--mca <key> <value>
设置mca参数,openmpi的设计以组件架构(MPI Component Architecture, MCA)为中心,可通过运行时在mpirun命令中设置mca参数来加载openmpi的各类组件模块,实现特定功能。可使用如下命令查询openmpi支持的mca参数:
列出所有组件的mca参数以及当前值
ompi_info --param all all --level 9
列出BTL组件的mca参数以及当前值
ompi_info --param btl all --level 9
下面举一些例子来说明如何设置mca参数,mca设置包含include和exclude功能
1. include功能
如下命令只包含btl组件的openib,self,vader模块,也就是说btl的其他模块将被排除在外
mpirun --mca btl openib,self,vader
2. exclude功能
如下命令排除btl组件的openib,self,vader模块,也就是说btl的其他模块将会被包含
mpirun --mca btl ^openib,self,vader
注意:include和exclude不可混用
mpirun示例
mpirun --hostfile nodes --allow-run-as-root -map-by ppr:24:node:pe=4 --bind-to core --display-map --mca pml ucx --mca btl ^openib --mca io romio321 -x UCX_TLS=self,sm,rc -x UCX_NET_DEVICES=mlx5_0:1 ./wrf.exe
说明:
使用多节点运行wrf.exe,每个节点运行24个进程,给每个进程分配4个CPU核;使用pml组件的ucx模块;不使用btl组件的openib模块;使用并行io;通信协议使用self,sm,rc;指定ib网络端口为mlx5_0:1。
WARNING: There was an error initializing an OpenFabrics device.
openmpi 4.0及以后的版本,如果使用ib网络,会遇到如下告警

原因:
该告警是由btl组件的openib模块给出的,该模块在openmpi 4.0及以后的版本中被弃用了,该模块由pml组件的ucx模块实现,openmpi默认会使用ucx模块。
解决办法:
1.在安装openmpi的时候,configure时加--without-verbs参数。
2.使用如下命令去除btl模块:
mpirun --mca ^btl
https://www.open-mpi.org/faq/?category=openfabrics#run-ucx
参考文档
openmpi常见问题解答:
https://www.open-mpi.org/faq/
ucx参数介绍:
https://github.com/openucx/ucx/wiki/UCX-environment-parameters
openmpi使用mpirun命令执行串行或并行作业,以下介绍常用mpirun参数,mpirun参数的详细介绍见:
https://www.open-mpi.org/doc/current/man1/mpirun.1.php
--allow-run-as-root
允许使用root用户运行程序。
-np,-n <num>
执行MPI程序的进程总数。
-N, --npernode <num>
每个节点运行的进程数,已弃用,但也可以用,建议使用--map-by ppr:n:node,如--map-by ppr:32:node:每个节点运行32个进程。
--hostfile, --machinefile <filename>
MPI进程分配文件,记录进程在那些节点上运行,如下文件表示进程运行在node1~node4节点上。也可以写ip代替,建议使用ip。
node1
node2
node3
node4
--host <hostname1:num1,hostname2:num2,…>
列出运行MPI程序的主机列表,以及每个节点上运行的进程数。
--map-by node
将进程数映射到节点上,通常与-np, --hostfile一起使用,如:
mpirun -np 64 --hostfile nodes --map-by node …
将64个进程平均映射到nodes指定的节点上。
--bind-to core
将MPI进程绑定到CPU核上,避免进程在CPU核之间切换带来的开销,可以减轻cache争抢现象,提高MPI 程序的性能。
map-by和bind-to的区别
map-by是将MPI进程分配到指定位置(节点级别),比如某个节点上;bind-to是将MPI进程绑定到指定处理器上,比如CPU核上,粒度更小。可使用--report-bindings参数查看绑定情况,如下图所示:
1.将8个MPI进程平均分配到2个节点,绑定到固定CPU核上。
2. 将8个MPI进程平均分配到2个节点,绑定到socket上,进程在绑定socket里的CPU上随机分配。
--map-by ppr:n:node:PE=m
为每个节点分配n个MPI进程,每个MPI进程分配m个CPU核
-x NAME[=value]
在执行程序之前将指定的环境变量NAME传递给远程节点,或者将环境变量NAME设置为value并传递给远程节点。如:
mpirun -x UCX_TLS=self,sm,rc -x UCX_NET_DEVICES=mlx5_0:1 …
使用环境变量UCX_TLS设置MPI使用的通信协议为self,sm,rc;使用环境变量UCX_NET_DEVICES指定ib网络端口。
--mca <key> <value>
设置mca参数,openmpi的设计以组件架构(MPI Component Architecture, MCA)为中心,可通过运行时在mpirun命令中设置mca参数来加载openmpi的各类组件模块,实现特定功能。可使用如下命令查询openmpi支持的mca参数:
列出所有组件的mca参数以及当前值
ompi_info --param all all --level 9
列出BTL组件的mca参数以及当前值
ompi_info --param btl all --level 9
下面举一些例子来说明如何设置mca参数,mca设置包含include和exclude功能
1. include功能
如下命令只包含btl组件的openib,self,vader模块,也就是说btl的其他模块将被排除在外
mpirun --mca btl openib,self,vader
2. exclude功能
如下命令排除btl组件的openib,self,vader模块,也就是说btl的其他模块将会被包含
mpirun --mca btl ^openib,self,vader
注意:include和exclude不可混用
mpirun示例
mpirun --hostfile nodes --allow-run-as-root -map-by ppr:24:node:pe=4 --bind-to core --display-map --mca pml ucx --mca btl ^openib --mca io romio321 -x UCX_TLS=self,sm,rc -x UCX_NET_DEVICES=mlx5_0:1 ./wrf.exe
说明:
使用多节点运行wrf.exe,每个节点运行24个进程,给每个进程分配4个CPU核;使用pml组件的ucx模块;不使用btl组件的openib模块;使用并行io;通信协议使用self,sm,rc;指定ib网络端口为mlx5_0:1。
WARNING: There was an error initializing an OpenFabrics device.
openmpi 4.0及以后的版本,如果使用ib网络,会遇到如下告警
原因:
该告警是由btl组件的openib模块给出的,
该模块在openmpi 4.0及以后的版本中被弃用了,该模块由pml组件的ucx模块实现,openmpi默认会使用ucx模块。解决办法:
1.在安装openmpi的时候,configure时加--without-verbs参数。
2.使用如下命令去除btl模块:
mpirun --mca ^btl
https://www.open-mpi.org/faq/?category=openfabrics#run-ucx
参考文档
openmpi常见问题解答:
https://www.open-mpi.org/faq/
ucx参数介绍:
https://github.com/openucx/ucx/wiki/UCX-environment-parameters