2016-08-09 4 views
0

大きなデータファイルを読み込んで計算を行うルートプロセスを最初に指定し、プロセス。ここに私のコードです:(1)nsample=30000と(2)dens_ent行列を生成するいくつかのルール(3)他のプロセスにブロードキャストでtxtファイルから乱数を読み取ります。 Btw、私はgfortranでOpenMPIを使用しています。MPIルートプロセスのプリントアウトが欠落しています。データの読み取りだけを処理した後

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) 

問題が発生する: (1)IF (myid==0) PRINT *, 'sum_density by joint normal distribution',sum(dens_ent)には、プリントアウトがないよう、実行されないようです。 (2)次に、PRINT *, 'BLBLALALALALALA',myidなどのメッセージを追加して確認します。この場合も、ルートプロセスmyid=0の印刷はありません。 ルートプロセスが機能していないようですか?これはどうやって真実だろうか?私はかなり混乱しています。 PRINT *, 'dingdongdingdong',myidの前にMPI_BARRIERを使用していないためですか?

+1

あなたはこのサイトのルールを徹底的に近づいています。これに対して具体的なルールがあります:「ここに私のコードがあります。私のためにデバッグしてください。あなたは 'myid'がどのように計算されるかも示していません。つまり、ファイル-i/o(通常は 'STD_OUT'はユニット6でなければなりませんが、決して分かりません)に10以上の' unit'を使用することをお勧めします。また、それぞれの後に 'ierr'ステータスの値をすべて確認してくださいMPI呼び出し。 – chw21

+0

さらに、あなたが得た出力に関しては、あなたはまだ近づいていません。ルート以外のプロセスは "BLABLABLA"を印刷しますか?ルートプロセスは "dingdong"を印刷しますか?いくつのプロセスを実行していますか? – chw21

+0

前のコメントに加えて、 'MPI_BARRIER'ではなく' MPI_BCAST'を意味しますか? – Harald

答えて

1

コードの冒頭で次の文が間違っている可能性はありますか? myid

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

MPI_COMM_RANK戻る(もし成功)MPI_COMM_WORLDコミュニケータ(すなわち0内の値とNPはMPIランクの総数NP)内のプロセスの識別子。

0

@ cw21 @Haraldと@Hristo Ilievの貢献に感謝します。 番号はunitの番号になります。一つの基準は言う:

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. 

は、だから私は働いていない、1iにすべてのナンバリングiを変えました。 10iに変更されました。それは働き始める。不思議なことに、@Hristo Ilievが正しく指摘したように、番号が0,5,6でない限り、コードは正しく動作するはずです。私は自分自身になぜ1iが機能しないのか説明できません。しかし、とにかく、ルートプロセスは結果を印刷しています。

関連する問題