Фортран 77 -> Фортран 90+: ОБЩИЕ блоки, MPI_Bcast

Я выполняю рефакторинг программы F77 в соответствии с более новым стандартом Fortran (90 или даже более новый).

У меня есть модуль, где определены некоторые переменные. Эти переменные в настоящее время помещаются в общий блок, потому что во внешней подпрограмме все эти переменные передаются с использованием только одного вызова MPI_BCAST и использования непрерывного хранения переменных в этом общем блоке.

module foo
  implicit none
  integer :: a,b,c,d
  real*8 :: r,t,p
  common/com/ a,b,c,d,r,t,p
end module foo

subroutine bar
  ...
  com_length = 4*4 + 3*8 ! 4 integers + 3 real(8)

  ! bcasting 'com' common block, i.e. all variables at once
  call mpi_bcast(a,com_length,mpi_byte,root,comm,ierr)
  ...
end subroutine bar

Проблема в том, что длина общего блока com_length рассчитывается вручную и подвержен ошибкам. Если определение блока COMMON отсутствует, отладка займет много времени, потому что даже valgrind не заметит OOB. С другой стороны, вызов MPI_BCAST отдельно для каждой переменной отрицательно скажется на производительности.

Я буду признателен за ваши предложения о том, как реорганизовать это.

1 ответ

Решение

Вы могли бы сделать это в 2 MPI_BCAST звонки.

  CALL MPI_BCAST([a, b, c, d], 4, MPI_INTEGER, root, MPI_COMM_WORLD, ierr)
  CALL MPI_BCAST([t, r, p], 3, MPI_DOUBLE_PRECISION, root, MPI_COMM_WORLD, ierr)

4 а также 3 Возможно, это не совсем правильно, но идея все та же: сгруппируйте переменные like в массив и передайте их.

Другие вопросы по тегам