2017-02-09 7 views
0

特定の種類のファイルに対して、Fortran mpiプログラムを順次書き込みから並列書き込みに変更しています。 netcdf 4.3.3.1/hdf5 1.8.9 parallelを使用しています。私は、インテルコンパイラのバージョン14.0.3.174を使用します。fortran netcdf close parallel deadlock

すべての読み取り/書き込みが完了したら、ファイルを閉じる時間です。この時点で、シミュレーションはもはや継続しません。だからすべての呼び出しが待っている。コールスタックを各プロセッサからチェックすると、マスタルートが他のものと比べて異なることがわかります。

MPIマスタープロセッサコールスタック:

__sched_yield,         FP=7ffc6aa978b0 
opal_progress,         FP=7ffc6aa978d0 
ompi_request_default_wait_all,     FP=7ffc6aa97940 
ompi_coll_tuned_sendrecv_actual,    FP=7ffc6aa979e0 
ompi_coll_tuned_barrier_intra_recursivedoubling, FP=7ffc6aa97a40 
PMPI_Barrier,         FP=7ffc6aa97a60 
H5AC_rsp__dist_md_write__flush,    FP=7ffc6aa97af0 
H5AC_flush,         FP=7ffc6aa97b20 
H5F_flush,          FP=7ffc6aa97b50 
H5F_flush_mounts,        FP=7ffc6aa97b80 
H5Fflush,          FP=7ffc6aa97ba0 
NC4_close,          FP=7ffc6aa97be0 
nc_close,          FP=7ffc6aa97c00 
restclo,          FP=7ffc6aa98660 
driver,          FP=7ffc6aaa5ef0 
main,           FP=7ffc6aaa5f90 
__libc_start_main,        FP=7ffc6aaa6050 
_start,  

残りのプロセッサは、スタックを呼び出します。

__sched_yield,         FP=7fffe330cdd0 
opal_progress,         FP=7fffe330cdf0 
ompi_request_default_wait,      FP=7fffe330ce50 
ompi_coll_tuned_bcast_intra_generic,   FP=7fffe330cf30 
ompi_coll_tuned_bcast_intra_binomial,   FP=7fffe330cf90 
ompi_coll_tuned_bcast_intra_dec_fixed,   FP=7fffe330cfb0 
mca_coll_sync_bcast,       FP=7fffe330cff0 
PMPI_Bcast,         FP=7fffe330d030 
mca_io_romio_dist_MPI_File_set_size,   FP=7fffe330d080 
PMPI_File_set_size,       FP=7fffe330d0a0 
H5FD_mpio_truncate,       FP=7fffe330d0c0 
H5FD_truncate,         FP=7fffe330d0f0 
H5F_dest,          FP=7fffe330d110 
H5F_try_close,         FP=7fffe330d340 
H5F_close,          FP=7fffe330d360 
H5I_dec_ref,         FP=7fffe330d370 
H5I_dec_app_ref,        FP=7fffe330d380 
H5Fclose,          FP=7fffe330d3a0 
NC4_close,          FP=7fffe330d3e0 
nc_close,          FP=7fffe330d400 
RESTCOM`restclo,        FP=7fffe330de60 
driver,          FP=7fffe331b6f0 
main,           FP=7fffe331b7f0 
__libc_start_main,        FP=7fffe331b8b0 
_start, 

私は1つのコールスタックは、他のバリアBCAST含まれて実現します。デッドロックが発生する可能性があります。しかし私はここから続ける方法を予見していない。 mpi呼び出しが適切に行われていない場合(例えば1 procでのみ呼び出された場合)、このような動作の代わりにエラーメッセージが表示されます。

更新:ソースコードは約100k行です。

cmode = ior(NF90_NOCLOBBER,NF90_NETCDF4) 
cmode = ior(cmode, NF90_MPIIO) 
CALL ipslnc(NF90_CREATE(fname,cmode=cmode,ncid=ncfid, comm=MPI_COMM, info=MPI_INFO)) 

とクローズ:

ファイルは、この道を開いているNF90_PUT_ATTを足すときは結局のところ

iret = NF90_CLOSE(ncfid) 
+1

コードを確認する必要があります。 –

+1

コードが長すぎる場合は、[mcve]を用意してください。これはファイルを書き込んで閉じてしまう単純なコードで起こりますか? –

+0

私はこれです。しかしこれもまた大きな問題の一つです。 – rgrun

答えて

0

、ルートプロセッサは、他の人と比べて異なる値を持ちます。一度解決されると、プログラムは期待どおりに実行されます。