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

MPI_Comm_split_type(共享内存)进程数增加时挂起的原因排查

OpenMPI多节点MPI_Comm_split_type挂起问题排查

问题描述

在OpenMPI多节点集群上运行MPI_Allgather时遭遇内存空间瓶颈,遂使用MPI_Comm_split_type(MPI_COMM_WORLD, MPI_COMM_TYPE_SHARED, 0, MPI_Info_null, shmcomm, ierr)创建共享内存通信子优化内存占用,但当每节点进程数设置为4以上时,程序卡在该调用步骤无法继续。运行命令如下:

mpiexec -n 16 --N 8 --mca btl_openib_allow_ib true --mca orte_base_help_aggregate 0 ./main

已尝试多种mpiexec配置调整,问题仍未解决,需明确进程数增加时该调用挂起的常见原因。

复现代码

program mpi_allgather_array_example
  use mpi

  implicit none
  integer :: ierr, my_rank, num_procs, i,shmcomm, my_rank_scm, num_procs_scm
  integer, parameter :: n = 2
  integer, allocatable :: send_buf(:), recv_buf(:),total_buff(:)
  ! Initialize MPI
  call MPI_Init(ierr)
  call MPI_Comm_split_type(MPI_COMM_WORLD,MPI_COMM_TYPE_SHARED, 1,&
    MPI_Info_null, shmcomm,ierr)
  call MPI_Comm_rank(MPI_COMM_WORLD, my_rank, ierr)
  call MPI_Comm_size(MPI_COMM_WORLD, num_procs, ierr)
  call MPI_Comm_rank(shmcomm, my_rank_scm, ierr)
  call MPI_Comm_size(shmcomm, num_procs_scm, ierr)
  ! Allocate memory for send and receive buffers
  print *, "starting allocation"
  allocate(send_buf(n), recv_buf((n*num_procs_scm)), total_buff(n*num_procs))

  ! Initialize send buffer
  send_buf = (my_rank + 1) * (/ (i, i=1, n) /)

  ! Gather data from all processes to all processes in shmcomm
  call mpi_barrier(shmcomm,ierr)
  call MPI_allgather(send_buf, n, MPI_INTEGER,&
                     recv_buf, n, MPI_INTEGER,&
                     shmcomm, ierr)
  ! Output the received data
  print *, 'Process', my_rank, 'received:', recv_buf
  call MPI_Finalize(ierr)

end program mpi_allgather_array_example

进程数增加时MPI_Comm_split_type挂起的常见原因

  • 共享内存资源不足:节点/dev/shm分区的可用空间有限,当每节点进程数超过4时,创建共享内存通信子所需的内存超出系统限制,进程因等待资源释放而阻塞。可通过df -h /dev/shm查看空间,或调整kernel.shmmax、kernel.shmall等系统参数扩大共享内存上限。
  • NUMA节点绑定冲突:若每节点进程数超过NUMA节点核心数,进程可能被分配到不同NUMA节点,而MPI_COMM_TYPE_SHARED默认将同一NUMA节点的进程归为一组。跨NUMA节点的进程无法共享内存通信子的资源,导致拆分操作挂起。可通过--bind-to numa或--bind-to core调整进程绑定策略。
  • BTL组件兼容性问题:OpenMPI的btl_openib与共享内存组件(如btl_vader、btl_sm)可能存在资源竞争或兼容性缺陷,进程数增加时冲突加剧,导致通信子拆分失败。可尝试添加--mca btl ^openib禁用InfiniBand组件,仅用共享内存组件测试。
  • MPI_Comm_split_type键值参数错误:代码中第三个参数传入固定值1,而非进程相关标识(如my_rank)。虽然该参数用于排序,但错误的键值可能导致进程分组逻辑异常,进程数增加时分组冲突引发挂起。建议将该参数改为my_rank或节点ID,确保同一节点进程被正确分组。
  • 进程启动延迟与同步问题:每节点启动大量进程时,操作系统资源分配存在延迟,部分进程未完成初始化就执行MPI_Comm_split_type,引发同步等待。可尝试添加--mca plm_rsh_no_tree_spawn 1调整进程启动方式,或增加启动延迟。
  • OpenMPI版本BUG:部分旧版本OpenMPI在处理大量共享内存通信子拆分时存在同步逻辑缺陷,导致进程挂起。建议升级至最新稳定版,或查阅官方release notes确认是否有相关修复。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.29 20:24:53