1

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 にメッセージを送信していました。

4

2 に答える 2

1

配列 T は割り当てられていないため、その配列からの読み取りまたは書き込みはエラーになります。

于 2011-01-04T08:59:44.180 に答える
0

プログラム全体を見ることができませんが、私が見ることができるものについてのいくつかの観察:

1)rnk、size、およびprvが整数であることを確認します。おそらく、prvは実数(デフォルトでは入力規則)であり、実数を整数に送信しているため、タグが一致しないため、デッドロックが発生します。

2)send/recvではなくsendrcvを使用します; recv/送信コードセクション。2つのsendrecvはよりクリーンで(2行のコードと7行)、デッドロックが発生しないことが保証されており、双方向リンクがある場合は高速になります(ほとんどの場合true)。

于 2011-01-21T22:23:16.577 に答える