Question

I am refactoring F77 program to more recent Fortran standard (90 or even newer).

I have a module where some variables defined. These variables are currently put into common block, because in external subroutine all these variables are broadcasted using only one MPI_BCAST call and exploiting contiguous storage of variables in this common block.

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

Problem is that length of common block com_length is calculated manually and error prone. If COMMON block definition is missing, debug will take ages because even valgrind won't notice OOB. On the other hand, calling MPI_BCAST separately for each variable will negatively impact performance.

I will appreciate your suggestions on how to refactor this.

Was it helpful?

Solution

You could do it in 2 MPI_BCAST calls.

  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)

The 4 and 3 may not be exactly right, but the idea is still the same: group your like-variables as an array and broadcast them.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top