【问题标题】:catching a deadlock in a simple odd-even sending在简单的奇偶发送中陷入僵局
【发布时间】:2011-06-03 06:37:37
【问题描述】:

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

【问题讨论】:

  • 提供代码时,请确保它的格式是这样的。将代码行缩进四个空格。您还可以在“提问”页面的右侧获得格式信息。

标签: fortran mpi fortran90


【解决方案1】:

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

【讨论】:

  • 对不起,这是一个大程序的一部分,我只是粘贴了一些部分,我已经在第一个 if 条件之后用这一行分配了 T:ALLOCATE(T(LIM+2,JM+2))
【解决方案2】:

我看不到整个程序,但对我能看到的内容进行一些观察:

1) 确保 rnk、size 和 prv 是整数。可能,prv 是真实的(默认情况下 键入规则)并且您将实数发送到整数,因此标签不匹配,因此出现死锁。

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

【讨论】:

    猜你喜欢
    • 2016-12-05
    • 1970-01-01
    • 2022-07-14
    • 2020-04-07
    • 1970-01-01
    • 1970-01-01
    • 2019-04-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多