MPI Spawn方法请求超5进程时报‘插槽不足’错误求助
问题分析与解决
问题描述
在单进程MPI Python脚本中调用MPI.COMM_WORLD.Spawn(sys.executable, args=["hello.py"], maxprocs=10)时,报错“系统没有足够的插槽来满足应用请求的10个插槽”。但直接执行mpirun -n 10 python hello.py可正常创建10个进程;使用MPI.COMM_SELF.Spawn()也存在同样问题,仅当maxprocs≤5时能正常运行。
系统配置:
- Ubuntu 22.04
- OpenMPI 4.0.7
- mpi4py 3.1.3
- 处理器:10核(Intel Core i7-12650H,6性能核+4能效核)
核心原因
OpenMPI对混合架构处理器(性能核+能效核)的默认资源识别与分配策略导致:
- 默认情况下,OpenMPI可能仅将**性能核(P核)**识别为可用插槽(slot),你的处理器有6个P核,父进程占用1个后,剩余可用插槽为5,因此
maxprocs>5时触发报错。 - 直接用
mpirun -n 10时,OpenMPI自动启用了超订(oversubscribe)机制,允许在插槽不足时创建更多进程;但Spawn方法默认禁用超订,必须显式开启。
解决方案
方案1:Spawn时显式允许超订
在Spawn调用中传入MPI.Info对象并开启超订选项,这是最直接的解决方法:
from mpi4py import MPI import sys # 创建Info对象并设置超订允许 info = MPI.Info() info.set("oversubscribe", "true") # 带info参数调用Spawn child_comm = MPI.COMM_WORLD.Spawn( sys.executable, args=["hello.py"], maxprocs=10, info=info ) # 后续通信操作... child_comm.Disconnect()
方案2:修改OpenMPI全局插槽配置
通过配置文件让OpenMPI识别所有10个核心为可用插槽:
- 在家目录创建
.openmpi文件夹(如果不存在):mkdir -p ~/.openmpi - 创建
mca-params.conf文件并添加如下内容:orte_default_hostfile_slots=10 - 保存后重新运行Spawn脚本即可。
方案3:调整进程绑定策略
如果父进程被绑定到多个核心导致插槽占用过多,可在启动父进程时指定绑定策略:
mpirun --bind-to none -n 1 python parent_script.py
--bind-to none会取消进程绑定,让OpenMPI更灵活地分配剩余资源。
内容的提问来源于stack exchange,提问作者Pavan
相关产品推荐
相关产品推荐

