MPI程序使用2个以上处理器时挂起问题求助
MPI程序使用
mpirun -np >2时挂起的原因分析 你的代码逻辑本身没有问题,MPI_Bcast的调用符合规范,出现超过2进程就挂起的情况,结合你的Open MPI 4.1.5环境和Intel i7-9750H硬件,主要原因集中在Open MPI的通信配置或进程绑定层面:
可能的原因
- 通信机制协商失败:Open MPI本地进程通信会优先用共享内存(
shmem)等高效机制,但部分版本在多核心CPU上,进程数超过2时可能出现通信模块初始化异常,导致进程间无法完成广播同步。 - 进程绑定冲突:你的CPU是6核12线程,Open MPI默认的进程绑定策略可能在分配3个及以上进程时,出现核心资源分配冲突,阻塞了进程间的通信通路。
- 编译宏的潜在干扰:你编译时添加的
-DOMPI_SKIP_MPICXX宏会跳过Open MPI的C++绑定,虽然代码用的是C风格MPI调用,但该宏可能导致进程初始化阶段的通信层加载异常,进而引发死锁。
解决建议
- 强制指定通信模块启动:运行时强制使用共享内存+TCP通信,绕开可能出问题的模块:
mpirun -np 3 --mca btl self,tcp main - 禁用进程绑定:暂时关闭Open MPI的进程绑定功能,避免核心分配冲突:
mpirun -np 3 --bind-to none main - 简化编译选项:移除代码未用到的
-fopenmp,同时暂时去掉-DOMPI_SKIP_MPICXX宏后重新编译:mpic++ -O3 -Wall -Wextra -std=c++11 -march=native -Wpedantic main.cpp -o main - 检查Open MPI配置:通过
ompi_info命令查看已启用的通信模块,确认shmem和tcp模块状态正常。
内容的提问来源于stack exchange,提问作者dragon_and_dracula
相关产品推荐
相关产品推荐

