我正在将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会对性能产生负面影响。
我将非常感谢您就如何重构这一点提出建议。
答案 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)
4
和3
可能不是完全正确,但想法仍然相同:将您喜欢的变量分组为数组并广播它们。