SURFEX v8.1
General documentation of Surfex
dr_hook_util.F90
Go to the documentation of this file.
1 SUBROUTINE dr_hook_util(LDHOOK,CDNAME,KCASE,PKEY,CDFILENAME,KSIZEINFO)
2 USE parkind1 ,ONLY : jpim ,jprb ,jprd
4 #ifdef SFX_MPI
5 USE mpl_init_mod, ONLY : mpl_init
6 USE mpl_arg_mod, ONLY : mpl_getarg
7 #endif
10 USE yomhookstack, ONLY : ll_thread_first,isave,imaxstack,cstack ! For monitoring thread stack usage
11 #ifdef NAG
12 USE f90_unix_env, ONLY: getarg
13 #endif
14 
15 IMPLICIT NONE
16 LOGICAL,INTENT(INOUT) :: LDHOOK
17 CHARACTER(LEN=*),INTENT(IN) :: CDNAME,CDFILENAME
18 INTEGER(KIND=JPIM),INTENT(IN) :: KCASE,KSIZEINFO
19 REAL(KIND=JPRB),INTENT(INOUT) :: PKEY
20 #ifdef RS6K
21 INTEGER(KIND=JPIM) :: INEWMASK, IOLDMASK, UMASK
22 #endif
23 #ifdef CRAYXT
24 INTEGER(KIND=JPIM) :: IRET, SETVBUF3F
25 #endif
26 LOGICAL,SAVE :: LL_FIRST_TIME = .true.
27 CHARACTER(LEN=512) :: CLENV
28 INTEGER(KIND=JPIM) INUMTIDS, IMYTID
29 LOGICAL :: LLMPI
30 INTEGER*8 :: MAXMEM=0
31 INTEGER*8 :: GETMAXMEM
32 INTEGER*8 GETMAXLOC
33 LOGICAL :: LLFINDSUMB=.false.
34 REAL(KIND=JPRD) :: ZCLOCK
35 REAL(KIND=JPRB) :: ZDIFF
36 CHARACTER(LEN=7) CLSTR
37 
38 INTEGER*8 ILOC ! For monitoring thread stack usage
39 CHARACTER(LEN=3) CHEAP ! For monitoring heap usage
40 INTEGER JHEAP ! For monitoring heap usage
41 DATA jheap/0/
42 
43 #include "user_clock.h"
44 
45 
46 ! -----------------------------------------------------------------
47 
48 IF (.NOT.ldhook) RETURN
49 
50 imytid = oml_my_thread()
51 inumtids = oml_max_threads()
52 IF (ll_first_time) THEN
53  ll_first_time = .false.
54 #ifdef CRAYXT
55  iret = setvbuf3f(0, 1, 0) ! Set unit#0 into line-buffering mode to avoid messy output
56 #endif
57  CALL oml_init()
58  CALL get_environment_variable('DR_HOOK_NOT_MPI',clenv)
59  IF (clenv == ' ' .OR. clenv == '0' .OR. &
60  & clenv == 'false' .OR. clenv == 'FALSE') THEN
61  llmpi=.true.
62 #ifdef SFX_MPI
63  CALL mpl_init(ldinfo=.false.) ! Do not produce any output
64 #endif
65  ELSE
66  llmpi=.false.
67  ENDIF
68  CALL get_environment_variable('DR_HOOK',clenv)
69  IF (clenv == ' ' .OR. clenv == '0' .OR. &
70  & clenv == 'false' .OR. clenv == 'FALSE') THEN
71  ldhook = .false.
72  CALL c_drhook_set_lhook(0)
73  ENDIF
74  IF (llmpi) THEN
75 #ifdef SFX_MPI
76  CALL mpl_getarg(0, clenv) ! Get executable name & also propagate args
77 #endif
78  ELSE
79  CALL getarg(0, clenv)
80  ENDIF
81  IF (.NOT.ldhook) RETURN
82 
83  CALL c_drhook_init(clenv, inumtids)
84 
85 !JFH---Initialisation to monitor stack usage by threads-------------
86  CALL get_environment_variable('DR_HOOK_STACKCHECK',cstack)
87  IF (cstack == 'yes' .OR. cstack == 'YES' ) THEN
88  IF(imytid == 1 ) THEN
89  ALLOCATE(ll_thread_first(inumtids))
90  ALLOCATE(isave(inumtids))
91  ALLOCATE(imaxstack(inumtids))
92  ll_thread_first=.true.
93  isave=0
94  imaxstack=0
95  ENDIF
96  ENDIF
97 !JFH------------ End ---------------------------------------------
98 !JFH---Initialisation to monitor heap usage-----------------------
99  jheap=0
100  CALL get_environment_variable('DR_HOOK_HEAPCHECK',cheap)
101  IF (cheap == 'yes' .OR. cheap == 'YES' ) jheap=1
102  IF (cheap == 'trb' .OR. cheap == 'TRB' ) jheap=2
103  IF(imytid == 1) THEN
104  IF(jheap>0) THEN
105 ! write(0,*) "HEAPCHECK=",CHEAP,JHEAP
106  CALL setheapcheck()
107  ENDIF
108  ENDIF
109 !JFH------------ End ---------------------------------------------
110 
111 ENDIF
112 
113 !JFH---Code to monitor stack usage by threads---------------------
114 #ifndef NAG
115 IF (cstack == 'yes' .or. cstack == 'YES' ) THEN
116  IF(imytid > 1) THEN
117  IF(ll_thread_first(imytid))THEN
118  ll_thread_first(imytid)=.false.
119  isave(imytid)=loc(llmpi)
120  ENDIF
121  iloc=loc(llmpi)
122  IF(isave(imytid)-iloc > imaxstack(imytid)) THEN
123  imaxstack(imytid)=isave(imytid)-iloc
124  WRITE(0,'(A,I3,A,I12,2X,A)')"STACKCHECK Max stack usage by thread",imytid," =",imaxstack(imytid),cdname
125  ENDIF
126  ENDIF
127 ENDIF
128 #endif
129 !JFH------------ End ---------------------------------------------
130 
131 IF (kcase == 0) THEN
132  CALL c_drhook_start(cdname, imytid, pkey, cdfilename, ksizeinfo)
133 !JFH---Code to monitor heap usage -------------------------
134  IF(imytid == 1 .AND. myproc_stats == 1 .AND. jheap>0) THEN
135  getmaxmem=getmaxloc()
136  IF(getmaxmem .GT. maxmem) THEN
137  maxmem = getmaxmem
138  WRITE(0,*) "HEAPCHECK Max heap at beg of routine =",maxmem," ",cdname
139 #ifdef RS6K
140  IF(jheap == 2) CALL xl__trbk()
141 #endif
142  ENDIF
143  ENDIF
144 !JFH------------ End ---------------------------------------------
145 ELSE IF (kcase == 1) THEN
146 !JFH---Code to monitor heap usage -------------------------
147  IF(imytid == 1 .AND. myproc_stats == 1 .AND. jheap>0) THEN
148  getmaxmem=getmaxloc()
149  IF(getmaxmem .GT. maxmem) THEN
150  maxmem = getmaxmem
151  WRITE(0,*) "HEAPCHECK Max heap at end of routine =",maxmem," ",cdname
152 #ifdef RS6K
153  IF(jheap == 2) CALL xl__trbk()
154 #endif
155  ENDIF
156  ENDIF
157 !JFH------------ End ---------------------------------------------
158  CALL c_drhook_end (cdname, imytid, pkey, cdfilename, ksizeinfo)
159 ENDIF
160 
161 !GM---Code to find gstats SUMB time-------------------------------
162 IF( ldetailed_stats .AND. llfindsumb )THEN
163  IF( imytid==1 .AND. last_knum>=500 .AND. myproc_stats <= 2 )THEN
164  IF( last_kswitch==1 .OR. last_kswitch==2 )THEN
165  CALL user_clock(pelapsed_time=zclock)
166  zdiff=zclock-time_last_call
167  IF( zdiff > 0.1_jprb )THEN
168  IF( kcase == 0 )THEN
169  clstr='ENTERED'
170  ELSE
171  clstr='EXITED'
172  ENDIF
173  IF( nhook_messages < 100000 )THEN
174  WRITE(0,'("DR_HOOK_UTIL: ",A,2X,A," TIMESUMB=",F10.6)')cdname,clstr,zdiff
176  ENDIF
177  ENDIF
178  ENDIF
179  ENDIF
180 ENDIF
181 !GM------------ End ---------------------------------------------
182 
183 END SUBROUTINE dr_hook_util
integer(kind=jpim) myproc_stats
Definition: yomgstats.F90:121
integer, parameter jpim
Definition: parkind1.F90:13
integer, parameter jprd
Definition: parkind1.F90:39
integer(kind=jpib), dimension(:), allocatable isave
logical, dimension(:), allocatable ll_thread_first
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
subroutine, public mpl_init(KOUTPUT, KUNIT, KERROR, KPROCS, LDINFO, LDENV)
integer(kind=jpim) last_knum
Definition: yomgstats.F90:78
integer(kind=jpim) function, public oml_my_thread()
Definition: oml_mod.F90:249
subroutine getarg(IARG, CLARG)
Definition: get_opt.F:91
character(len=3) cstack
integer(kind=jpim) nhook_messages
Definition: yomgstats.F90:79
integer(kind=jpib), dimension(:), allocatable imaxstack
subroutine dr_hook_util(LDHOOK, CDNAME, KCASE, PKEY, CDFILENAME, KSIZEINFO)
Definition: dr_hook_util.F90:2
integer(kind=jpim) last_kswitch
Definition: yomgstats.F90:77
integer(kind=jpim) function, public oml_max_threads()
Definition: oml_mod.F90:256
logical ldetailed_stats
Definition: yomgstats.F90:62
subroutine, public mpl_getarg(KARG, CDARG)
subroutine, public oml_init()
Definition: oml_mod.F90:111