특정 유형의 파일에 대해 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)
코드를 확인해야합니다. –
코드가 너무 길면 [mcve]를 준비하십시오. 이것은 파일을 쓰고 닫는 간단한 코드에서 발생합니까? –
나는 이것 위에있다. 그러나 이것은 큰 이슈 중 하나입니다. – rgrun