/[MITgcm]/MITgcm/eesupp/src/timers.F
ViewVC logotype

Contents of /MITgcm/eesupp/src/timers.F

Parent Directory Parent Directory | Revision Log Revision Log | View Revision Graph Revision Graph


Revision 1.4 - (show annotations) (download)
Wed Oct 28 03:11:35 1998 UTC (25 years, 6 months ago) by cnh
Branch: MAIN
CVS Tags: checkpoint17, checkpoint19, checkpoint18, checkpoint20, checkpoint21, checkpoint22, checkpoint16
Changes since 1.3: +131 -67 lines
Changes to support
 - g77 compilation under Linux
 - LR(1) form of 64-bit is D or E for constants
 - Modified adjoint of exch with adjoint variables
   acuumulated.

1 C $Header: /u/gcmpack/models/MITgcmUV/eesupp/src/timers.F,v 1.3 1998/09/29 18:50:56 cnh Exp $
2
3 #include "CPP_EEOPTIONS.h"
4
5 C-- File utils.F: General purpose support routines
6 C-- Contents
7 C-- TIMER_INDEX - Returns index associated with timer name.
8 C-- M TIMER_CONTROL - Implements timer functions for given machine.
9 C-- TIMER_PRINT - Print CPU timer statitics.
10 C-- TIMER_PRINTALL - Prints all CPU timers statistics.
11 C-- TIMER_START - Starts CPU timer for code section.
12 C-- TIMER_STOP - Stop CPU tier for code section.
13 C-- Routines marked "M" contain specific machine dependent code.
14 C-- Routines marked "U" contain UNIX OS calls.
15
16 CStartOfInterface
17 INTEGER FUNCTION TIMER_INDEX (
18 I name,timerNames,maxTimers,nTimers )
19 C /==========================================================\
20 C | FUNCTION TIMER_INDEX |
21 C | o Timing support routine. |
22 C |==========================================================|
23 C | Return index in timer data structure of timer named |
24 C | by the function argument "name". |
25 C \==========================================================/
26 INTEGER maxTimers
27 INTEGER nTimers
28 CHARACTER*(*) name
29 CHARACTER*(*) timerNames(maxTimers)
30 CEndOfInterface
31 INTEGER I
32 C
33 TIMER_INDEX = 0
34 IF ( name .EQ. ' ' ) THEN
35 TIMER_INDEX = -1
36 ELSE
37 DO 10 I = 1, nTimers
38 IF ( name .NE. timerNames(I) ) GOTO 10
39 TIMER_INDEX = I
40 GOTO 11
41 10 CONTINUE
42 11 CONTINUE
43 ENDIF
44 RETURN
45 END
46
47 CStartOfInterface
48 SUBROUTINE TIMER_CONTROL ( name , action , callProc , myThreadId )
49 C /==========================================================\
50 C | SUBROUTINE TIMER_CONTROL |
51 C | o Timing routine. |
52 C |==========================================================|
53 C | User callable interface to timing routines. Timers are |
54 C | created, stopped, started and queried only through this |
55 C | rtouine. |
56 C \==========================================================/
57 #include "SIZE.h"
58 #include "EEPARAMS.h"
59 #include "EESUPPORT.h"
60 CHARACTER*(*) name
61 CHARACTER*(*) action
62 CHARACTER*(*) callProc
63 INTEGER myThreadId
64 CEndOfInterface
65 C
66 INTEGER TIMER_INDEX
67 INTEGER IFNBLNK
68 INTEGER ILNBLNK
69 EXTERNAL TIMER_INDEX
70 EXTERNAL IFNBLNK
71 EXTERNAL ILNBLNK
72 C
73 INTEGER maxTimers
74 INTEGER maxString
75 PARAMETER ( maxTimers = 40 )
76 PARAMETER ( maxString = 80 )
77 C
78 INTEGER timerStarts( maxTimers , MAX_NO_THREADS)
79 SAVE timerStarts
80 INTEGER timerStops ( maxTimers , MAX_NO_THREADS)
81 SAVE timerStops
82 Real*8 timerUser ( maxTimers , MAX_NO_THREADS)
83 SAVE timerUser
84 Real*8 timerWall ( maxTimers , MAX_NO_THREADS)
85 SAVE timerWall
86 Real*8 timerSys ( maxTimers , MAX_NO_THREADS)
87 SAVE timerSys
88 Real*8 timerT0User( maxTimers , MAX_NO_THREADS)
89 SAVE timerT0User
90 Real*8 timerT0Wall( maxTimers , MAX_NO_THREADS)
91 SAVE timerT0Wall
92 Real*8 timerT0Sys ( maxTimers , MAX_NO_THREADS)
93 SAVE timerT0Sys
94 C ===============================================================
95 C
96 INTEGER timerStatus( maxTimers , MAX_NO_THREADS)
97 SAVE timerStatus
98 INTEGER timerNameLen( maxTimers , MAX_NO_THREADS)
99 SAVE timerNameLen
100 CHARACTER*(maxString) timerNames( maxTimers , MAX_NO_THREADS)
101 SAVE timerNames
102 CHARACTER*(maxString) timerAction
103 INTEGER nTimers(MAX_NO_THREADS)
104 CHARACTER*(maxString) tmpName
105 CHARACTER*(maxString) tmpAction
106 INTEGER iTimer
107 INTEGER ISTART
108 INTEGER IEND
109 INTEGER STOPPED
110 PARAMETER ( STOPPED = 0 )
111 INTEGER RUNNING
112 PARAMETER ( RUNNING = 1 )
113 CHARACTER*(*) STOP
114 PARAMETER ( STOP = 'STOP' )
115 CHARACTER*(*) START
116 PARAMETER ( START = 'START' )
117 CHARACTER*(*) PRINT
118 PARAMETER ( PRINT = 'PRINT' )
119 CHARACTER*(*) PRINTALL
120 PARAMETER ( PRINTALL = 'PRINTALL' )
121 INTEGER I
122 Real*8 userTime
123 Real*8 systemTime
124 Real*8 wallClockTime
125 CHARACTER*(MAX_LEN_MBUF) msgBuffer
126 C
127 DATA nTimers /MAX_NO_THREADS*0/
128 SAVE nTimers
129 C
130 ISTART = IFNBLNK(name)
131 IEND = ILNBLNK(name)
132 IF ( IEND - ISTART + 1 .GT. maxString ) GOTO 901
133 IF ( ISTART .NE. 0 ) THEN
134 tmpName = name(ISTART:IEND)
135 CALL UCASE( tmpName )
136 ELSE
137 tmpName = ' '
138 ENDIF
139 ISTART = IFNBLNK(action)
140 IEND = ILNBLNK(action)
141 IF ( ISTART .EQ. 0 ) GOTO 902
142 IF ( IEND - ISTART + 1 .GT. maxString ) GOTO 903
143 tmpAction = action(ISTART:IEND)
144 CALL UCASE( tmpAction )
145 C
146 iTimer=TIMER_INDEX(tmpName,timerNames(1,myThreadId),
147 & maxTimers,nTimers(myThreadId))
148 C
149 IF ( tmpAction .EQ. START ) THEN
150 IF ( iTimer .EQ. 0 ) THEN
151 IF ( nTimers(myThreadId) .EQ. maxTimers ) GOTO 904
152 nTimers(myThreadId) = nTimers(myThreadId) + 1
153 iTimer = nTimers(myThreadId)
154 timerNames(iTimer,myThreadId) = tmpName
155 timerNameLen(iTimer,myThreadId) =
156 & ILNBLNK(tmpName)-IFNBLNK(tmpName)+1
157 timerUser(iTimer,myThreadId) = 0.
158 timerSys (iTimer,myThreadId) = 0.
159 timerWall(iTimer,myThreadId) = 0.
160 timerStarts(iTimer,myThreadId) = 0
161 timerStops (iTimer,myThreadId) = 0
162 timerStatus(iTimer,myThreadId) = STOPPED
163 ENDIF
164 IF ( timerStatus(iTimer,myThreadId) .NE. RUNNING ) THEN
165 CALL TIMER_GET_TIME( userTime, systemTime, wallClockTime )
166 timerT0User(iTimer,myThreadId) = userTime
167 timerT0Sys(iTimer,myThreadId) = systemTime
168 timerT0Wall(iTimer,myThreadId) = wallClockTime
169 timerStatus(iTimer,myThreadId) = RUNNING
170 timerStarts(iTimer,myThreadId) =
171 & timerStarts(iTimer,myThreadId)+1
172 ENDIF
173 ELSEIF ( tmpAction .EQ. STOP ) THEN
174 IF ( iTimer .EQ. 0 ) GOTO 905
175 IF ( timerStatus(iTimer,myThreadId) .EQ. RUNNING ) THEN
176 CALL TIMER_GET_TIME( userTime, systemTime, wallClockTime )
177 timerUser(iTimer,myThreadId) =
178 & timerUser(iTimer,myThreadId) +
179 & userTime -
180 & timerT0User(iTimer,myThreadId)
181 timerSys (iTimer,myThreadId) =
182 & timerSys(iTimer,myThreadId) +
183 & systemTime -
184 & timerT0Sys(iTimer,myThreadId)
185 timerWall(iTimer,myThreadId) =
186 & timerWall(iTimer,myThreadId) +
187 & wallClockTime -
188 & timerT0Wall(iTimer,myThreadId)
189 timerStatus(iTimer,myThreadId) = STOPPED
190 timerStops (iTimer,myThreadId) =
191 & timerStops (iTimer,myThreadId)+1
192 ENDIF
193 ELSEIF ( tmpAction .EQ. PRINT ) THEN
194 IF ( iTimer .EQ. 0 ) GOTO 905
195 WRITE(msgBuffer,*)
196 & ' Seconds in section "',
197 & timerNames(iTimer,myThreadId)(1:timerNameLen(iTimer,myThreadId))
198 & ,'":'
199 CALL PRINT_MESSAGE(msgBuffer,standardMessageUnit,
200 & SQUEEZE_RIGHT,myThreadId)
201 WRITE(msgBuffer,*) ' User time:',
202 & timerUser(iTimer,myThreadId)
203 CALL PRINT_MESSAGE(msgBuffer,standardMessageUnit,
204 & SQUEEZE_RIGHT,myThreadId)
205 WRITE(msgBuffer,*) ' System time:',
206 & timerSys(iTimer,myThreadId)
207 CALL PRINT_MESSAGE(msgBuffer,standardMessageUnit,
208 & SQUEEZE_RIGHT,myThreadId)
209 WRITE(msgBuffer,*) ' Wall clock time:',
210 & timerWall(iTimer,myThreadId)
211 CALL PRINT_MESSAGE(msgBuffer,standardMessageUnit,
212 & SQUEEZE_RIGHT,myThreadId)
213 WRITE(msgBuffer,*) ' No. starts:',
214 & timerStarts(iTimer,myThreadId)
215 CALL PRINT_MESSAGE(msgBuffer,standardMessageUnit,
216 & SQUEEZE_RIGHT,myThreadId)
217 WRITE(msgBuffer,*) ' No. stops:',
218 & timerStops(iTimer,myThreadId)
219 CALL PRINT_MESSAGE(msgBuffer,standardMessageUnit,
220 & SQUEEZE_RIGHT,myThreadId)
221 ELSEIF ( tmpAction .EQ. PRINTALL ) THEN
222 DO 10 I = 1, nTimers(myThreadId)
223 WRITE(msgBuffer,*) ' Seconds in section "',
224 & timerNames(I,myThreadId)(1:timerNameLen(I,myThreadId))
225 & ,'":'
226 CALL PRINT_MESSAGE(msgBuffer,standardMessageUnit,
227 & SQUEEZE_RIGHT,myThreadId)
228 WRITE(msgBuffer,*) ' User time:',
229 & timerUser(I,myThreadId)
230 CALL PRINT_MESSAGE(msgBuffer,standardMessageUnit,
231 & SQUEEZE_RIGHT,myThreadId)
232 WRITE(msgBuffer,*) ' System time:',
233 & timerSys(I,myThreadId)
234 CALL PRINT_MESSAGE(msgBuffer,standardMessageUnit,
235 & SQUEEZE_RIGHT,myThreadId)
236 WRITE(msgBuffer,*) ' Wall clock time:',
237 & timerWall(I,myThreadId)
238 CALL PRINT_MESSAGE(msgBuffer,standardMessageUnit,
239 & SQUEEZE_RIGHT,myThreadId)
240 WRITE(msgBuffer,*) ' No. starts:',
241 & timerStarts(I,myThreadId)
242 CALL PRINT_MESSAGE(msgBuffer,standardMessageUnit,
243 & SQUEEZE_RIGHT,myThreadId)
244 WRITE(msgBuffer,*) ' No. stops:',
245 & timerStops(I,myThreadId)
246 CALL PRINT_MESSAGE(msgBuffer,standardMessageUnit,
247 & SQUEEZE_RIGHT,myThreadId)
248 10 CONTINUE
249 ELSE
250 GOTO 903
251 ENDIF
252 C
253 1000 CONTINUE
254 C
255 RETURN
256 901 CONTINUE
257 WRITE(msgBuffer,'(A)')
258 &' '
259 CALL PRINT_MESSAGE(msgBuffer,standardMessageUnit,
260 & SQUEEZE_RIGHT,myThreadId)
261 WRITE(msgBuffer,*)
262 &'*** WARNING WARNING WARNING WARNING WARNING WARNING ***'
263 CALL PRINT_MESSAGE(msgBuffer,standardMessageUnit,
264 & SQUEEZE_RIGHT,myThreadId)
265 WRITE(msgBuffer,*)
266 &'procedure: "',callProc,'".'
267 CALL PRINT_MESSAGE(msgBuffer,standardMessageUnit,
268 & SQUEEZE_RIGHT,myThreadId)
269 WRITE(msgBuffer,*)
270 &'Timer name "',name(ISTART:IEND),'" is invalid.'
271 CALL PRINT_MESSAGE(msgBuffer,standardMessageUnit,
272 & SQUEEZE_RIGHT,myThreadId)
273 WRITE(msgBuffer,*)
274 &' Names must have fewer than',maxString+1,' characters.'
275 CALL PRINT_MESSAGE(msgBuffer,standardMessageUnit,
276 & SQUEEZE_RIGHT,myThreadId)
277 WRITE(msgBuffer,*)
278 &'*******************************************************'
279 CALL PRINT_MESSAGE(msgBuffer,standardMessageUnit,
280 & SQUEEZE_RIGHT,myThreadId)
281 GOTO 1000
282 902 CONTINUE
283 WRITE(msgBuffer,*)
284 &' '
285 CALL PRINT_MESSAGE(msgBuffer,standardMessageUnit,
286 & SQUEEZE_RIGHT,myThreadId)
287 WRITE(msgBuffer,*)
288 &'*** WARNING WARNING WARNING WARNING WARNING WARNING ***'
289 CALL PRINT_MESSAGE(msgBuffer,standardMessageUnit,
290 & SQUEEZE_RIGHT,myThreadId)
291 WRITE(msgBuffer,*)
292 &'procedure: "',callProc,'".'
293 CALL PRINT_MESSAGE(msgBuffer,standardMessageUnit,
294 & SQUEEZE_RIGHT,myThreadId)
295 WRITE(msgBuffer,*)
296 &' No timer action specified.'
297 CALL PRINT_MESSAGE(msgBuffer,standardMessageUnit,
298 & SQUEEZE_RIGHT,myThreadId)
299 WRITE(msgBuffer,*)
300 &' Valid actions are:'
301 CALL PRINT_MESSAGE(msgBuffer,standardMessageUnit,
302 & SQUEEZE_RIGHT,myThreadId)
303 WRITE(msgBuffer,*)
304 &' "START", "STOP", "PRINT" and "PRINTALL".'
305 CALL PRINT_MESSAGE(msgBuffer,standardMessageUnit,
306 & SQUEEZE_RIGHT,myThreadId)
307 WRITE(msgBuffer,*)
308 &'*******************************************************'
309 CALL PRINT_MESSAGE(msgBuffer,standardMessageUnit,
310 & SQUEEZE_RIGHT,myThreadId)
311 GOTO 1000
312 903 CONTINUE
313 WRITE(msgBuffer,*)
314 &' '
315 CALL PRINT_MESSAGE(msgBuffer,standardMessageUnit,
316 & SQUEEZE_RIGHT,myThreadId)
317 WRITE(msgBuffer,*)
318 &'*** WARNING WARNING WARNING WARNING WARNING WARNING ***'
319 CALL PRINT_MESSAGE(msgBuffer,standardMessageUnit,
320 & SQUEEZE_RIGHT,myThreadId)
321 WRITE(msgBuffer,*)
322 &'procedure: "',callProc,'".'
323 CALL PRINT_MESSAGE(msgBuffer,standardMessageUnit,
324 & SQUEEZE_RIGHT,myThreadId)
325 WRITE(msgBuffer,*)
326 &'Timer action"',name(ISTART:IEND),'" is invalid.'
327 CALL PRINT_MESSAGE(msgBuffer,standardMessageUnit,
328 & SQUEEZE_RIGHT,myThreadId)
329 WRITE(msgBuffer,*)
330 &' Valid actions are:'
331 CALL PRINT_MESSAGE(msgBuffer,standardMessageUnit,
332 & SQUEEZE_RIGHT,myThreadId)
333 WRITE(msgBuffer,*)
334 &' "START", "STOP", "PRINT" and "PRINTALL".'
335 CALL PRINT_MESSAGE(msgBuffer,standardMessageUnit,
336 & SQUEEZE_RIGHT,myThreadId)
337 WRITE(msgBuffer,*)
338 &'*******************************************************'
339 CALL PRINT_MESSAGE(msgBuffer,standardMessageUnit,
340 & SQUEEZE_RIGHT,myThreadId)
341 GOTO 1000
342 904 CONTINUE
343 WRITE(msgBuffer,*)
344 &' '
345 CALL PRINT_MESSAGE(msgBuffer,standardMessageUnit,
346 & SQUEEZE_RIGHT,myThreadId)
347 WRITE(msgBuffer,*)
348 &'*** WARNING WARNING WARNING WARNING WARNING WARNING ***'
349 CALL PRINT_MESSAGE(msgBuffer,standardMessageUnit,
350 & SQUEEZE_RIGHT,myThreadId)
351 WRITE(msgBuffer,*)
352 &'procedure: "',callProc,'".'
353 CALL PRINT_MESSAGE(msgBuffer,standardMessageUnit,
354 & SQUEEZE_RIGHT,myThreadId)
355 WRITE(msgBuffer,*)
356 &'Timer "',name(ISTART:IEND),'" cannot be created.'
357 CALL PRINT_MESSAGE(msgBuffer,standardMessageUnit,
358 & SQUEEZE_RIGHT,myThreadId)
359 WRITE(msgBuffer,*)
360 &' Only ',maxTimers,' timers are allowed.'
361 CALL PRINT_MESSAGE(msgBuffer,standardMessageUnit,
362 & SQUEEZE_RIGHT,myThreadId)
363 WRITE(msgBuffer,*)
364 &'*******************************************************'
365 CALL PRINT_MESSAGE(msgBuffer,standardMessageUnit,
366 & SQUEEZE_RIGHT,myThreadId)
367 GOTO 1000
368 905 CONTINUE
369 WRITE(msgBuffer,*)
370 &' '
371 CALL PRINT_MESSAGE(msgBuffer,standardMessageUnit,
372 & SQUEEZE_RIGHT,myThreadId)
373 WRITE(msgBuffer,*)
374 &'*** WARNING WARNING WARNING WARNING WARNING WARNING ***'
375 CALL PRINT_MESSAGE(msgBuffer,standardMessageUnit,
376 & SQUEEZE_RIGHT,myThreadId)
377 WRITE(msgBuffer,*)
378 &'procedure: "',callProc,'".'
379 CALL PRINT_MESSAGE(msgBuffer,standardMessageUnit,
380 & SQUEEZE_RIGHT,myThreadId)
381 WRITE(msgBuffer,*)
382 &'Timer name is blank.'
383 CALL PRINT_MESSAGE(msgBuffer,standardMessageUnit,
384 & SQUEEZE_RIGHT,myThreadId)
385 WRITE(msgBuffer,*)
386 &' A name must be used with "START", "STOP" or "PRINT".'
387 CALL PRINT_MESSAGE(msgBuffer,standardMessageUnit,
388 & SQUEEZE_RIGHT,myThreadId)
389 WRITE(msgBuffer,*)
390 &'*******************************************************'
391 CALL PRINT_MESSAGE(msgBuffer,standardMessageUnit,
392 & SQUEEZE_RIGHT,myThreadId)
393 GOTO 1000
394 END
395
396 CStartOfInterface
397 SUBROUTINE TIMER_GET_TIME(
398 O userTime,
399 O systemTime,
400 O wallClockTime )
401 C /==========================================================\
402 C | SUBROUTINE TIMER_GET_TIME |
403 C | o Query system timer routines. |
404 C |==========================================================|
405 C | Routine returns total elapsed time for program so far. |
406 C | Three times are returned that conventionally are used as |
407 C | user time, system time and wall-clock time. Not all these|
408 C | numbers are available on all machines. |
409 C \==========================================================/
410 Real*8 userTime
411 Real*8 systemTime
412 Real*8 wallClockTime
413 CEndOfInterface
414 Real*4 ETIME, ACTUAL, TARRAY(2)
415 EXTERNAL ETIME
416 Real*8 wtime
417 C Real*8 MPI_Wtime
418 C EXTERNAL MPI_Wtime
419
420 ACTUAL = ETIME(TARRAY)
421
422 userTime = TARRAY(1)
423 systemTime = TARRAY(2)
424 CALL CLOC(wTime)
425 wallClockTime = wtime
426
427 #ifdef ALLOW_USE_MPI
428 C wtime = MPI_Wtime()
429 C wallClockTime = wtime
430 #endif /* ALLOW_USE_MPI */
431 #ifndef ALLOW_USE_MPI
432 C wallClockTime = 0.
433 #endif
434
435 RETURN
436 END
437
438 CStartOfInterface
439 SUBROUTINE TIMER_PRINTALL( myThreadId )
440 C /==========================================================\
441 C | SUBROUTINE TIMER_PRINTALL |
442 C | o Print timer information |
443 C |==========================================================|
444 C | Request print out of table of timing from all timers. |
445 C \==========================================================/
446 INTEGER myThreadId
447 CEndOfInterface
448 C Print out value for every timer.
449 C
450 CALL TIMER_CONTROL( ' ', 'PRINTALL', 'TIMER_PRINTALL' ,
451 & myThreadId )
452 C
453 RETURN
454 END
455 C***********************************************************************
456 SUBROUTINE TIMER_START ( string , myThreadId )
457 C Return start timer named "string".
458 CHARACTER*(*) string
459 INTEGER myThreadId
460 C
461 CALL TIMER_CONTROL( string, 'START', 'TIMER_START' , myThreadId)
462 C
463 RETURN
464 END
465 C***********************************************************************
466 SUBROUTINE TIMER_STOP ( string , myThreadId)
467 C Return start timer named "string".
468 CHARACTER*(*) string
469 INTEGER myThreadId
470 C
471 CALL TIMER_CONTROL( string, 'STOP', 'TIMER_STOP' , myThreadId )
472 C
473 RETURN
474 END
475 C***********************************************************************

  ViewVC Help
Powered by ViewVC 1.1.22