29 use,
intrinsic :: iso_fortran_env
42 integer,
parameter :: C_NUM_MPI_ROUTINES = 18
44 integer,
public,
parameter :: &
64 character(len=14),
dimension(C_NUM_MPI_ROUTINES),
public :: mpi_rlabel = &
86 integer,
public :: call_counter(C_NUM_MPI_ROUTINES) = 0
87 real(real64),
public :: sec_accum(C_NUM_MPI_ROUTINES) = 0_real64
89 real(real64) :: sec_in
91 logical :: debug_info = .false.
92 integer :: mpi_rank = 0
95 integer,
parameter :: unit_offset = 1000
101 integer,
intent(in) :: rank
102 logical,
intent(in) :: info
110 integer,
intent(out) :: iunit
112 character(len=6) :: filenum
114 if (.not. debug_info)
return
116 iunit = mpi_rank + unit_offset
117 write(filenum,
'(i6.6)') iunit - unit_offset
119 open(iunit, file =
'debug/debug_trace.node.'//filenum, &
120 action=
'write', status=
'unknown', position=
'append')
128 real(real64) :: usec_call(C_NUM_MPI_ROUTINES)
131 if (.not. debug_info)
return
137 write(iunit,
'(A)')
'--------------------------------------------------------------------'
139 write(iunit,
'(23x,a,6x,a,8x,a)')
'total time',
'calls',
'usec/call'
140 do j = 1, c_num_mpi_routines
141 if (call_counter(j) <= 0)
then
144 usec_call(j) = (sec_accum(j)*1000000)/call_counter(j)
147 write(iunit,
'(a,f13.6,6x,i8,6x,f13.0)') &
148 mpi_rlabel(j)//
' : ', sec_accum(j), &
149 call_counter(j), usec_call(j)
152 write(iunit,
'(A)')
'--------------------------------------------------------------------'
163 integer,
intent(in) :: index
167 if (.not. debug_info)
return
171 call_counter(index) = call_counter(index) + 1
175 write(iunit,
'(a,f18.6,a,z8.8,a,i6.6,a,f13.6)')
'* MPI_I ', &
176 sec_in,
' '//mpi_rlabel(index)//
' : 0x', comm%MPI_VAL,
' | ', &
177 call_counter(index),
' - ', sec_accum(index)
187 integer,
intent(in) :: index
190 real(real64) :: sec_out, sec_diff
192 if (.not. debug_info)
return
197 sec_out = mpi_wtime()
200 write(iunit,
'(a,f18.6,a,z8.8,a,i6.6,a,f13.6,a,f13.6)') &
201 '* MPI_O ', sec_out,
' '//mpi_rlabel(index)//
' : 0x', comm%MPI_VAL,
' | ', &
202 call_counter(index),
' - ', sec_accum(index),
' - ', sec_diff
211 integer,
intent(in) :: index
212 real(real64),
intent(in) :: sec
213 real(real64),
intent(out) :: sec_diff
215 sec_diff = sec - sec_in
216 sec_accum(index) = sec_accum(index) + sec_diff
subroutine, public loct_mkdir(name)
subroutine mpi_time_accum(index, sec, sec_diff)
integer, parameter, public c_mpi_allgatherv
integer, parameter, public c_mpi_allreduce
integer, parameter, public c_mpi_gatherv
integer, parameter, public c_mpi_irecv
integer, parameter, public c_mpi_file_read
subroutine, public mpi_debug_init(rank, info)
integer, parameter, public c_mpi_recv
integer, parameter, public c_mpi_scatterv
subroutine, public mpi_debug_in(comm, index)
integer, parameter, public c_mpi_send
integer, parameter, public c_mpi_waitall
integer, parameter, public c_mpi_allgather
subroutine, public mpi_debug_statistics()
integer, parameter, public c_mpi_bcast
integer, parameter, public c_mpi_alltoallv
integer, parameter, public c_mpi_gather
integer, parameter, public c_mpi_wait
subroutine, public mpi_debug_out(comm, index)
integer, parameter, public c_mpi_isend
subroutine mpi_debug_open_trace(iunit)
integer, parameter, public c_mpi_alltoall
integer, parameter, public c_mpi_file_write