Я пытаюсь поработать над проблемой в Фортране, используя MPI, и я получаю периодическую ошибку с явно некорректными значениями.Ошибка возникает, когда я использую MPI_REDUCE.
Я сократил свой код до максимально короткого сегмента, при этом ошибка все еще происходит.Этот сегмент кода довольно бесполезен, кроме странного поведения.Попробуйте, как я мог, я не могу изолировать это дальше.Я не понимаю поведение этого кода - например, если я удалю подпрограмму вверху (которая никогда не вызывается), ошибка, похоже, исчезнет.Если я назначаю массивы, используя реальное измерение (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
Спасибо за любые идеи!