1

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 を呼び出すと、パフォーマンスに悪影響を及ぼします。

これをリファクタリングする方法についてのご提案をお待ちしております。

4

1 に答える 1

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)

4andは正確には3正しくないかもしれませんが、考え方は同じです: like-variables を配列としてグループ化し、それらをブロードキャストします。

于 2013-06-30T20:43:17.430 に答える