混合MPMD程序ppr/pe配置冲突:OpenMPI运行失败求解决方案
问题修正方案
错误原因
你的MPMD命令中存在两个关键问题导致冲突:
- 全局主机参数冲突:
--host abc0:112和--host xyz0:112会被OpenMPI合并为全局节点列表,使得第二个应用尝试在两个节点上分配进程,但其--map-by ppr:7:socket规则要求每个socket跑7个进程,两个节点4个socket需要28个进程,与你指定的-n14进程数不匹配。 --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
相关产品推荐
相关产品推荐

