Fortran 77 - > Fortran 90+:COMMON块,MPI_Bcast

时间:2013-06-30 20:09:32

标签: fortran fortran-common-block

我正在将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 个答案:

答案 0 :(得分:2)

你可以在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)

43可能不是完全正确,但想法仍然相同:将您喜欢的变量分组为数组并广播它们。