1 SUBROUTINE gstats(KNUM,KSWITCH)
59 INTEGER(KIND=JPIM),
INTENT(IN) :: KNUM
60 INTEGER(KIND=JPIM),
INTENT(IN) :: KSWITCH
62 INTEGER(KIND=JPIM) :: IMOD,ICALL
63 INTEGER(KIND=JPIM) :: IIMEM, IIPAG, IIMEMC
64 INTEGER(KIND=JPIB) :: IMEM, IMEMH, IMEMS, IMEMC, IPAG, INUM
65 INTEGER(KIND=JPIB) :: GETRSS, GETHWM, GETSTK, GETCURHEAP, GETPAG
66 EXTERNAL getrss, gethwm, getstk, getcurheap, getpag
67 REAL(KIND=JPRB) :: ZTIMED,ZCLOCK,ZTIME,ZTCPU,ZVCPU
68 REAL(KIND=JPRB) :: ZLAST_PAR_TIME
69 LOGICAL :: LLFIRST=.
true.
70 LOGICAL :: LLMFIRST=.
true.
71 CHARACTER(LEN=32),
SAVE :: CCDESC_DRHOOK(
jpmaxstat)
72 CHARACTER(LEN=32),
SAVE :: CCDESC_BARR(
jpmaxstat)
74 SAVE iimem, iipag, iimemc
76 INTEGER(KIND=JPIM),
SAVE :: NUM_THREADS
77 REAL(KIND=JPRB),
ALLOCATABLE,
SAVE :: ZHOOK_HANDLE(:)
78 REAL(KIND=JPRB),
SAVE :: ZHOOK_HANDLE_COMMS, ZHOOK_HANDLE_COMMS1
79 REAL(KIND=JPRB),
SAVE :: ZHOOK_HANDLE_TRANS
80 REAL(KIND=JPRB),
SAVE :: ZHOOK_HANDLE_BARR
83 INTEGER(KIND=JPIM) :: NMAX_STATS, KULNAM
86 #include "user_clock.h"
93 IF(.NOT.
ALLOCATED(zhook_handle))
THEN
95 ALLOCATE(zhook_handle(num_threads))
101 ccdesc_barr(inum)=
'>BAR-'//
ccdesc(inum)(1:21)//
'('//cc//
')'
107 & .OR.
cctype(inum).EQ.
'BAR'.OR.
cctype(inum).EQ.
'OMP')
THEN
108 ccdesc_drhook(inum)=
'>'//
cctype(inum)//
'-'//
ccdesc(inum)(1:21)//
'('//cc//
')'
129 IF (
lhook .AND. (kswitch == 0 .OR. kswitch == 1))
THEN
133 IF(
cctype(knum).EQ.
"TRS")
THEN
134 CALL dr_hook(ccdesc_drhook(knum),kswitch,zhook_handle_trans)
135 ELSEIF(
cctype(knum).EQ.
'MP-')
THEN
136 CALL dr_hook(ccdesc_drhook(knum),kswitch,zhook_handle_comms)
137 ELSEIF(
cctype(knum).EQ.
'MPL'.AND.knum.NE.682)
THEN
138 CALL dr_hook(ccdesc_drhook(knum),kswitch,zhook_handle_comms1)
139 ELSEIF(
cctype(knum).EQ.
'OMP')
THEN
143 CALL dr_hook(ccdesc_drhook(knum),kswitch,ztime)
144 ELSEIF(
cctype(knum).EQ.
'BAR')
THEN
145 CALL dr_hook(ccdesc_drhook(knum),kswitch,zhook_handle_barr)
151 CALL user_clock(ptotal_cp=ztcpu,pvector_cp=zvcpu)
172 ntmem(:,5) = 99999999
177 zlast_par_time=zclock
182 IF(kswitch == 0.OR. kswitch == 1)
THEN
185 imod = mod(
ncalls(knum),2)
186 IF(.NOT.((kswitch == 0.AND. imod == 1) .OR.&
187 &(kswitch == 2.AND. imod == 1) .OR.&
188 &(kswitch == 3.AND. imod == 1) .OR.&
189 &(kswitch == 1.AND. imod == 0)))
THEN
190 WRITE(
jperr,*)
'KNUM,KSWITCH,IMOD,NCALLS(KNUM)',&
191 &knum,kswitch,imod,
ncalls(knum)
195 IF( kswitch == 0 )
THEN
200 ztimed = zclock - zlast_par_time
213 imemh = gethwm()/1024
214 imems = getstk()/1024
217 IF(imem > iimem.OR.ipag > iipag.OR.(
lstats_alloc.AND.(imemc.NE.iimemc)))
THEN
219 WRITE(0,*)
".---------------------------------------------------------"
220 WRITE(0,*)
"| Memory trace details"
221 WRITE(0,*)
"| --------------------"
222 WRITE(0,*)
"| Memory examined at each GSTATS call if NSTATS_MEM>0."
223 WRITE(0,*)
"| Header for each trace line is:"
225 WRITE(0,*)
"| RSS_INC: Increase in RSS_MAX (KB)"
226 WRITE(0,*)
"| RSS_MAX: Maximum real working set so far (KB)"
227 WRITE(0,*)
"| HEAP_MX: High Water Mark for heap so far (KB)"
228 WRITE(0,*)
"| STK: Current Stack usage (KB)"
229 WRITE(0,*)
"| PGS: Page faults w I/O since last trace line"
230 WRITE(0,*)
"| CALL: Number of gstats call"
231 WRITE(0,*)
"| HEAP: Current malloc'd total (KB)"
233 WRITE(0,*)
"| Trace line written for NSTATS_MEM MPI tasks if RSS_MAX"
234 WRITE(0,*)
"| RSS_MAX increases, PGS>0, or HEAP changed"
235 WRITE(0,*)
"| (if LTATS_ALLOC=.TRUE.)"
236 WRITE(0,*)
"`---------------------------------------------------------"
238 WRITE(0,
'(A10,A5,21X,A7,2A8,A7,A5,A5,A8)') &
239 &
"MEMORY ",
" KNUM",
"RSS_INC",
" RSS_MAX",
" HEAP_MX",
" STK", &
240 &
" PGS",
" CALL",
" HEAP"
243 WRITE(0,
'(A10,I5,1X,A20,1X,I6,2(1X,I7),1X,I6,1X,I4,1X,I4,1X,I7)') &
244 &
"MEMORY bfr",knum,
ccdesc(knum),imem-iimem,imem,imemh,imems, &
245 & ipag-iipag,(
ncalls(knum)+1)/2,imemc
252 ELSEIF( kswitch == 1 )
THEN
264 imemh = gethwm()/1024
265 imems = getstk()/1024
268 IF(imem > iimem.OR.ipag > iipag.OR.(
lstats_alloc.AND.(imemc.NE.iimemc)))
THEN
269 WRITE(0,
'(A10,I5,1X,A20,1X,I6,2(1X,I7),1X,I6,1X,I4,1X,I4,1X,I7)') &
270 &
"MEMORY aft ",knum,
ccdesc(knum),imem-iimem,imem,imemh,imems, &
271 & ipag-iipag,
ncalls(knum)/2,imemc
276 imem=imem-
ntmem(knum,2)
278 IF(imem >
ntmem(knum,1))
THEN
284 ELSEIF( kswitch == 2 )
THEN
290 ELSEIF( kswitch == 3 )
THEN
297 IF(knum > 500.OR.knum == 102.OR.knum == 103) zlast_par_time = zclock
real(kind=jprb), dimension(0:jpmaxstat) thisvcpu
real(kind=jprb), dimension(0:jpmaxstat) ttcpulcall
integer(kind=jpim), dimension(0:jpmaxstat, 5) ntmem
integer(kind=jpim) myproc_stats
real(kind=jprb), dimension(0:jpmaxstat) ttcpusum
integer(kind=jpim) function, public oml_max_threads()
real(kind=jprb), dimension(0:jpmaxstat) tvcpulcall
real(kind=jprb) time_last_call
real(kind=jprb), dimension(0:jpmaxstat) timesum
real(kind=jprb), dimension(0:jpmaxstat) timemax
real(kind=jprb), dimension(0:jpmaxstat) tvcpusum
integer(kind=jpim) nstats_mem
subroutine user_clock(PELAPSED_TIME, PELAPSED_TIME_SINCE, PVECTOR_CP, PTOTAL_CP)
integer(kind=jpim), parameter jpmaxstat
real(kind=jprb), dimension(:), allocatable time_trace
integer(kind=jpim) ntrace_stats
integer(kind=jpim), dimension(:), allocatable ncall_trace
!$Id itapm1 ENDIF!IM on interpole les champs sur les niveaux STD de pression!IM a chaque pas de temps de la physique c!positionnement de l argument logique a false c!pour ne pas recalculer deux fois la meme chose!c!a cet effet un appel a plevel_new a ete deplace c!a la fin de la serie d appels c!la boucle DO nlevSTD a ete internalisee c!dans d ou la creation de cette routine c c!CALL false
subroutine gstats(KNUM, KSWITCH)
real(kind=jprb), dimension(0:jpmaxstat) timesqsum
real(kind=jprb), dimension(0:jpmaxstat) timesumb
character *3, dimension(0:jpmaxstat) cctype
character *50, dimension(0:jpmaxstat) ccdesc
!$Id itapm1 ENDIF!IM on interpole les champs sur les niveaux STD de pression!IM a chaque pas de temps de la physique c!positionnement de l argument logique a false c!pour ne pas recalculer deux fois la meme chose!c!a cet effet un appel a plevel_new a ete deplace c!a la fin de la serie d appels c!la boucle DO nlevSTD a ete internalisee c!dans d ou la creation de cette routine c c!CALL ulevSTD CALL &zphi philevSTD CALL &zx_rh rhlevSTD!DO klev DO klon klev DO klon klev DO klon klev DO klon klev DO klon klev DO klon klev DO klon klev DO klon klev DO klon klev DO klon du jour ou toutes les read_climoz CALL true
integer(kind=jpim), parameter jperr
real(kind=jprb), dimension(0:jpmaxstat) thistcpu
integer(kind=jpim) ncalls_total
subroutine dr_hook(CDNAME, KSWITCH, PKEY)
integer(kind=jpim), dimension(0:jpmaxstat) ncalls
integer(kind=jpim) function, public oml_my_thread()
real(kind=jprb), dimension(0:jpmaxstat) thistime
real(kind=jprb), dimension(0:jpmaxstat) timelcall