You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

混合MPMD程序ppr/pe配置冲突:OpenMPI运行失败求解决方案

问题修正方案

错误原因

你的MPMD命令中存在两个关键问题导致冲突:

  1. 全局主机参数冲突:--host abc0:112和--host xyz0:112会被OpenMPI合并为全局节点列表,使得第二个应用尝试在两个节点上分配进程,但其--map-by ppr:7:socket规则要求每个socket跑7个进程,两个节点4个socket需要28个进程,与你指定的-n14进程数不匹配。
  2. --host参数格式错误::112是节点核心数,但OpenMPI的host:slots格式中,slots指的是进程槽数,而非核心数,此设置干扰了资源分配逻辑。

修正后的命令

方案1:硬编码节点名(明确指定应用运行节点)

mpirun \
# 第一个应用:abc0节点,28个进程,每个socket14个,每个进程4线程
--host abc0 -n 28 --map-by ppr:14:socket:pe=4 --bind-to core \
-x OMP_NUM_THREADS=4 -x OMP_PLACES=cores \
./hello_world.exe : \
# 第二个应用:xyz0节点,14个进程,每个socket7个,每个进程8线程
--host xyz0 -n 14 --map-by ppr:7:socket:pe=8 --bind-to core \
-x OMP_NUM_THREADS=8 -x OMP_PLACES=cores \
./hello_world.exe

方案2:利用SLURM环境变量(无需硬编码节点名)

通过salloc分配节点后,SLURM会自动设置节点列表环境变量,可动态指定应用运行节点:

mpirun \
# 第一个应用:运行在SLURM分配的第一个节点
--nodelist $(echo $SLURM_NODELIST | cut -d',' -f1) -n 28 --map-by ppr:14:socket:pe=4 --bind-to core \
-x OMP_NUM_THREADS=4 -x OMP_PLACES=cores \
./hello_world.exe : \
# 第二个应用:运行在SLURM分配的第二个节点
--nodelist $(echo $SLURM_NODELIST | cut -d',' -f2) -n 14 --map-by ppr:7:socket:pe=8 --bind-to core \
-x OMP_NUM_THREADS=8 -x OMP_PLACES=cores \
./hello_world.exe

配置验证

两个方案的资源分配完全匹配你的节点硬件:

  • abc0节点:2个socket × 14进程/socket ×4线程/进程 = 112核心(满负载)
  • xyz0节点:2个socket ×7进程/socket ×8线程/进程 =112核心(满负载)

添加--bind-to core参数可确保线程绑定到物理核心,避免资源竞争,提升运行效率。

内容的提问来源于stack exchange,提问作者Gaurav Saxena

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.18 01:38:13