/[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.8 - (show annotations) (download)
Wed Jun 21 20:44:06 2000 UTC (23 years, 10 months ago) by heimbach
Branch: MAIN
CVS Tags: branch-atmos-merge-freeze, branch-atmos-merge-start, branch-atmos-merge-shapiro, checkpoint33, checkpoint32, checkpoint31, checkpoint30, checkpoint34, branch-atmos-merge-zonalfilt, branch-atmos-merge-phase5, branch-atmos-merge-phase4, branch-atmos-merge-phase7, branch-atmos-merge-phase6, branch-atmos-merge-phase1, branch-atmos-merge-phase3, branch-atmos-merge-phase2
Branch point for: branch-atmos-merge
Changes since 1.7: +5 -3 lines
Added #ifdef's for case TARGET_CRAY_VECTOR, defined in genmake. (P.H.)

1 C $Header: /u/gcmpack/models/MITgcmUV/eesupp/src/timers.F,v 1.7 2000/03/27 22:25:40 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 INTEGER nTimers(MAX_NO_THREADS)
105 CHARACTER*(maxString) tmpName
106 CHARACTER*(maxString) tmpAction
107 INTEGER iTimer
108 INTEGER ISTART
109 INTEGER IEND
110 INTEGER STOPPED
111 PARAMETER ( STOPPED = 0 )
112 INTEGER RUNNING
113 PARAMETER ( RUNNING = 1 )
114 CHARACTER*(*) STOP
115 PARAMETER ( STOP = 'STOP' )
116 CHARACTER*(*) START
117 PARAMETER ( START = 'START' )
118 CHARACTER*(*) PRINT
119 PARAMETER ( PRINT = 'PRINT' )
120 CHARACTER*(*) PRINTALL
121 PARAMETER ( PRINTALL = 'PRINTALL' )
122 INTEGER I
123 Real*8 userTime
124 Real*8 systemTime
125 Real*8 wallClockTime
126 CHARACTER*(MAX_LEN_MBUF) msgBuffer
127 C
128 DATA nTimers /MAX_NO_THREADS*0/
129 SAVE nTimers
130 C
131 ISTART = IFNBLNK(name)
132 IEND = ILNBLNK(name)
133 IF ( IEND - ISTART + 1 .GT. maxString ) GOTO 901
134 IF ( ISTART .NE. 0 ) THEN
135 tmpName = name(ISTART:IEND)
136 CALL UCASE( tmpName )
137 ELSE
138 tmpName = ' '
139 ENDIF
140 ISTART = IFNBLNK(action)
141 IEND = ILNBLNK(action)
142 IF ( ISTART .EQ. 0 ) GOTO 902
143 IF ( IEND - ISTART + 1 .GT. maxString ) GOTO 903
144 tmpAction = action(ISTART:IEND)
145 CALL UCASE( tmpAction )
146 C
147 iTimer=TIMER_INDEX(tmpName,timerNames(1,myThreadId),
148 & maxTimers,nTimers(myThreadId))
149 C
150 IF ( tmpAction .EQ. START ) THEN
151 IF ( iTimer .EQ. 0 ) THEN
152 IF ( nTimers(myThreadId) .EQ. maxTimers ) GOTO 904
153 nTimers(myThreadId) = nTimers(myThreadId) + 1
154 iTimer = nTimers(myThreadId)
155 timerNames(iTimer,myThreadId) = tmpName
156 timerNameLen(iTimer,myThreadId) =
157 & ILNBLNK(tmpName)-IFNBLNK(tmpName)+1
158 timerUser(iTimer,myThreadId) = 0.
159 timerSys (iTimer,myThreadId) = 0.
160 timerWall(iTimer,myThreadId) = 0.
161 timerStarts(iTimer,myThreadId) = 0
162 timerStops (iTimer,myThreadId) = 0
163 timerStatus(iTimer,myThreadId) = STOPPED
164 ENDIF
165 IF ( timerStatus(iTimer,myThreadId) .NE. RUNNING ) THEN
166 CALL TIMER_GET_TIME( userTime, systemTime, wallClockTime )
167 timerT0User(iTimer,myThreadId) = userTime
168 timerT0Sys(iTimer,myThreadId) = systemTime
169 timerT0Wall(iTimer,myThreadId) = wallClockTime
170 timerStatus(iTimer,myThreadId) = RUNNING
171 timerStarts(iTimer,myThreadId) =
172 & timerStarts(iTimer,myThreadId)+1
173 ENDIF
174 ELSEIF ( tmpAction .EQ. STOP ) THEN
175 IF ( iTimer .EQ. 0 ) GOTO 905
176 IF ( timerStatus(iTimer,myThreadId) .EQ. RUNNING ) THEN
177 CALL TIMER_GET_TIME( userTime, systemTime, wallClockTime )
178 timerUser(iTimer,myThreadId) =
179 & timerUser(iTimer,myThreadId) +
180 & userTime -
181 & timerT0User(iTimer,myThreadId)
182 timerSys (iTimer,myThreadId) =
183 & timerSys(iTimer,myThreadId) +
184 & systemTime -
185 & timerT0Sys(iTimer,myThreadId)
186 timerWall(iTimer,myThreadId) =
187 & timerWall(iTimer,myThreadId) +
188 & wallClockTime -
189 & timerT0Wall(iTimer,myThreadId)
190 timerStatus(iTimer,myThreadId) = STOPPED
191 timerStops (iTimer,myThreadId) =
192 & timerStops (iTimer,myThreadId)+1
193 ENDIF
194 ELSEIF ( tmpAction .EQ. PRINT ) THEN
195 IF ( iTimer .EQ. 0 ) GOTO 905
196 WRITE(msgBuffer,*)
197 & ' Seconds in section "',
198 & timerNames(iTimer,myThreadId)(1:timerNameLen(iTimer,myThreadId))
199 & ,'":'
200 CALL PRINT_MESSAGE(msgBuffer,standardMessageUnit,
201 & SQUEEZE_RIGHT,myThreadId)
202 WRITE(msgBuffer,*) ' User time:',
203 & timerUser(iTimer,myThreadId)
204 CALL PRINT_MESSAGE(msgBuffer,standardMessageUnit,
205 & SQUEEZE_RIGHT,myThreadId)
206 WRITE(msgBuffer,*) ' System time:',
207 & timerSys(iTimer,myThreadId)
208 CALL PRINT_MESSAGE(msgBuffer,standardMessageUnit,
209 & SQUEEZE_RIGHT,myThreadId)
210 WRITE(msgBuffer,*) ' Wall clock time:',
211 & timerWall(iTimer,myThreadId)
212 CALL PRINT_MESSAGE(msgBuffer,standardMessageUnit,
213 & SQUEEZE_RIGHT,myThreadId)
214 WRITE(msgBuffer,*) ' No. starts:',
215 & timerStarts(iTimer,myThreadId)
216 CALL PRINT_MESSAGE(msgBuffer,standardMessageUnit,
217 & SQUEEZE_RIGHT,myThreadId)
218 WRITE(msgBuffer,*) ' No. stops:',
219 & timerStops(iTimer,myThreadId)
220 CALL PRINT_MESSAGE(msgBuffer,standardMessageUnit,
221 & SQUEEZE_RIGHT,myThreadId)
222 ELSEIF ( tmpAction .EQ. PRINTALL ) THEN
223 DO 10 I = 1, nTimers(myThreadId)
224 WRITE(msgBuffer,*) ' Seconds in section "',
225 & timerNames(I,myThreadId)(1:timerNameLen(I,myThreadId))
226 & ,'":'
227 CALL PRINT_MESSAGE(msgBuffer,standardMessageUnit,
228 & SQUEEZE_RIGHT,myThreadId)
229 WRITE(msgBuffer,*) ' User time:',
230 & timerUser(I,myThreadId)
231 CALL PRINT_MESSAGE(msgBuffer,standardMessageUnit,
232 & SQUEEZE_RIGHT,myThreadId)
233 WRITE(msgBuffer,*) ' System time:',
234 & timerSys(I,myThreadId)
235 CALL PRINT_MESSAGE(msgBuffer,standardMessageUnit,
236 & SQUEEZE_RIGHT,myThreadId)
237 WRITE(msgBuffer,*) ' Wall clock time:',
238 & timerWall(I,myThreadId)
239 CALL PRINT_MESSAGE(msgBuffer,standardMessageUnit,
240 & SQUEEZE_RIGHT,myThreadId)
241 WRITE(msgBuffer,*) ' No. starts:',
242 & timerStarts(I,myThreadId)
243 CALL PRINT_MESSAGE(msgBuffer,standardMessageUnit,
244 & SQUEEZE_RIGHT,myThreadId)
245 WRITE(msgBuffer,*) ' No. stops:',
246 & timerStops(I,myThreadId)
247 CALL PRINT_MESSAGE(msgBuffer,standardMessageUnit,
248 & SQUEEZE_RIGHT,myThreadId)
249 10 CONTINUE
250 ELSE
251 GOTO 903
252 ENDIF
253 C
254 1000 CONTINUE
255 C
256 RETURN
257 901 CONTINUE
258 WRITE(msgBuffer,'(A)')
259 &' '
260 CALL PRINT_MESSAGE(msgBuffer,standardMessageUnit,
261 & SQUEEZE_RIGHT,myThreadId)
262 WRITE(msgBuffer,*)
263 &'*** WARNING WARNING WARNING WARNING WARNING WARNING ***'
264 CALL PRINT_MESSAGE(msgBuffer,standardMessageUnit,
265 & SQUEEZE_RIGHT,myThreadId)
266 WRITE(msgBuffer,*)
267 &'procedure: "',callProc,'".'
268 CALL PRINT_MESSAGE(msgBuffer,standardMessageUnit,
269 & SQUEEZE_RIGHT,myThreadId)
270 WRITE(msgBuffer,*)
271 &'Timer name "',name(ISTART:IEND),'" is invalid.'
272 CALL PRINT_MESSAGE(msgBuffer,standardMessageUnit,
273 & SQUEEZE_RIGHT,myThreadId)
274 WRITE(msgBuffer,*)
275 &' Names must have fewer than',maxString+1,' characters.'
276 CALL PRINT_MESSAGE(msgBuffer,standardMessageUnit,
277 & SQUEEZE_RIGHT,myThreadId)
278 WRITE(msgBuffer,*)
279 &'*******************************************************'
280 CALL PRINT_MESSAGE(msgBuffer,standardMessageUnit,
281 & SQUEEZE_RIGHT,myThreadId)
282 GOTO 1000
283 902 CONTINUE
284 WRITE(msgBuffer,*)
285 &' '
286 CALL PRINT_MESSAGE(msgBuffer,standardMessageUnit,
287 & SQUEEZE_RIGHT,myThreadId)
288 WRITE(msgBuffer,*)
289 &'*** WARNING WARNING WARNING WARNING WARNING WARNING ***'
290 CALL PRINT_MESSAGE(msgBuffer,standardMessageUnit,
291 & SQUEEZE_RIGHT,myThreadId)
292 WRITE(msgBuffer,*)
293 &'procedure: "',callProc,'".'
294 CALL PRINT_MESSAGE(msgBuffer,standardMessageUnit,
295 & SQUEEZE_RIGHT,myThreadId)
296 WRITE(msgBuffer,*)
297 &' No timer action specified.'
298 CALL PRINT_MESSAGE(msgBuffer,standardMessageUnit,
299 & SQUEEZE_RIGHT,myThreadId)
300 WRITE(msgBuffer,*)
301 &' Valid actions are:'
302 CALL PRINT_MESSAGE(msgBuffer,standardMessageUnit,
303 & SQUEEZE_RIGHT,myThreadId)
304 WRITE(msgBuffer,*)
305 &' "START", "STOP", "PRINT" and "PRINTALL".'
306 CALL PRINT_MESSAGE(msgBuffer,standardMessageUnit,
307 & SQUEEZE_RIGHT,myThreadId)
308 WRITE(msgBuffer,*)
309 &'*******************************************************'
310 CALL PRINT_MESSAGE(msgBuffer,standardMessageUnit,
311 & SQUEEZE_RIGHT,myThreadId)
312 GOTO 1000
313 903 CONTINUE
314 WRITE(msgBuffer,*)
315 &' '
316 CALL PRINT_MESSAGE(msgBuffer,standardMessageUnit,
317 & SQUEEZE_RIGHT,myThreadId)
318 WRITE(msgBuffer,*)
319 &'*** WARNING WARNING WARNING WARNING WARNING WARNING ***'
320 CALL PRINT_MESSAGE(msgBuffer,standardMessageUnit,
321 & SQUEEZE_RIGHT,myThreadId)
322 WRITE(msgBuffer,*)
323 &'procedure: "',callProc,'".'
324 CALL PRINT_MESSAGE(msgBuffer,standardMessageUnit,
325 & SQUEEZE_RIGHT,myThreadId)
326 WRITE(msgBuffer,*)
327 &'Timer action"',name(ISTART:IEND),'" is invalid.'
328 CALL PRINT_MESSAGE(msgBuffer,standardMessageUnit,
329 & SQUEEZE_RIGHT,myThreadId)
330 WRITE(msgBuffer,*)
331 &' Valid actions are:'
332 CALL PRINT_MESSAGE(msgBuffer,standardMessageUnit,
333 & SQUEEZE_RIGHT,myThreadId)
334 WRITE(msgBuffer,*)
335 &' "START", "STOP", "PRINT" and "PRINTALL".'
336 CALL PRINT_MESSAGE(msgBuffer,standardMessageUnit,
337 & SQUEEZE_RIGHT,myThreadId)
338 WRITE(msgBuffer,*)
339 &'*******************************************************'
340 CALL PRINT_MESSAGE(msgBuffer,standardMessageUnit,
341 & SQUEEZE_RIGHT,myThreadId)
342 GOTO 1000
343 904 CONTINUE
344 WRITE(msgBuffer,*)
345 &' '
346 CALL PRINT_MESSAGE(msgBuffer,standardMessageUnit,
347 & SQUEEZE_RIGHT,myThreadId)
348 WRITE(msgBuffer,*)
349 &'*** WARNING WARNING WARNING WARNING WARNING WARNING ***'
350 CALL PRINT_MESSAGE(msgBuffer,standardMessageUnit,
351 & SQUEEZE_RIGHT,myThreadId)
352 WRITE(msgBuffer,*)
353 &'procedure: "',callProc,'".'
354 CALL PRINT_MESSAGE(msgBuffer,standardMessageUnit,
355 & SQUEEZE_RIGHT,myThreadId)
356 WRITE(msgBuffer,*)
357 &'Timer "',name(ISTART:IEND),'" cannot be created.'
358 CALL PRINT_MESSAGE(msgBuffer,standardMessageUnit,
359 & SQUEEZE_RIGHT,myThreadId)
360 WRITE(msgBuffer,*)
361 &' Only ',maxTimers,' timers are allowed.'
362 CALL PRINT_MESSAGE(msgBuffer,standardMessageUnit,
363 & SQUEEZE_RIGHT,myThreadId)
364 WRITE(msgBuffer,*)
365 &'*******************************************************'
366 CALL PRINT_MESSAGE(msgBuffer,standardMessageUnit,
367 & SQUEEZE_RIGHT,myThreadId)
368 GOTO 1000
369 905 CONTINUE
370 WRITE(msgBuffer,*)
371 &' '
372 CALL PRINT_MESSAGE(msgBuffer,standardMessageUnit,
373 & SQUEEZE_RIGHT,myThreadId)
374 WRITE(msgBuffer,*)
375 &'*** WARNING WARNING WARNING WARNING WARNING WARNING ***'
376 CALL PRINT_MESSAGE(msgBuffer,standardMessageUnit,
377 & SQUEEZE_RIGHT,myThreadId)
378 WRITE(msgBuffer,*)
379 &'procedure: "',callProc,'".'
380 CALL PRINT_MESSAGE(msgBuffer,standardMessageUnit,
381 & SQUEEZE_RIGHT,myThreadId)
382 WRITE(msgBuffer,*)
383 &'Timer name is blank.'
384 CALL PRINT_MESSAGE(msgBuffer,standardMessageUnit,
385 & SQUEEZE_RIGHT,myThreadId)
386 WRITE(msgBuffer,*)
387 &' A name must be used with "START", "STOP" or "PRINT".'
388 CALL PRINT_MESSAGE(msgBuffer,standardMessageUnit,
389 & SQUEEZE_RIGHT,myThreadId)
390 WRITE(msgBuffer,*)
391 &'*******************************************************'
392 CALL PRINT_MESSAGE(msgBuffer,standardMessageUnit,
393 & SQUEEZE_RIGHT,myThreadId)
394 GOTO 1000
395 END
396
397 CStartOfInterface
398 SUBROUTINE TIMER_GET_TIME(
399 O userTime,
400 O systemTime,
401 O wallClockTime )
402 C /==========================================================\
403 C | SUBROUTINE TIMER_GET_TIME |
404 C | o Query system timer routines. |
405 C |==========================================================|
406 C | Routine returns total elapsed time for program so far. |
407 C | Three times are returned that conventionally are used as |
408 C | user time, system time and wall-clock time. Not all these|
409 C | numbers are available on all machines. |
410 C \==========================================================/
411 IMPLICIT NONE
412 Real*8 userTime
413 Real*8 systemTime
414 Real*8 wallClockTime
415 CEndOfInterface
416 Real*4 ETIME, ACTUAL, TARRAY(2)
417 #ifndef TARGET_T3E
418 #ifndef TARGET_CRAY_VECTOR
419 EXTERNAL ETIME
420 #endif
421 #endif
422 Real*8 wtime
423 C Real*8 MPI_Wtime
424 C EXTERNAL MPI_Wtime
425
426 #if (defined (TARGET_T3E) || defined (TARGET_CRAY_VECTOR))
427 userTime = 0.
428 systemTime = 0.
429 #else
430 ACTUAL = ETIME(TARRAY)
431 userTime = TARRAY(1)
432 systemTime = TARRAY(2)
433 #endif
434
435 #if (defined (TARGET_T3E) || defined (TARGET_CRAY_VECTOR))
436 wallClockTime = 0.
437 #else
438 CALL CLOC(wTime)
439 wallClockTime = wtime
440 #endif
441
442 #ifdef ALLOW_USE_MPI
443 C wtime = MPI_Wtime()
444 C wallClockTime = wtime
445 #endif /* ALLOW_USE_MPI */
446 #ifndef ALLOW_USE_MPI
447 C wallClockTime = 0.
448 #endif
449
450 RETURN
451 END
452
453 CStartOfInterface
454 SUBROUTINE TIMER_PRINTALL( myThreadId )
455 C /==========================================================\
456 C | SUBROUTINE TIMER_PRINTALL |
457 C | o Print timer information |
458 C |==========================================================|
459 C | Request print out of table of timing from all timers. |
460 C \==========================================================/
461 IMPLICIT NONE
462 INTEGER myThreadId
463 CEndOfInterface
464 C Print out value for every timer.
465 C
466 CALL TIMER_CONTROL( ' ', 'PRINTALL', 'TIMER_PRINTALL' ,
467 & myThreadId )
468 C
469 RETURN
470 END
471 C***********************************************************************
472 SUBROUTINE TIMER_START ( string , myThreadId )
473 C Return start timer named "string".
474 IMPLICIT NONE
475 CHARACTER*(*) string
476 INTEGER myThreadId
477 C
478 CALL TIMER_CONTROL( string, 'START', 'TIMER_START' , myThreadId)
479 C
480 RETURN
481 END
482 C***********************************************************************
483 SUBROUTINE TIMER_STOP ( string , myThreadId)
484 C Return start timer named "string".
485 IMPLICIT NONE
486 CHARACTER*(*) string
487 INTEGER myThreadId
488 C
489 CALL TIMER_CONTROL( string, 'STOP', 'TIMER_STOP' , myThreadId )
490 C
491 RETURN
492 END
493 C***********************************************************************

  ViewVC Help
Powered by ViewVC 1.1.22