我正在尝试用 MPI 解决一个简单的问题,我的实现是 MPICH2,我的代码是 fortran。我使用了阻塞发送和接收,这个想法很简单但是当我运行它时它崩溃了!!!我完全不知道出了什么问题?有人可以就这个问题报价吗?有一段代码:
integer, parameter :: IM=100, JM=100
REAL, ALLOCATABLE :: T(:,:), TF(:,:)
CALL MPI_COMM_RANK(MPI_COMM_WORLD,RNK,IERR)
CALL MPI_COMM_SIZE(MPI_COMM_WORLD,SIZ,IERR)
prv = rnk-1
nxt = rnk+1
LIM = INT(IM/SIZ)
IF (rnk==0) THEN
ALLOCATE(TF(IM,JM))
prv = MPI_PROC_NULL
ELSEIF(rnk==siz-1) THEN
NXT = MPI_PROC_NULL
LIM = LIM+MOD(IM,SIZ)
END IF
IF (MOD(RNK,2)==0) THEN
CALL MPI_SEND(T(2,:),JM+2,MPI_REAL,PRV,10,MPI_COMM_WORLD,IERR)
CALL MPI_RECV(T(1,:),JM+2,MPI_REAL,PRV,20,MPI_COMM_WORLD,STAT,IERR)
ELSE
CALL MPI_RECV(T(LIM+2,:),JM+2,MPI_REAL,NXT,10,MPI_COMM_WORLD,STAT,IERR)
CALL MPI_SEND(T(LIM+1,:),JM+2,MPI_REAL,NXT,20,MPI_COMM_WORLD,IERR)
END IF
据我了解,当奇数进程成功发送时,偶数进程没有收到任何内容,在某些情况下,当我添加一些打印以观察发生了什么时,我看到变量 NXT 在发送过程中正在发生变化!!!例如,所有奇怪的进程都在向进程 0 发送消息,而不是他们的下一个进程!