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