2017-02-09 1 views
0

특정 유형의 파일에 대해 fortran mpi 프로그램을 순차 작성에서 병렬 작성으로 변경하고 있습니다. 그것은 netcdf 4.3.3.1/hdf5 1.8.9 병렬을 사용합니다. 인텔 컴파일러 버전 14.0.3.174를 사용합니다.fortran netcdf close parallel deadlock

모든 읽기/쓰기가 완료되면 파일을 닫아야합니다. 이 시점에서 시뮬레이션은 더 이상 지속되지 않습니다. 그래서 모든 전화가 기다리고 있습니다. 각 프로세서에서 호출 스택을 확인할 때 마스터 루트가 나머지 프로세서와 비교해 다른 것을 볼 수 있습니다.

MPI 마스터 프로세서 호출 스택 :

__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, 

나는 하나의 호출 스택을 실현 할 수는 다른 장벽 BCAST 포함 :

__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,  

남은 프로세서 스택 호출합니다. 교착 상태가 발생할 수 있습니다. 그러나 나는 여기에서 계속하는 방법을 예견하지 않는다. 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을을 writting 때 밝혀

iret = NF90_CLOSE(ncfid) 
+1

코드를 확인해야합니다. –

+1

코드가 너무 길면 [mcve]를 준비하십시오. 이것은 파일을 쓰고 닫는 간단한 코드에서 발생합니까? –

+0

나는 이것 위에있다. 그러나 이것은 큰 이슈 중 하나입니다. – rgrun

답변

0

, 루트 프로세서가 다른 사람에 비해 다른 값을 가지고있다. 일단 풀면 프로그램이 예상대로 실행됩니다.