MPI_ALLREDUCE使用许多核心失败

时间:2017-01-25 18:07:42

标签: fortran mpi valgrind openmpi

我有一个代码,我使用一个核心进行了检查,它完美无缺。即使使用valgrind,我也没有获得可能的内存泄漏。但是,当代码(模块失败)时:

module m_solv3Dahv_dir_adj_all
  implicit none

  contains

  subroutine solv3Dahv_dir_adj_all( n_sg, shgat, buoy, cmpr, freq_0_inv, freq_inv, error_sum, grad_sum, illu_sum )
    use m_geo, only: nx, ny, nz
    implicit none
#ifdef mpi
      include 'mpif.h'
#endif
    integer, allocatable, intent(in) :: n_sg(:)
    type(shot_gather), allocatable, intent(inout) :: shgat(:)
    real(rl), intent(in) :: freq_0_inv, freq_inv
    real(rl), intent(out) :: error_sum
    real(rl), allocatable, intent(inout) :: grad_sum(:,:,:), illu_sum(:,:,:)
    real(rl), allocatable, intent(in)  :: cmpr(:,:,:), buoy(:,:,:)

    integer :: ix, iy, iz
    real(rl), allocatable :: v_aux(:)

    ...

    allocate( v_aux(nx), stat=stal ); if ( stal/=0 ) stop 'AE solv3Dahv_dir_adj_all 1'

    ...

#ifdef mpi
    ! Sum gradient for each process.
    do iy=1,ny
    do iz=1,nz
      v_aux = grad_sum(:,iy,iz)
      call MPI_ALLREDUCE( v_aux, grad_sum(:,iy,iz), nx, MPI_DOUBLE_PRECISION, MPI_SUM, MPI_COMM_WORLD, ierr )
    end do
    end do
#endif

    ...

使用MPI部分对可分配grad_sum的值求和,它会断开分段错误。我无法解释它,所以我用valgrind测试了代码,令人惊讶的是代码运行到最后(我只减少迭代次数,否则它永远不会完成),但valgrind多次抱怨{ {1}}。我已经复制了第一个valgrind抱怨(有数百但都相似)。我不知道这个问题,我想这可能是与MPI有关的一些问题,因为当我使用少量核心(三个)时代码会运行,但是,它会破坏20个内核。测试的grad_sum的尺寸很小(nx = 413,ny = 351和nz = 1),因此它不会成为RAM的问题。在具有多个内核的循环中发送许多MPI_ALLREDUCE是否有任何问题?

MPI_ALLREDUCE

0 个答案:

没有答案