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

Open MPI超订阅(--oversubscribe)运行MPI程序触发Segmentation fault求助

超订阅运行MPI程序触发段错误的排查方案

问题背景

使用Open MPI 4.1.2,执行命令mpirun -np 8 --oversubscribe ./a运行进程数超过CPU核心数的MPI C程序时,触发Segmentation fault(段错误),错误日志如下:

[0piero:68195] *** Process received signal ***
[0piero:68195] Signal: Segmentation fault (11)
[0piero:68195] Signal code: Address not mapped (1)
[0piero:68195] Failing at address: 0x7fd162194c80
[0piero:68185] *** Process received signal ***
[0piero:68185] Signal: Segmentation fault (11)
[0piero:68185] Signal code: Address not mapped (1)
[0piero:68185] Failing at address: 0x7ffbf42f13e0
[0piero:68185] [ 0] /lib/x86_64-linux-gnu/libc.so.6(+0x42520)[0x7ffbf88e2520]
[0piero:68185] [ 1] /lib/x86_64-linux-gnu/libstdc++.so.6(+0xdc2b0)[0x7ffbf48d42b0]
[0piero:68185] [ 2] /lib/x86_64-linux-gnu/libc.so.6(+0x94b43)[0x7ffbf8934b43]
[0piero:68185] [ 3] /lib/x86_64-linux-gnu/libc.so.6(+0x126a00)[0x7ffbf89c6a00]
[0piero:68185] *** End of error message ***
--------------------------------------------------------------------------
Primary job  terminated normally, but 1 process returned
a non-zero exit code. Per user-direction, the job has been aborted.
--------------------------------------------------------------------------
--------------------------------------------------------------------------

排查与解决步骤

  • 先验证超订阅是否为诱因:
    改用等于CPU核心数的进程数运行(比如mpirun -np 4 ./a,根据实际核心数调整),如果仍触发段错误,说明问题根源是程序本身的内存操作错误,和超订阅无关。
  • 检查程序内存常见问题:
    • 数组越界:确认所有数组访问的索引是否在定义范围内,比如int arr[10];不能访问arr[10]及以上位置。
    • 空指针/野指针:检查是否存在未初始化的指针、释放内存后仍引用的指针,或者指向已释放内存的指针。
    • 栈溢出:如果局部变量定义了超大数组(比如int big_arr[1024*1024];),会导致栈空间不足,改用malloc/calloc动态分配内存到堆区。
  • 用调试工具精准定位:
    1. 编译时添加调试信息:mpicc -g your_program.c -o a
    2. 用GDB调试:执行mpirun -np 8 --oversubscribe xterm -e gdb ./a,在触发错误的终端中输入bt查看调用栈,直接定位到出错的代码行。
    3. 用Valgrind检测内存问题:执行mpirun -np 8 --oversubscribe valgrind ./a,它会详细报告内存泄漏、越界访问、非法指针等问题。
  • Open MPI相关排查:
    • 升级Open MPI版本:4.1.2存在部分已知bug,可升级到4.1.x系列的最新稳定版(如4.1.5)或更高大版本。
    • 调整环境变量:如果程序混用OpenMP,设置export OMP_NUM_THREADS=1避免MPI进程和OpenMP线程抢占资源。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.07 03:50:28