/[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.6 - (show annotations) (download)
Tue Mar 14 20:28:12 2000 UTC (24 years, 1 month ago) by adcroft
Branch: MAIN
CVS Tags: checkpoint25
Changes since 1.5: +13 -2 lines
Minor mods for compiling on T3E.

1 C $Header: /u/gcmpack/models/MITgcmUV/eesupp/src/timers.F,v 1.5 1999/05/24 15:15:11 adcroft 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 IMPLICIT NONE
27 INTEGER maxTimers
28 INTEGER nTimers
29 CHARACTER*(*) name
30 CHARACTER*(*) timerNames(maxTimers)
31 CEndOfInterface
32 INTEGER I
33 C
34 TIMER_INDEX = 0
35 IF ( name .EQ. ' ' ) THEN
36 TIMER_INDEX = -1
37 ELSE
38 DO 10 I = 1, nTimers
39 IF ( name .NE. timerNames(I) ) GOTO 10
40 TIMER_INDEX = I
41 GOTO 11
42 10 CONTINUE
43 11 CONTINUE
44 ENDIF
45 RETURN
46 END
47
48 CStartOfInterface
49 SUBROUTINE TIMER_CONTROL ( name , action , callProc , myThreadId )
50 C /==========================================================\
51 C | SUBROUTINE TIMER_CONTROL |
52 C | o Timing routine. |
53 C |==========================================================|
54 C | User callable interface to timing routines. Timers are |
55 C | created, stopped, started and queried only through this |
56 C | rtouine. |
57 C \==========================================================/
58 IMPLICIT NONE
59 #include "SIZE.h"
60 #include "EEPARAMS.h"
61 #include "EESUPPORT.h"
62 CHARACTER*(*) name
63 CHARACTER*(*) action
64 CHARACTER*(*) callProc
65 INTEGER myThreadId
66 CEndOfInterface
67 C
68 INTEGER TIMER_INDEX
69 INTEGER IFNBLNK
70 INTEGER ILNBLNK
71 EXTERNAL TIMER_INDEX
72 EXTERNAL IFNBLNK
73 EXTERNAL ILNBLNK
74 C
75 INTEGER maxTimers
76 INTEGER maxString
77 PARAMETER ( maxTimers = 40 )
78 PARAMETER ( maxString = 80 )
79 C
80 INTEGER timerStarts( maxTimers , MAX_NO_THREADS)
81 SAVE timerStarts
82 INTEGER timerStops ( maxTimers , MAX_NO_THREADS)
83 SAVE timerStops
84 Real*8 timerUser ( maxTimers , MAX_NO_THREADS)
85 SAVE timerUser
86 Real*8 timerWall ( maxTimers , MAX_NO_THREADS)
87 SAVE timerWall
88 Real*8 timerSys ( maxTimers , MAX_NO_THREADS)
89 SAVE timerSys
90 Real*8 timerT0User( maxTimers , MAX_NO_THREADS)
91 SAVE timerT0User
92 Real*8 timerT0Wall( maxTimers , MAX_NO_THREADS)
93 SAVE timerT0Wall
94 Real*8 timerT0Sys ( maxTimers , MAX_NO_THREADS)
95 SAVE timerT0Sys
96 C ===============================================================
97 C
98 INTEGER timerStatus( maxTimers , MAX_NO_THREADS)
99 SAVE timerStatus
100 INTEGER timerNameLen( maxTimers , MAX_NO_THREADS)
101 SAVE timerNameLen
102 CHARACTER*(maxString) timerNames( maxTimers , MAX_NO_THREADS)
103 SAVE timerNames
104 CHARACTER*(maxString) timerAction
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 EXTERNAL ETIME
420 #endif
421 Real*8 wtime
422 C Real*8 MPI_Wtime
423 C EXTERNAL MPI_Wtime
424
425 #ifdef TARGET_T3E
426 userTime = 0.
427 systemTime = 0.
428 #else
429 ACTUAL = ETIME(TARRAY)
430 userTime = TARRAY(1)
431 systemTime = TARRAY(2)
432 #endif
433
434 #ifdef TARGET_T3E
435 wallClockTime = 0.
436 #else
437 CALL CLOC(wTime)
438 wallClockTime = wtime
439 #endif
440
441 #ifdef ALLOW_USE_MPI
442 C wtime = MPI_Wtime()
443 C wallClockTime = wtime
444 #endif /* ALLOW_USE_MPI */
445 #ifndef ALLOW_USE_MPI
446 C wallClockTime = 0.
447 #endif
448
449 RETURN
450 END
451
452 CStartOfInterface
453 SUBROUTINE TIMER_PRINTALL( myThreadId )
454 C /==========================================================\
455 C | SUBROUTINE TIMER_PRINTALL |
456 C | o Print timer information |
457 C |==========================================================|
458 C | Request print out of table of timing from all timers. |
459 C \==========================================================/
460 IMPLICIT NONE
461 INTEGER myThreadId
462 CEndOfInterface
463 C Print out value for every timer.
464 C
465 CALL TIMER_CONTROL( ' ', 'PRINTALL', 'TIMER_PRINTALL' ,
466 & myThreadId )
467 C
468 RETURN
469 END
470 C***********************************************************************
471 SUBROUTINE TIMER_START ( string , myThreadId )
472 C Return start timer named "string".
473 IMPLICIT NONE
474 CHARACTER*(*) string
475 INTEGER myThreadId
476 C
477 CALL TIMER_CONTROL( string, 'START', 'TIMER_START' , myThreadId)
478 C
479 RETURN
480 END
481 C***********************************************************************
482 SUBROUTINE TIMER_STOP ( string , myThreadId)
483 C Return start timer named "string".
484 IMPLICIT NONE
485 CHARACTER*(*) string
486 INTEGER myThreadId
487 C
488 CALL TIMER_CONTROL( string, 'STOP', 'TIMER_STOP' , myThreadId )
489 C
490 RETURN
491 END
492 C***********************************************************************

  ViewVC Help
Powered by ViewVC 1.1.22