2016-08-09 64 views
0

Lese Ich schreibe ein Projekt, das zunächst den Prozess root bezeichnet eine große Datendatei zu lesen und einige Berechnungen zu tun, und zweitens überträgt die berechneten Ergebnisse zu allen anderen Prozesse. Hier ist mein Code: (1) liest er Zufallszahlen aus einer txt-Datei mit nsample=30000 (2) erzeugen dens_ent Matrix durch eine Regel (3) Übertragung auf andere Prozesse. Übrigens, ich benutze OpenMPI mit gfortran.Fehlender Druck-out für MPI Wurzelprozess nach seiner Handhabung Daten allein

IF (myid==0) THEN 
    OPEN(UNIT=8,FILE='rnseed_ent20.txt') 
    DO i=1,n_sample 
    DO j=1,3 
     READ(8,*) rn(i,j) 
    END DO 
    END DO 
    CLOSE(8) 
END IF 

dens_ent=0.0d0 
DO i=1,n_sample 
IF (myid==0) THEN 
    !Random draws of productivity and savings 
    rn_zb=MC_JOINT_SAMPLE((/-0.1d0,mu_b0/),var,rn(i,1:2)) 
    iz=minloc(abs(log(zgrid)-rn_zb(1)),dim=1) 
    ib=minloc(abs(log(bgrid(1:nb/2))-rn_zb(2)),dim=1) !Find the closest saving grid 
    CALL SUB2IND(j,(/nb,nm,nk,nxi,nz/),(/ib,1,1,1,iz/)) 
    DO iixi=1,nxi 
    DO iiz=1,nz 
     CALL SUB2IND(jj,(/nb,nm,nk,nxi,nz/),(/policybmk_2_statebmk_index(j,:),iixi,iiz/)) 
     dens_ent(jj)=dens_ent(jj)+1.0d0/real(nxi)*markovian(iz,iiz)*merge(1.0d0,0.0d0,vent(j) .GE. -bgrid(ib)+ce) 
     !Density only recorded if the value of entry is greater than b0+ce 
    END DO 
    END DO 
END IF 
END DO 

PRINT *, 'dingdongdingdong',myid 


IF (myid==0) dens_ent=dens_ent/real(n_sample)*Mpo 
IF (myid==0) PRINT *, 'sum_density by joint normal distribution',sum(dens_ent) 

PRINT *, 'BLBLALALALALALA',myid 

CALL MPI_BCAST(dens_ent,N,MPI_DOUBLE_PRECISION,0,MPI_COMM_WORLD,ierr) 

Problem entsteht: (1) IF (myid==0) PRINT *, 'sum_density by joint normal distribution',sum(dens_ent) nicht ausgeführt scheint, da kein Ausdruck ist. (2) Ich verifiziere dies dann durch Hinzufügen von PRINT *, 'BLBLALALALALALA',myid usw. Nachrichten. Wieder kein Ausdruck für Root-Prozess myid=0. Es scheint wie root-Prozess funktioniert nicht? Wie kann das wahr sein? Ich bin ziemlich verwirrt. Liegt es daran, dass ich MPI_BARRIER nicht vor PRINT *, 'dingdongdingdong',myid verwende?

+1

Sie sind schrecklich nahe den Regeln dieser Seite entlang. Es gibt spezielle Regeln gegen: "Hier ist mein Code, bitte debuggen Sie für mich." Sie zeigen auch nicht, wie 'myid' berechnet wird. Das heißt, ich würde vorschlagen, dass eine 'unit' von 10 oder mehr für Datei-I/O mit (normalerweise' STD_OUT' Einheit 6 sein sollte, aber man weiß ja nie), und auch alle überprüfen Sie die 'ierr' Statuswerte nach jedem MPI-Anruf. – chw21

+0

Plus, Sie sind nicht sehr auf die Ausgabe, die Sie erhalten. Drucken die Nicht-Root-Prozesse "BLABLABLA"? Druckt der Root-Prozess "Dingdong"? Wie viele Prozesse laufen Sie? – chw21

+0

Zusätzlich zu früheren Kommentaren meinst du "MPI_BCAST" anstatt "MPI_BARRIER"? – Harald

Antwort

1

Ist es möglich, dass Sie die folgende Aussage nur ganz am Anfang des Codes verpassen?

CALL MPI_COMM_RANK (MPI_COMM_WORLD, myid, ierr) 
IF (ierr /= MPI_SUCCESS) THEN 
    STOP "MPI_COMM_RANK failed!" 
END IF 

Die MPI_COMM_RANK kehrt in myid (falls erfolgreich) die Kennung des Prozesses innerhalb der MPI_COMM_WORLD Kommunikator (d.h ein Wert zwischen 0 und NP, NP, wo die Gesamtzahl der stuft MPI ist).

0

Dank für die Beiträge von @ CW21 @Harald und @Hristo Iliev. Der Fehler liegt in unit Nummerierung. Eine Referenz sagt:

unit number : This must be present and takes any integer type. Note this ‘number’ identifies the 
file and must be unique so if you have more than one file open then you must specify a different 
unit number for each file. Avoid using 0,5 or 6 as these UNITs are typically picked to be used by 
Fortran as follows. 
– Standard Error = 0 : Used to print error messages to the screen. 
– Standard In = 5 : Used to read in data from the keyboard. 
– Standard Out = 6 : Used to print general output to the screen. 

Also änderte ich alle Nummerierung i in 1i, nicht funktioniert; dann in 10i geändert. Es fängt an zu arbeiten. Mysteriös, wie von @Hristo Iliev richtig gesagt, solange die Nummerierung nicht 0,5,6 ist, sollte sich der Code richtig verhalten. Ich kann mir nicht erklären, warum 1i nicht funktioniert. Jedenfalls druckt der Root-Prozess nun Ergebnisse aus.