SURFEX v8.1
General documentation of Surfex
gstats.F90
Go to the documentation of this file.
1 SUBROUTINE gstats(KNUM,KSWITCH)
2 
3 !**** *GSTATS* - Gather timing statistics
4 
5 ! PURPOSE.
6 ! --------
7 ! To gather timings for subsequent output by routine STATS_OUTPUT
8 
9 
10 !** INTERFACE.
11 ! ----------
12 ! *CALL* *GSTATS(KNUM,KSWITCH)
13 
14 ! EXPLICIT ARGUMENTS
15 ! --------------------
16 ! KNUM - timing event number (for list of already defined events
17 ! see routine STATS_OUTPUT)
18 ! KSWITCH - KSWITCH=0 - switch on timer
19 ! KSWITCH=1 - switch off timer
20 ! KSWITCH=2 - suspend timer
21 ! KSWITCH=3 - resume timer
22 
23 ! IMPLICIT ARGUMENTS
24 ! --------------------
25 ! Module YOMSTATS
26 
27 ! METHOD.
28 ! -------
29 
30 
31 ! EXTERNALS. USER_CLOCK - timing routine
32 ! ---------- MPL_BARRIER - syncronization of processors
33 
34 ! REFERENCE.
35 ! ----------
36 ! ECMWF Research Department documentation of the IFS
37 
38 ! AUTHOR.
39 ! -------
40 ! Mats Hamrud ECMWF
41 
42 ! MODIFICATIONS.
43 ! --------------
44 ! ORIGINAL : 98-11-15
45 ! D.Salmond: 02-02-25 Return if not master thread when called from a
46 ! parallel region.
47 ! J.Hague: 03-06-11 Memory tracing (for NSTATS_MEM MPI tasks)
48 ! G.Mozdzynski: 18 Apr 2008 Many corrections to gstats,
49 ! see LLFINDSUMB - when set is used detect gstat counter problems.
50 ! G.Mozdzynski: 20 Jan 2010 Further corrections to gstats to get timed sections and
51 ! SUMB to 100 percent of the total time.
52 ! F. Vana 05-Mar-2015 Support for single precision
53 ! ------------------------------------------------------------------
54 
55 USE parkind1 ,ONLY : jprd, jpim ,jprb ,jpib
56 USE yomhook ,ONLY : lhook, dr_hook
57 
58 USE yomgstats
59 #ifdef SFX_MPI
60 USE mpl_module
61 USE mpl_stats_mod
62 #endif
63 USE oml_mod
64 
65 IMPLICIT NONE
66 
67 INTEGER(KIND=JPIM),INTENT(IN) :: KNUM
68 INTEGER(KIND=JPIM),INTENT(IN) :: KSWITCH
69 
70 INTEGER(KIND=JPIM) :: IMOD,ICALL
71 INTEGER(KIND=JPIM) :: IIMEM, IIPAG, IIMEMC
72 INTEGER(KIND=JPIB) :: IMEM, IMEMH, IMEMS, IMEMC, IPAG, INUM
73 INTEGER(KIND=JPIB) :: GETMAXRSS, GETHWM, GETSTK, GETCURHEAP, GETPAG
74 EXTERNAL getmaxrss, gethwm, getstk, getcurheap, getpag
75 REAL(KIND=JPRD) :: ZTIMED,ZCLOCK,ZCLOCK1,ZTIME,ZTCPU,ZVCPU
76 LOGICAL :: LLFIRST=.true.
77 LOGICAL :: LLMFIRST=.true.
78  CHARACTER(LEN=32), SAVE :: CCDESC_DRHOOK(jpmaxstat)
79  CHARACTER(LEN=32), SAVE :: CCDESC_BARR(jpmaxstat)
80 SAVE iimem, iipag, iimemc
81 
82 INTEGER(KIND=JPIM),SAVE :: NUM_THREADS
83 REAL(KIND=JPRB),ALLOCATABLE,SAVE :: ZHOOK_HANDLE(:)
84 REAL(KIND=JPRB),SAVE :: ZHOOK_HANDLE_COMMS, ZHOOK_HANDLE_COMMS1
85 REAL(KIND=JPRB),SAVE :: ZHOOK_HANDLE_TRANS
86 REAL(KIND=JPRB),SAVE :: ZHOOK_HANDLE_BARR
87 CHARACTER*4 CC
88 
89 CHARACTER (LEN = 10) :: CLDATEOD,CLZONEOD
90 INTEGER(KIND=JPIM) :: IVALUES(8)
91 
92 INTEGER(KIND=JPIM) :: NMAX_STATS, KULNAM
93 
94 ! Change LLFINDSUMB to TRUE to add diagnostics to help find SUMB times
95 ! Note that a similar setting exists in dr_hook_util for the same objective
96 LOGICAL :: LLFINDSUMB=.false.
97 INTEGER(KIND=JPIM),SAVE :: ISUMBSTACK(10)
98 INTEGER(KIND=JPIM) :: J
99 REAL(KIND=JPRB) :: ZSUM,ZSUMB,ZTOT
100 REAL(KIND=JPRD) :: SBYTES,RBYTES
101 INTEGER(KIND=JPIM) :: NSEND,NRECV
102 
103 #include "user_clock.h"
104 
105 ! write(0,*) "GSTATS:LSTATS,JPMAXSTAT,LGSTATS_LABEL,KNUM=",LSTATS,JPMAXSTAT,LGSTATS_LABEL,KNUM
106 
107 IF(lstats) THEN
108 
109 ! only process gstats calls for master thread
110 
111  IF(oml_my_thread() > 1)GOTO 99999
112 
113  IF(.NOT.ALLOCATED(zhook_handle))THEN
114  num_threads=oml_max_threads()
115  ALLOCATE(zhook_handle(num_threads))
116  ENDIF
117 
118  IF(lgstats_label)THEN
119  DO inum=1,jpmaxstat
120  WRITE(cc,'(I4)')inum
121  ccdesc_barr(inum)='>BAR-'//ccdesc(inum)(1:21)//'('//cc//')'
122  ENDDO
123  DO inum=1,jpmaxstat
124  WRITE(cc,'(I4)')inum
125 ! write(6,*) inum,cctype(inum)
126  IF(cctype(inum).EQ."TRS".OR.cctype(inum).EQ.'MP-'.OR.cctype(inum).EQ.'MPL'&
127  & .OR.cctype(inum).EQ.'BAR'.OR.cctype(inum).EQ.'OMP') THEN
128  ccdesc_drhook(inum)='>'//cctype(inum)//'-'//ccdesc(inum)(1:21)//'('//cc//')'
129  ENDIF
130  ENDDO
131  lgstats_label=.false.
132  ENDIF
133 ! ------------------------------------------------------------------
134 
135 !J IF(KNUM/=0) THEN
136 !J IF(LSYNCSTATS .AND.(KSWITCH==0.OR. KSWITCH==2)) THEN
137 !J IF(.NOT.OML_IN_PARALLEL().AND. KNUM < 500 )THEN
138 !J IF(LHOOK)CALL DR_HOOK(CCDESC_BARR(KNUM),0,ZHOOK_HANDLE_BARR)
139 !J CALL MPL_BARRIER(CDSTRING='GSTATS:')
140 !J IF(LHOOK)CALL DR_HOOK(CCDESC_BARR(KNUM),1,ZHOOK_HANDLE_BARR)
141 !J ENDIF
142 !J ENDIF
143 !J ENDIF
144 
145  CALL user_clock(pelapsed_time=zclock)
146  IF (lstatscpu.OR.knum==0) THEN
147  CALL user_clock(ptotal_cp=ztcpu,pvector_cp=zvcpu)
148  ELSE
149  ztcpu = 0.0_jprd
150  zvcpu = 0.0_jprd
151  ENDIF
152 
153  IF (llfirst) THEN
154  timesum(:) = 0.0_jprd
155  ncalls(:) = 0
156  ENDIF
157 
158  IF (lhook .AND. (kswitch == 0 .OR. kswitch == 1)) THEN
159 ! write(0,*) "KNUM,SWITCH=",KNUM,KSWITCH
160 ! write(0,*) "CCTYPE=",CCTYPE(KNUM)
161 ! write(0,*) "CCDESC_DRHOOK=",CCDESC_DRHOOK(KNUM)
162  IF(cctype(knum).EQ."TRS")THEN
163  CALL dr_hook(ccdesc_drhook(knum),kswitch,zhook_handle_trans)
164  ELSEIF(cctype(knum).EQ.'MP-')THEN
165  CALL dr_hook(ccdesc_drhook(knum),kswitch,zhook_handle_comms)
166  ELSEIF(cctype(knum).EQ.'MPL'.AND.knum.NE.682)THEN
167  CALL dr_hook(ccdesc_drhook(knum),kswitch,zhook_handle_comms1)
168  ELSEIF(cctype(knum).EQ.'OMP')THEN
169  CALL dr_hook(ccdesc_drhook(knum),kswitch,zhook_handle)
170  ELSEIF(cctype(knum).EQ.'BAR')THEN
171  CALL dr_hook(ccdesc_drhook(knum),kswitch,zhook_handle_barr)
172  ENDIF
173 ! measure GSTATS HOOK overhead
174  CALL user_clock(pelapsed_time=zclock1)
175  timesum(401) = timesum(401)+zclock1-zclock
176  ncalls(401) = ncalls(401)+1
177  zclock=zclock1
178  ENDIF
179 
180  IF (llfirst) THEN
181 
182 ! write(0,*) "JPMAXSTAT:2=",JPMAXSTAT
183 
184  nswitchval(:) = -1
185  timesqsum(:) = 0.0_jprd
186  timemax(:) = 0.0_jprd
187  timesumb(:) = 0.0_jprd
188  IF( llfindsumb )THEN
189  isumbstack(:)=0
190  ENDIF
191  ttcpusum(:) = 0.0_jprd
192  tvcpusum(:) = 0.0_jprd
193  timelcall(:) = zclock
194  ccdesc=""
195  cctype=""
196  ntmem = 0
197  ntmem(:,5) = 99999999
198  iimem=0
199  iipag=0
200  iimemc=0
201  time_last_call = zclock
202  llfirst = .false.
203  ENDIF
204 
205  IF(knum < 0.OR. knum > jpmaxstat) CALL abor1('GSTATS')
206  IF(kswitch == 0.OR. kswitch == 1) THEN
207  ncalls(knum) = ncalls(knum)+1
208  ENDIF
209  imod = mod(ncalls(knum),2)
210  IF(.NOT.((kswitch == 0.AND. imod == 1) .OR.&
211  &(kswitch == 2.AND. imod == 1) .OR.&
212  &(kswitch == 3.AND. imod == 1) .OR.&
213  &(kswitch == 1.AND. imod == 0))) THEN
214  WRITE(jperr,*) 'KNUM,KSWITCH,IMOD,NCALLS(KNUM)',&
215  &knum,kswitch,imod,ncalls(knum)
216  CALL abor1('GSTATS')
217  ENDIF
218 
219 ! WRITE(0,'("GSTATS(SUMB): ",I4,2X,I1,2X,A40)') KNUM,KSWITCH,CCDESC(KNUM)
220 
221  nswitchval(knum)=kswitch
222 
223  IF( kswitch == 0 ) THEN
224 ! Start timing event
225  IF(knum>=500)THEN
226  ztimed = zclock-time_last_call
227  timesumb(knum) = timesumb(knum)+ztimed
228  ELSE
229  ztimed = 0.0_jprd
230  ENDIF
231 
232  IF( llfindsumb .AND. myproc_stats <= 2 )THEN
233 ! diagnostic code to find source of sumb (this should only be activated temporarily)
234  DO j=9,1,-1
235  isumbstack(j+1)=isumbstack(j)
236  ENDDO
237  isumbstack(1)=knum
238  IF( ztimed > 0.1_jprd .AND. (timesumb(knum) > 1.0_jprd) )THEN
239  WRITE(0,'("GSTATS(SUMB): KNUM=",I4," ZTIMED=",F10.6," TIMESUMB=",F10.6)')&
240  & knum,ztimed,timesumb(knum)
241  DO j=1,10
242  IF( isumbstack(j) > 0 )THEN
243  WRITE(0,'("GSTATS(SUMB): ",I4,2X,I8,2X,A40)')isumbstack(j),&
244  & ncalls(isumbstack(j)),ccdesc(isumbstack(j))
245  ENDIF
246  ENDDO
247  ENDIF
248 ! check if grouped counters are overlapping
249  DO j=0,jpmaxstat
250  IF( j /= knum )THEN
251  IF( cctype(j )/=' '.AND.cctype(j )/='TRS'.AND.cctype(j )/='MP-' .AND.&
252  & cctype(knum)/=' '.AND.cctype(knum)/='TRS'.AND.cctype(knum)/='MP-' )THEN
253  IF( nswitchval(j)==0.OR.nswitchval(j)==3 )THEN
254  WRITE(0,'("GSTATS(SUMB): OVERLAPPING COUNTERS ",I4,2X,I4)')knum,j
255  ENDIF
256  ENDIF
257  ENDIF
258  ENDDO
259  ENDIF
260 
261  thistime(knum) = 0.0_jprd
262  timelcall(knum) = zclock
263  ttcpulcall(knum) = ztcpu
264  tvcpulcall(knum) = zvcpu
265  thistcpu(knum) = 0.0_jprd
266  thisvcpu(knum) = 0.0_jprd
267  IF(myproc_stats.LE.nstats_mem.AND.myproc_stats.NE.0) THEN
268  imem = getmaxrss()/1024
269  ipag = getpag()
270  imemh = gethwm()/1024
271  imems = getstk()/1024
272  imemc = 0
273  IF(lstats_alloc) imemc = getcurheap()/1024
274  IF(imem > iimem.OR.ipag > iipag.OR.(lstats_alloc.AND.(imemc.NE.iimemc))) THEN
275  IF(llmfirst) THEN
276  WRITE(0,*) ".---------------------------------------------------------"
277  WRITE(0,*) "| Memory trace details"
278  WRITE(0,*) "| --------------------"
279  WRITE(0,*) "| Memory examined at each GSTATS call if NSTATS_MEM>0."
280  WRITE(0,*) "| Header for each trace line is:"
281  WRITE(0,*) "|"
282  WRITE(0,*) "| RSS_INC: Increase in RSS_MAX (KB)"
283  WRITE(0,*) "| RSS_MAX: Maximum real working set so far (KB)"
284  WRITE(0,*) "| HEAP_MX: High Water Mark for heap so far (KB)"
285  WRITE(0,*) "| STK: Current Stack usage (KB)"
286  WRITE(0,*) "| PGS: Page faults w I/O since last trace line"
287  WRITE(0,*) "| CALL: Number of gstats call"
288  WRITE(0,*) "| HEAP: Current malloc'd total (KB)"
289  WRITE(0,*) "|"
290  WRITE(0,*) "| Trace line written for NSTATS_MEM MPI tasks if RSS_MAX"
291  WRITE(0,*) "| RSS_MAX increases, PGS>0, or HEAP changed"
292  WRITE(0,*) "| (if LTATS_ALLOC=.TRUE.)"
293  WRITE(0,*) "`---------------------------------------------------------"
294  WRITE(0,*) ""
295  WRITE(0,'(A10,A5,21X,A7,2A8,A7,A5,A5,A8)') &
296  & "MEMORY "," KNUM","RSS_INC"," RSS_MAX"," HEAP_MX"," STK", &
297  & " PGS"," CALL"," HEAP"
298  llmfirst=.false.
299  ENDIF
300  WRITE(0,'(A10,I5,1X,A20,1X,I6,2(1X,I7),1X,I6,1X,I4,1X,I4,1X,I7)') &
301  & "MEMORY bfr",knum,ccdesc(knum),imem-iimem,imem,imemh,imems, &
302  & ipag-iipag,(ncalls(knum)+1)/2,imemc
303  ENDIF
304  ntmem(knum,2)=imem
305  iimem=imem
306  iipag=ipag
307  iimemc=imemc
308  ENDIF
309 #ifdef SFX_MPI
310  IF(lstats_mpl.AND.cctype(knum) .EQ. 'MPL') THEN
311  CALL mpl_statson(nsend,sbytes,nrecv,rbytes)
312  unknown_numsend(knum)=unknown_numsend(knum)+nsend
313  unknown_numrecv(knum)=unknown_numrecv(knum)+nrecv
314  unknown_sendbytes(knum)=unknown_sendbytes(knum)+sbytes
315  unknown_recvbytes(knum)=unknown_recvbytes(knum)+rbytes
316  ENDIF
317 #endif
318  ELSEIF( kswitch == 1 ) THEN
319 ! Finish timing event
320  ztime = thistime(knum)+(zclock-timelcall(knum))
321 #ifdef SFX_MPI
322  IF(lstats_mpl.AND.cctype(knum) .EQ. 'MPL') THEN
323  CALL mpl_statsread(nsend,sbytes,nrecv,rbytes)
324  numsend(knum)=numsend(knum)+nsend
325  numrecv(knum)=numrecv(knum)+nrecv
326  sendbytes(knum)=sendbytes(knum)+sbytes
327  recvbytes(knum)=recvbytes(knum)+rbytes
328  ENDIF
329 #endif
330  timesum(knum) = timesum(knum)+ztime
331  timesqsum(knum) = timesqsum(knum)+ztime**2
332  timemax(knum) = max(timemax(knum),ztime)
333  ttcpusum(knum) = ttcpusum(knum)+thistcpu(knum)+ztcpu-ttcpulcall(knum)
334  tvcpusum(knum) = tvcpusum(knum)+thisvcpu(knum)+zvcpu-tvcpulcall(knum)
335  IF(myproc_stats.LE.nstats_mem.AND.myproc_stats.NE.0) THEN
336  imem = getmaxrss()/1024
337  ipag = getpag()
338  imemh = gethwm()/1024
339  imems = getstk()/1024
340  imemc = 0
341  IF(lstats_alloc) imemc = getcurheap()/1024
342  IF(imem > iimem.OR.ipag > iipag.OR.(lstats_alloc.AND.(imemc.NE.iimemc))) THEN
343  WRITE(0,'(A10,I5,1X,A20,1X,I6,2(1X,I7),1X,I6,1X,I4,1X,I4,1X,I7)') &
344  & "MEMORY aft ",knum,ccdesc(knum),imem-iimem,imem,imemh,imems, &
345  & ipag-iipag,ncalls(knum)/2,imemc
346  ENDIF
347  iimem=imem
348  iipag=ipag
349  iimemc=imemc
350  imem=imem-ntmem(knum,2)
351  ntmem(knum,4)=ntmem(knum,4)+imem
352  IF(imem > ntmem(knum,1)) THEN
353  ntmem(knum,1)=imem
354  ntmem(knum,3)=ncalls(knum)
355  ENDIF
356  IF(imem < ntmem(knum,5)) ntmem(knum,5)=imem
357  ENDIF
358 ! Save counters that result in large delays
359  IF( knum >= 500 .AND. ncalls(knum)/2 > 10 )THEN
360  IF( ztime > timesum(knum)/float(ncalls(knum)/2) + 0.2_jprd )THEN
361  ! ignore counters 1007 and 1013 due to NFRLW frequency LW radiation calls
362  ! in ec_phys_tl and ec_phys_ad call trees
363  ! also ignore 635 and 636 due to increasing sujbwavallo matrix sizes
364  IF( knum /= 1007 .AND. knum /= 1013 .AND. knum /= 635 .AND. knum /= 636 )THEN
365  IF( ndelay_index < jpmaxdelays )THEN
368  tdelay_value(ndelay_index)=ztime-timesum(knum)/float(ncalls(knum)/2)
369  CALL date_and_time(cldateod,cdelay_time(ndelay_index),clzoneod,ivalues)
370  ENDIF
371  ENDIF
372  ENDIF
373  ENDIF
374  ELSEIF( kswitch == 2 ) THEN
375 ! Suspend timing event
376  ztimed = zclock-timelcall(knum)
377  thistime(knum) = thistime(knum)+ztimed
378  thistcpu(knum) = thistcpu(knum)+ztcpu-ttcpulcall(knum)
379  thisvcpu(knum) = thisvcpu(knum)+zvcpu-tvcpulcall(knum)
380 #ifdef SFX_MPI
381  IF(lstats_mpl.AND.cctype(knum) .EQ. 'MPL') THEN
382  CALL mpl_statsread(nsend,sbytes,nrecv,rbytes)
383  numsend(knum)=numsend(knum)+nsend
384  numrecv(knum)=numrecv(knum)+nrecv
385  sendbytes(knum)=sendbytes(knum)+sbytes
386  recvbytes(knum)=recvbytes(knum)+rbytes
387  ENDIF
388 #endif
389  ELSEIF( kswitch == 3 ) THEN
390 ! Resume timing event
391  timelcall(knum) = zclock
392  ttcpulcall(knum) = ztcpu
393  tvcpulcall(knum) = zvcpu
394 #ifdef SFX_MPI
395  IF(lstats_mpl.AND.cctype(knum) .EQ. 'MPL') THEN
396  CALL mpl_statson(nsend,sbytes,nrecv,rbytes)
397  unknown_numsend(knum)=unknown_numsend(knum)+nsend
398  unknown_numrecv(knum)=unknown_numrecv(knum)+nrecv
399  unknown_sendbytes(knum)=unknown_sendbytes(knum)+sbytes
400  unknown_recvbytes(knum)=unknown_recvbytes(knum)+rbytes
401  ENDIF
402 #endif
403  IF(knum>=500)THEN
404  ztimed = zclock-time_last_call
405  timesumb(knum) = timesumb(knum)+ztimed
406  ENDIF
407  ENDIF
408  IF(knum >= 500)THEN
409  time_last_call = zclock
410  ENDIF
411 
412 ! Trace stats
414  IF (ltrace_stats .AND. ncalls_total <= ntrace_stats) THEN
415  icall = ncalls_total
416  time_trace(icall) = zclock
417  ncall_trace(icall) = (jpmaxstat+1)*kswitch+knum
418  ENDIF
419 
420 ! measure gstats overhead
421  CALL user_clock(pelapsed_time=zclock1)
422  timesum(400) = timesum(400)+zclock1-zclock
423  ncalls(400) = ncalls(400)+1
424  last_kswitch=kswitch
425  last_knum=knum
426 
427 ! ZSUM=SUM(TIMESUM(500:JPMAXSTAT))
428 ! ZSUMB=SUM(TIMESUMB(500:JPMAXSTAT))
429 ! ZTOT=ZCLOCK1-TIMELCALL(0)
430 ! IF( (ZSUM+ZSUMB)/ZTOT >1.0_JPRB )THEN
431 ! write(0,'("GSTATS_DEBUG: KNUM=",I6," KSWITCH=",I1," (zsum+zsumb)/ztot=",F10.6)')&
432 ! &KNUM,KSWITCH,(zsum+zsumb)/ztot
433 ! ENDIF
434 
435 ENDIF
436 
437 99999 CONTINUE
438 END SUBROUTINE gstats
real(kind=jprb), dimension(:), allocatable unknown_recvbytes
Definition: yomgstats.F90:90
integer(kind=jpim), dimension(0:jpmaxstat, 5) ntmem
Definition: yomgstats.F90:124
integer(kind=jpim) myproc_stats
Definition: yomgstats.F90:121
real(kind=jprd), dimension(:), allocatable time_trace
Definition: yomgstats.F90:107
real(kind=jprd), dimension(1:jpmaxdelays) tdelay_value
Definition: yomgstats.F90:113
integer, parameter jpim
Definition: parkind1.F90:13
integer, parameter jprd
Definition: parkind1.F90:39
subroutine gstats(KNUM, KSWITCH)
Definition: gstats.F90:2
character *10, dimension(1:jpmaxdelays) cdelay_time
Definition: yomgstats.F90:114
subroutine abor1(CDTEXT)
Definition: abor1.F90:2
real(kind=jprd), dimension(0:jpmaxstat) tvcpusum
Definition: yomgstats.F90:98
integer(kind=jpim), dimension(:), allocatable numrecv
Definition: yomgstats.F90:84
real(kind=jprb), dimension(:), allocatable sendbytes
Definition: yomgstats.F90:85
real(kind=jprd), dimension(0:jpmaxstat) timelcall
Definition: yomgstats.F90:96
integer(kind=jpim) nstats_mem
Definition: yomgstats.F90:125
integer(kind=jpim), dimension(1:jpmaxdelays) ndelay_counter
Definition: yomgstats.F90:112
integer(kind=jpim), dimension(:), allocatable unknown_numrecv
Definition: yomgstats.F90:88
real(kind=jprd), dimension(0:jpmaxstat) ttcpulcall
Definition: yomgstats.F90:102
real(kind=jprd), dimension(0:jpmaxstat) thistime
Definition: yomgstats.F90:99
subroutine, public mpl_statson(SENDNUM, SENDBYTES, RECVNUM, RECVBYTES)
integer(kind=jpim), parameter jpmaxstat
Definition: yomgstats.F90:70
real(kind=jprd), dimension(0:jpmaxstat) thisvcpu
Definition: yomgstats.F90:101
integer(kind=jpim) ntrace_stats
Definition: yomgstats.F90:73
integer(kind=jpim), dimension(:), allocatable ncall_trace
Definition: yomgstats.F90:82
logical lstats_alloc
Definition: yomgstats.F90:58
subroutine user_clock(PELAPSED_TIME, PELAPSED_TIME_SINCE, PVECTOR_CP, PTOTAL_CP)
Definition: user_clock.F90:2
integer, parameter jprb
Definition: parkind1.F90:32
real(kind=jprd) time_last_call
Definition: yomgstats.F90:104
logical ltrace_stats
Definition: yomgstats.F90:65
integer(kind=jpim) last_knum
Definition: yomgstats.F90:78
real(kind=jprb), dimension(:), allocatable unknown_sendbytes
Definition: yomgstats.F90:89
character *3, dimension(0:jpmaxstat) cctype
Definition: yomgstats.F90:118
logical lstatscpu
Definition: yomgstats.F90:59
character *50, dimension(0:jpmaxstat) ccdesc
Definition: yomgstats.F90:117
logical lstats_mpl
Definition: yomgstats.F90:56
integer(kind=jpim) function, public oml_my_thread()
Definition: oml_mod.F90:249
integer(kind=jpim) ndelay_index
Definition: yomgstats.F90:115
integer(kind=jpim), parameter jperr
Definition: yomgstats.F90:108
logical lhook
Definition: yomhook.F90:15
real(kind=jprd), dimension(0:jpmaxstat) timesumb
Definition: yomgstats.F90:95
real(kind=jprd), dimension(0:jpmaxstat) tvcpulcall
Definition: yomgstats.F90:103
real(kind=jprd), dimension(0:jpmaxstat) ttcpusum
Definition: yomgstats.F90:97
integer(kind=jpim), dimension(:), allocatable unknown_numsend
Definition: yomgstats.F90:87
integer(kind=jpim) ncalls_total
Definition: yomgstats.F90:76
real(kind=jprb), dimension(:), allocatable recvbytes
Definition: yomgstats.F90:86
real(kind=jprd), dimension(0:jpmaxstat) timemax
Definition: yomgstats.F90:94
integer(kind=jpim) last_kswitch
Definition: yomgstats.F90:77
integer(kind=jpim) function, public oml_max_threads()
Definition: oml_mod.F90:256
integer(kind=jpim), dimension(0:jpmaxstat) nswitchval
Definition: yomgstats.F90:75
integer, parameter jpib
Definition: parkind1.F90:14
logical lgstats_label
Definition: yomgstats.F90:66
integer(kind=jpim), dimension(0:jpmaxstat) ncalls
Definition: yomgstats.F90:74
real(kind=jprd), dimension(0:jpmaxstat) timesum
Definition: yomgstats.F90:92
integer(kind=jpim), parameter jpmaxdelays
Definition: yomgstats.F90:111
real(kind=jprd), dimension(0:jpmaxstat) timesqsum
Definition: yomgstats.F90:93
logical lstats
Definition: yomgstats.F90:53
subroutine, public mpl_statsread(SENDNUM, SENDBYTES, RECVNUM, RECVBYTES)
integer(kind=jpim), dimension(:), allocatable numsend
Definition: yomgstats.F90:83
real(kind=jprd), dimension(0:jpmaxstat) thistcpu
Definition: yomgstats.F90:100