0

次のことを考慮してください。

subroutine send_to_friend(a,b,c,request)
  implicit none
  include 'mpif.h'  !use mpi if you've built the mpif90 bindings...

  real a,b,c
  real buff(3)
  integer tag,dest,ierr,request

  tag = 50
  dest = 0

  buff(1) = a
  buff(2) = b
  buff(3) = c
  call MPI_Isend(buff,3,MPI_REAL,dest,tag,MPI_COMM_WORLD,request,ierr)
return
end subroutine send_to_friend

これはbuffスタックに置かれるため(とにかくほとんどの最新のコンパイラで)機能しない可能性がありますが、サブルーチンが終了するたびに完全に消去されます。ここ(セクション10)によると、プロシージャを終了すると、割り当てられた配列の割り当てが自動的に解除されるため、配列の割り当ても役に立ちません。Cでは、これはメモリリークになります(これも悪いことです)。このようなことをするための適切な方法は何ですか?save属性を使用して配列を宣言する必要がありますか?(staticCで)。このデザインはそもそも本質的に欠陥がありますか?

4

1 に答える 1

0

SAVEコピーインコピーアウトを介して配列を渡す必要がある他の問題が発生しない限り、問題はないはずです(割り当て可能と組み合わせるのが最適です)。参照によって実行する必要があります(非割り当て可能ファイルを送信しようとしないでください)。非ブロッキングMPIを使用した連続データ)。

ルーチンに変数がある場合save、MPI / OpenMPを組み合わせる場合は、それ以上のスレッドから実行しようとしないでください。

于 2012-12-11T15:48:32.663 に答える