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?
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
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
Zusätzlich zu früheren Kommentaren meinst du "MPI_BCAST" anstatt "MPI_BARRIER"? – Harald