0

我正在尝试使用 MPI 解决 Fortran 中的一个问题,并且我遇到了一个间歇性错误,其中出现了明显不正确的值。当我使用 MPI_REDUCE 时似乎会出现该错误。

我已将我的代码缩减为尽可能短的一段,但错误仍在发生。除了奇怪的行为外,这段代码毫无用处。尽我所能,我无法进一步隔离它。我不理解这段代码的行为——例如,如果我删除了顶部的子程序(它从未被调用过),那么这个错误似乎就消失了。如果我在声明数组时使用 real,dimension(10,10) 分配数组,则错误似乎消失了,尽管我不认为我当前的分配不正确。即使我在其中更改了一些变量名称,该错误似乎也消失了。这些都没有告诉我为什么存在错误,或者如何在我的较长代码项目中修复它。似乎我未能在某处正确分配内存,或者我使用 MPI_REDUCE 不正确,但我不能

  subroutine foo()
  use netcdf
  integer                          :: iret,ncid
  iret = nf90_open('test.nc',nf90_nowrite,ncid)  !open the mask file
  iret = nf90_close(ncid) !close the mask file 
  return
end subroutine foo

program test
use mpi
integer   :: ierr,pid
real :: diffsum,total_sum
real,allocatable,dimension(:,:) :: c,h,h_old

call MPI_INIT(ierr)       

total_sum = 0.0

call MPI_COMM_RANK(MPI_COMM_WORLD,pid,ierr)

if(pid.ne.0) then
  allocate(h   (10,10))
  allocate(h_old(10,10))
  h(:,:) = 1.0
  h_old(:,:) = 1.0
  allocate(c(10,10))
  c = h_old - h
  diffsum = 0.0
endif

call MPI_REDUCE(diffsum,total_sum,1,MPI_REAL,mpi_sum,0,MPI_COMM_WORLD,ierr)  !to get overall threshold

if(pid.eq.0)then
  print*,'sum',total_sum
endif

call MPI_FINALIZE(ierr)
end program test

打印的值应始终为 0,但有时会出现其他值。以下是 10 次运行的输出示例:

 sum  -3.66304099E+25
 sum   0.00000000    
 sum   0.00000000    
 sum  -3.01998057E+29
 sum   0.00000000    
 sum   0.00000000    
 sum   0.00000000    
 sum   0.00000000    
 sum   0.00000000    
 sum   0.00000000    

谢谢你的任何想法!

4

0 回答 0