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

+0

コードを提供する際には、コード行を4つの空白でインデントします。また、「質問の質問」ページの右側に書式設定情報が表示されます。 – canavanin

答えて

1

配列Tは割り当てられていないため、読み書きはエラーです。

+0

Sryは大きなプログラムの一部です。私はちょうどいくつかの部分を貼り付けます。最初のif条件の後に、この行にTを割り当てました。 ALLOCATE(T(LIM + 2、JM + 2)) – user562264

0

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

1)RNK、サイズ、およびPRVが整数であることを確認してください。おそらく、prvは実数で(デフォルトでは タイピング規則)、実数を整数に送るので、タグは一致せず、デッドロックになります。

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

関連する問題