2011-01-04 6 views
1

Ich versuche, ein einfaches Problem mit MPI zu lösen, meine Implementierung ist MPICH2 und mein Code ist in Fortran. Ich habe das blockierende Senden und Empfangen verwendet, die Idee ist so einfach, aber wenn ich es starte, stürzt es ab !!! Ich habe absolut keine Ahnung was falsch ist? Kann jemand bitte ein Zitat zu diesem Thema machen? gibt es ein Stück des Codes:ein Deadlock in einem einfachen Odd-Even Senden

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 

als ich selbst Prozesse verstanden nichts erhalten, während die ungeraden erfolgreich fertig zu senden, in einigen Fällen, wenn ich etwas Druck hinzugefügt, um zu beobachten, was auf I wird gesehen, dass die Variable NXT ändert sich während des Sendevorgangs !!! zum Beispiel alle ungeraden Prozess wurde Nachricht an Prozess 0 senden, nicht ihre nächste!

+0

Wenn Sie Code bereitstellen, stellen Sie bitte sicher, dass es als solches formatiert ist. Ziehen Sie Ihre Codezeilen um vier Leerzeichen ein. Sie erhalten auch Formatierungsinformationen auf der rechten Seite der Seite "Frage stellen". – canavanin

Antwort

1

Das Array T ist nicht zugeordnet, so dass das Lesen oder Schreiben davon ein Fehler ist.

+0

Sry das ist Teil eines großen Programms und ich habe nur einige Teile eingefügt, ich habe bereits das T mit dieser Zeile nach der ersten If-Bedingung zugeordnet: ALLOCATE (T (LIM + 2, JM + 2)) – user562264

0

Ich kann das ganze Programm nicht sehen, aber einige Beobachtung auf das, was ich sehen kann:

1) stellen Sie sicher, dass RNK, Größe und prv ganze Zahlen sind. Wahrscheinlich ist prv real (standardmäßig Tippregeln) und Sie senden eine echte zu einer ganzen Zahl, so dass Tags nicht übereinstimmen, daher Deadlock.

2) Ich würde sendrcv statt send/recv verwenden; recv/Sendecodeabschnitt. Zwei sendrecvs sind sauberer (2 Zeilen Code vs. 7), garantiert nicht Deadlock und ist schneller, wenn Sie bidirektionale Links haben (fast immer wahr)