为什么Fortran中的MPI_REDUCE给我不一致的值?

时间:2019-06-20 20:35:11

标签: fortran mpi intermittent

我正在尝试使用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    

谢谢您的任何想法!

0 个答案:

没有答案
相关问题