我正在尝试使用 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
谢谢你的任何想法!