0

私が書こうとしている MPI プログラムのサンプルを添付しました。「mpirun -np 4 a.out」を使用してこのプログラムを実行すると、出力は次のようになります。

 Sender:            1
 Data received from            1
 Sender:            2
 Data received from            1
 Sender:            2

そして、実行はそこにぶら下がっています。Sender 変数が MPI_recv の後で値を変更する理由がわかりません。何か案は?

ありがとう、プラディープ

` プログラム mpi_test

    include  'mpif.h'

!----------------( Initialize variables )-------------------- 
  integer, dimension(3) :: recv, send

  integer :: sender, np, rank, ierror

  call  mpi_init( ierror )
  call  mpi_comm_rank( mpi_comm_world, rank, ierror )
  call  mpi_comm_size( mpi_comm_world, np, ierror )

!----------------( Main program )-------------------- 

!     receive the data from the other processors
  if (rank.eq.0) then
     do sender = 1, np-1
        print *, "Sender: ", sender
        call mpi_recv(recv, 3, mpi_int, sender, 1,
 &       mpi_comm_world, status, ierror)
        print *, "Data received from ",sender
     end do
  end if

!   send the data to the main processor
  if (rank.ne.0) then
     send(1) = 3
     send(2) = 4
     send(3) = 4
     call mpi_send(send, 3, mpi_int, 0, 1, mpi_comm_world, ierr)
  end if


!----------------( clean up )-------------------- 
  call mpi_finalize(ierror)

  return
  end program mpi_test`
4

1 に答える 1

1

これは典型的なスタック破壊シナリオです。変数を宣言していないstatusため、コンパイラは自動的に 1 つのREAL変数を作成します。しかし、むしろ要素の配列でstatusあるべきです:INTEGERMPI_STATUS_SIZE

integer, dimension(MPI_STATUS_SIZE) :: status

あなたの場合status、実際の MPI ステータス オブジェクトを保持するには小さすぎるため、他のスタック変数の一部が上書きされます。status問題を解決するには、宣言する必要があるとおりに宣言するだけです。

もう 1 つのこと - 最新の Fortran は、IMPLICIT NONE宣言されていない変数の自動宣言を無効にするステートメントをサポートしています。ステートメントのimplicit none直後に置くと、コンパイラは代わりにエラー メッセージを生成します。include

于 2013-02-18T16:35:50.193 に答える