MPI_RECV получает значение 0, когда переменная используется в качестве источника, но получает правильное значение, когда номер источника жестко задан - PullRequest
0 голосов
/ 31 августа 2010

Я пытаюсь получить переменную из нескольких обработанных как часть цикла DO.Однако значение переменной равно 0 после операции, если я использую переменную для представления номера процессора.Это работает нормально, если я введу номер процессора напрямую.Как ни странно, точно такой же код прекрасно работает ранее в программе.Любые мысли по моей проблеме?

  DO s = 1,numproc-1,1
        CALL MPI_RECV( numZERO, 1, MPI_INTEGER, s, 1, MPI_COMM_WORLD, status, ierr )
        WRITE(*,*)'s',s,'numZERO',numZERO
  END DO

дает:

  s   1   numZERO   0
  s   2   numZERO   0 ...

когда она закодирована:

  CALL MPI_RECV( numZERO, 1, MPI_INTEGER, 1, 1, MPI_COMM_WORLD, status, ierr )
  WRITE(*,*)'1 numZERO',numZERO
  CALL MPI_RECV( numZERO, 1, MPI_INTEGER, 2, 1, MPI_COMM_WORLD, status, ierr )
  WRITE(*,*)'2 numZERO',numZERO

Я получаю

  1 numZERO   1
  2 numZERO   2 ...

s является целым числом.

1 Ответ

0 голосов
/ 09 сентября 2011

"ierr" будет бесполезным. Реализации Fortran MPI по умолчанию ничего не возвращают. Они понимают, что вы не собираетесь это проверять, поэтому авторы бомбят с ошибкой, а не пропускают что-то полезное. Вы можете запросить возврат ошибок MPI.

Вы можете проверить «статус», потому что в очень редких случаях это полезно.

"S" должно быть целым числом правильного размера (обычно целое число * 4). Это все, что я мог считать неправильным.

...