MPI学习笔记-mpirun命令

在OpenMPI中,使用mpirun、mpiexec命令在不同节点拉起MPI进程,并传入各种设置参数。为保证程序正常运行,需要传入正确的参数。这里记录常用方法。

基本语法

单个程序运行在多个节点:

mpirun [参数] <程序> [ <程序参数> ]

多个不同程序运行在不同节点:

mpirun [全局参数] 
	   [局部参数] <程序1> [ <程序1参数> ]
	   [局部参数] <程序2> [ <程序2参数> ]
	   [局部参数] <程序3> [ <程序3参数> ]
	   ...

指定运行数量和位置

mpirun [-n X] <program>

该命令将会在“本地环境”中启动X个进程,“本地环境”是指slurm等资源管理器等提供的环境或者host参数指定的主机。如果没有管理器,将会在本地localhost上启动进程。

在简单环境中,OpenMPI使用SSH连接远程主机启动,此时需要提供远程主机地址和运行进程数量,并需要能免密SSH登录远程主机。

mpirun --host node1:N,node2:2 <program>

上述命令在node1节点上运行N个程序,在node2节点上运行2个程序。其中nodex是可以解析的域名,直接使用ip地址也可以。

更多的是使用hostfile文件:

mpirun --hostfile <host.txt path> <program>

文件内容如下:

# comment line
node1 slots=2
node2 slots=3

node3 

slots参数说明了该节点支持的最大进程数,可以和-n配合指定一个节点运行的程序数量:

mpirun -n 3 --hostfile host.txt <program>
# host.txt
node1 slots=1
node2 slots=2

常用参数

  • --x <var>

用于传递环境变量。如--x LD_LIBRARY_PATH将本地的链接库路径覆盖过去,统一库路径,防止其他节点没有添加,如/usr/local/lib之类的路径;也可以像这样--x USE_WSL=1,设置环境变量。

如果只是想要添加而不是覆盖,使用以下命令。

  • --append-env/--prepend-env

--prepend-envar LD_LIBRARY_PATH[:] foo/lib等于LD_LIBRARY_PATH=foo/lib:$LD_LIBRARY_PATH

--append-envar LD_LIBRARY_PATH[:] foo/lib等于LD_LIBRARY_PATH=$LD_LIBRARY_PATH:foo/lib

补充环境变量。

  • --allow-run-as-root

运行进程以root运行(及不推荐使用),这将赋予程序对系统的全部控制权限,非必要不要使用。

  • --stdin <list>

指定接收stdin的进程,可选参数:all,Rank数字,none。默认是0表示Rank0进程接受。

  • --enable-recovery--max-restarts

允许失败进程重启,默认关闭;最大重启次数。

  • --mca

Open MPI 的模块化组件架构系统参数配置,语法如下,常用见下一节:

mpirun --mca <组件名>_<参数名> <值>

其他组件有其他的参数传入方式:

名称 命令行参数
Open MPI --mca
PMIx --pmixmca
PRRTE --prtemca

MCA组件参数设置

  • btl_tcp_if_include

白名单:TCP 只使用指定网段/网卡。如果使用网卡,需要保证每个节点的网卡名相同,否则使用网段限制。

# 假设所有节点的计算网都在 10.0.0.0/24 网段
mpirun -mca btl_tcp_if_include "10.0.0.0/24" --np 4 ./app
# 适用于同构集群(所有节点网卡名相同)
mpirun -mca btl_tcp_if_include "eth1" --np 4 ./app

使用场景:节点有多张网卡,其中一张可以互联但是另一张不行,MPI进行通信时需要指定发起连接的网络接口。(hostfile中的只能控制ssh通信,MPI的通信需另设置)

  • btl_tcp_if_exclude

与上面的互斥,黑名单。

mpirun -mca btl_tcp_if_exclude "lo,eth0" ...

使用示例

对jetson PCIe虚拟网卡互联场景中,两节点网卡名不一致,一个节点跑管理进程和计算进程,另一个节点跑一个计算进程,以通过/etc/hosts文件设置好了解析,两者依赖安装路径一致:

mpirun -np 3 \
      -hostfile "$HOSTS_FILE" \
      -mca btl_tcp_if_include "10.0.0.0/24" \
      -x LD_LIBRARY_PATH \
      "$EXEC_PATH"
# HOSTS_FILE
# 主机 A (执行脚本的机器):运行主进程 + 计算进程1
node1 slots=2
# 主机 B (另一台机器):运行计算进程2
node2 slots=1

参考文章

官方文档

posted @ 2026-08-23 10:14  LO_StacNet  阅读(3)  评论(0)    收藏  举报