我附上了一份我想写的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`
答案 0 :(得分:1)
这是一个典型的堆栈粉碎场景。您尚未声明status
变量,因此编译器会自动为您生成一个REAL
变量。但status
应该是INTEGER
MPI_STATUS_SIZE
元素数组:
integer, dimension(MPI_STATUS_SIZE) :: status
在您的情况下发生的情况是status
太小而无法容纳实际的MPI状态对象,因此其他一些堆栈变量会被覆盖。只需声明status
,因为它应该被声明以解决问题。
另一件事 - 现代Fortran支持IMPLICIT NONE
语句,该语句禁用未声明变量的自动声明。如果在implicit none
语句之后立即放置include
,编译器将生成错误消息。