Почему MPI_REDUCE в Фортране дает мне несовместимые значения? - PullRequest
0 голосов
/ 20 июня 2019

Я пытаюсь поработать над проблемой в Фортране, используя 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    

Спасибо за любые идеи!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...