/[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.9 - (show annotations) (download)
Sun Feb 4 14:38:44 2001 UTC (23 years, 4 months ago) by cnh
Branch: MAIN
CVS Tags: checkpoint40pre3, checkpoint40pre1, checkpoint40pre7, checkpoint40pre6, checkpoint40pre9, checkpoint40pre8, checkpoint38, checkpoint40pre2, checkpoint40pre4, pre38tag1, c37_adj, pre38-close, checkpoint39, checkpoint37, checkpoint36, checkpoint35, checkpoint40pre5, checkpoint40
Branch point for: pre38
Changes since 1.8: +2 -1 lines
Made sure each .F and .h file had
the CVS keywords Header and Name at its start.
Most had header but very few currently have Name, so
lots of changes!

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

  ViewVC Help
Powered by ViewVC 1.1.22