我有一个代码,我使用一个核心进行了检查,它完美无缺。即使使用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