在一个简单的奇偶发送中陷入僵局

时间:2011-01-04 08:50:53

标签: fortran mpi fortran90

我正在尝试用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发送消息而不是下一个进程!

2 个答案:

答案 0 :(得分:1)

数组T未分配,因此从中读取或写入是错误。

答案 1 :(得分:0)

我无法看到整个程序,但我可以看到一些观察结果:

1)确保rnk,size和prv是整数。可能,prv是真实的(默认情况下)   你正在发送一个实数到整数,所以标签不匹配,因此死锁。

2)我使用sendrcv而不是send / recv; recv /发送代码部分。两个sendrecv更干净(2行代码与7行),保证不会死锁,并且当你有双向链接时更快(几乎总是如此)。