F77 プログラムを最新の Fortran 標準 (90 以降) にリファクタリングしています。
いくつかの変数が定義されているモジュールがあります。これらの変数は現在、共通ブロックに配置されています。外部サブルーチンでは、これらの変数はすべて、1 つの 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 を呼び出すと、パフォーマンスに悪影響を及ぼします。
これをリファクタリングする方法についてのご提案をお待ちしております。