MPI发送recv混淆

时间:2013-02-18 12:40:14

标签: mpi

我附上了一份我想写的MPI程序样本。当我使用“mpirun -np 4 a.out”运行该程序时,我的输出是:

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

跑步在那里。我不明白为什么发送者变量在MPI_recv之后改变它的值?有什么想法吗?

谢谢你, 普拉迪普

`program 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`

1 个答案:

答案 0 :(得分:1)

这是一个典型的堆栈粉碎场景。您尚未声明status变量,因此编译器会自动为您生成一个REAL变量。但status应该是INTEGER MPI_STATUS_SIZE元素数组:

integer, dimension(MPI_STATUS_SIZE) :: status

在您的情况下发生的情况是status太小而无法容纳实际的MPI状态对象,因此其他一些堆栈变量会被覆盖。只需声明status,因为它应该被声明以解决问题。

另一件事 - 现代Fortran支持IMPLICIT NONE语句,该语句禁用未声明变量的自动声明。如果在implicit none语句之后立即放置include,编译器将生成错误消息。