MPI fortran 程序因 MPI 进程数有限而挂起

问题描述

我正在开发一个 MPI 应用程序,该应用程序在使用超过 2071 个 MPI 进程启动时挂起。我已经成功地制作了一个小型复制器:

karma-jasmine-html-reporter

当我用少于 2071 个 MPI 进程运行这个程序时,它可以工作,但是当我用超过 2072 个进程运行它时,它会挂起,就好像发送/接收上有死锁一样。 使用 I_MPI_DEBUG=5 运行程序的输出

program main
use mpi
integer :: ierr,rank
call mpi_init(ierr)
call mpi_comm_rank(MPI_COMM_WORLD,rank,ierr)
if (rank.eq.0) print *,'Start'
call test_func(ierr)
if (ierr.ne.0) call exit(ierr)
call mpi_finalize(ierr)
if (rank.eq.0) print *,'Stop'

contains

subroutine test_func(ierr)
integer,intent(out) :: ierr
real :: send,recv
integer :: i,j,status(MPI_STATUS_SIZE),mpi_rank,mpi_size,ires
character(len=10) :: procname
real(kind=8) :: t1,t2
ierr=0
call mpi_comm_size(MPI_COMM_WORLD,ierr)
call mpi_comm_rank(MPI_COMM_WORLD,ierr)
call mpi_get_processor_name(procname,ires,ierr)
call mpi_barrier(MPI_COMM_WORLD,ierr)
t1 = mpi_wtime()
do j=0,mpi_size-1
  if (mpi_rank.eq.j) then
    do i=0,mpi_size-1
      if (i.eq.j) cycle
      call MPI_RECV(recv,1,MPI_REAL,i,MPI_COMM_WORLD,status,ierr)
      if (ierr.ne.0) return
      if (i.eq.mpi_size-1) print *,'Rank ',procname,' done'
    enddo
  else
    call MPI_SEND(send,ierr)
    if (ierr.ne.0) return
  endif
enddo
call mpi_barrier(MPI_COMM_WORLD,ierr)
t2 = mpi_wtime()
if (mpi_rank.eq.0) print*,"time send/recv = ",t2-t1
end subroutine test_func
end program main

问题 1:是否有理由解释这种行为?

请注意,如果我通过 bcast 更改发送/接收通信模式

[0] MPI startup(): Intel(R) MPI Library,Version 2019 Update 9 Build 20200923 (id: abd58e492)
[0] MPI startup(): copyright (C) 2003-2020 Intel Corporation. All rights reserved.
[0] MPI startup(): library kind: release
[0] MPI startup(): libfabric version: 1.10.1-impi
[0] MPI startup(): libfabric provider: verbs;ofi_rxm
[0] MPI startup(): Rank Pid Node name Pin cpu
[0] MPI startup(): 0 48487 r30i0n0 {0,24}
...
[0] MPI startup(): 2070 34737 r30i4n14 {18,19,20,42,43,44}
[0] MPI startup(): I_MPI_CC=icc
[0] MPI startup(): I_MPI_CXX=icpc
[0] MPI startup(): I_MPI_FC=ifort
[0] MPI startup(): I_MPI_F90=ifort
[0] MPI startup(): I_MPI_F77=ifort
[0] MPI startup(): I_MPI_ROOT=/data_local/sw/intel/RHEL7/compilers_and_libraries_2020.4.304/linux/mpi
[0] MPI startup(): I_MPI_MPIRUN=mpirun
[0] MPI startup(): I_MPI_HYDRA_RMK=lsf
[0] MPI startup(): I_MPI_HYDRA_TOPOLIB=hwloc
[0] MPI startup(): I_MPI_INTERNAL_MEM_POLICY=default
[0] MPI startup(): I_MPI_EXTRA_FILESYstem=1
[0] MPI startup(): I_MPI_EXTRA_FILESYstem_FORCE=lustre
[0] MPI startup(): I_MPI_DEBUG=5

或全集

do j=0,mpi_size-1
  if (mpi_rank.eq.j) then
    call MPI_BCAST(send,ierr)
  else
    call MPI_BCAST(recv,ierr)
  endif
  if (ierr.ne.0) return  
  print *,' done'
enddo

然后程序运行(当然更快)但最多有 4000 个 MPI 进程(我没有尝试更多的 MPI 进程)。但是,我无法使用 bcast 或 allgather 更改原始应用程序中的通信发送/接收模式。

问题 2: 当我使用 2064 个 MPI 进程(86 个节点,24 个内核)运行原始应用程序时,MPI 缓冲区消耗的内存约为每个节点 60 GB 和 1032 个 MPI 进程(43具有 24 个内核的节点)每个节点大约 30 GB。 有没有办法(环境变量...)减少消耗的内存量?

非常感谢您的帮助

蒂埃里

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)