1 |
C $Header: /u/gcmpack/models/MITgcmUV/eesupp/src/timers.F,v 1.11 2001/09/21 14:31:12 adcroft Exp $ |
2 |
C $Name: checkpoint43 $ |
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 |
CGG Modified following A. Biastoch for use with SP3. Is backwards |
18 |
CGG compatible. G. Gebbie, gebbie@mit.edu, 20 Oct 2001, Scripps. |
19 |
|
20 |
CBOP |
21 |
C !ROUTINE: TIMER_INDEX |
22 |
|
23 |
C !INTERFACE: |
24 |
INTEGER FUNCTION TIMER_INDEX ( |
25 |
I name,timerNames,maxTimers,nTimers ) |
26 |
IMPLICIT NONE |
27 |
|
28 |
C !DESCRIPTION: |
29 |
C *==========================================================* |
30 |
C | FUNCTION TIMER_INDEX |
31 |
C | o Timing support routine. |
32 |
C *==========================================================* |
33 |
C | Return index in timer data structure of timer named |
34 |
C | by the function argument "name". |
35 |
C *==========================================================* |
36 |
|
37 |
C !INPUT/OUTPUT PARAMETERS: |
38 |
C == Routine arguements == |
39 |
C maxTimers :: Total number of timers allowed |
40 |
C nTimers :: Current number of timers |
41 |
C name :: Name of timer to find |
42 |
C timerNames :: List of valid timer names |
43 |
INTEGER maxTimers |
44 |
INTEGER nTimers |
45 |
CHARACTER*(*) name |
46 |
CHARACTER*(*) timerNames(maxTimers) |
47 |
|
48 |
C !LOCAL VARIABLES: |
49 |
C == Local variables == |
50 |
C I :: Index variable |
51 |
INTEGER I |
52 |
CEOP |
53 |
C |
54 |
TIMER_INDEX = 0 |
55 |
IF ( name .EQ. ' ' ) THEN |
56 |
TIMER_INDEX = -1 |
57 |
ELSE |
58 |
DO 10 I = 1, nTimers |
59 |
IF ( name .NE. timerNames(I) ) GOTO 10 |
60 |
TIMER_INDEX = I |
61 |
GOTO 11 |
62 |
10 CONTINUE |
63 |
11 CONTINUE |
64 |
ENDIF |
65 |
RETURN |
66 |
END |
67 |
|
68 |
CBOP |
69 |
C !ROUTINE: TIMER_CONTROL |
70 |
|
71 |
C !INTERFACE: |
72 |
SUBROUTINE TIMER_CONTROL ( name , action , callProc , myThreadId ) |
73 |
IMPLICIT NONE |
74 |
|
75 |
C !DESCRIPTION: |
76 |
C *==========================================================* |
77 |
C | SUBROUTINE TIMER_CONTROL | |
78 |
C | o Timing routine. | |
79 |
C *==========================================================* |
80 |
C | User callable interface to timing routines. Timers are | |
81 |
C | created, stopped, started and queried only through this | |
82 |
C | rtouine. | |
83 |
C *==========================================================* |
84 |
|
85 |
C !USES: |
86 |
#include "SIZE.h" |
87 |
#include "EEPARAMS.h" |
88 |
#include "EESUPPORT.h" |
89 |
INTEGER TIMER_INDEX |
90 |
INTEGER IFNBLNK |
91 |
INTEGER ILNBLNK |
92 |
EXTERNAL TIMER_INDEX |
93 |
EXTERNAL IFNBLNK |
94 |
EXTERNAL ILNBLNK |
95 |
|
96 |
C !INPUT/OUTPUT PARAMETERS: |
97 |
C name :: name of the timer |
98 |
C action :: operation to perform with this timer |
99 |
C callProc :: procedure calling this routine |
100 |
C myThreadId :: instance number of this thread |
101 |
CHARACTER*(*) name |
102 |
CHARACTER*(*) action |
103 |
CHARACTER*(*) callProc |
104 |
INTEGER myThreadId |
105 |
C |
106 |
C !LOCAL VARIABLES: |
107 |
C maxTimers :: Total numer of timer allowed |
108 |
C maxString :: Max length of a timer name |
109 |
INTEGER maxTimers |
110 |
INTEGER maxString |
111 |
PARAMETER ( maxTimers = 40 ) |
112 |
PARAMETER ( maxString = 80 ) |
113 |
C timerStarts :: Timer counters for each timer and each thread |
114 |
C timerStops |
115 |
C timerUser |
116 |
C timerWall |
117 |
C timerSys |
118 |
C timerT0User |
119 |
C timerT0Wall |
120 |
C timerT0Sys |
121 |
C timerStatus :: START/STOP/RUNNING Status of the timer |
122 |
C timerNameLen :: Length of timer name |
123 |
C timerNames :: Table of timer names |
124 |
C nTimers :: Number of active timers |
125 |
INTEGER timerStarts( maxTimers , MAX_NO_THREADS) |
126 |
SAVE timerStarts |
127 |
INTEGER timerStops ( maxTimers , MAX_NO_THREADS) |
128 |
SAVE timerStops |
129 |
Real*8 timerUser ( maxTimers , MAX_NO_THREADS) |
130 |
SAVE timerUser |
131 |
Real*8 timerWall ( maxTimers , MAX_NO_THREADS) |
132 |
SAVE timerWall |
133 |
Real*8 timerSys ( maxTimers , MAX_NO_THREADS) |
134 |
SAVE timerSys |
135 |
Real*8 timerT0User( maxTimers , MAX_NO_THREADS) |
136 |
SAVE timerT0User |
137 |
Real*8 timerT0Wall( maxTimers , MAX_NO_THREADS) |
138 |
SAVE timerT0Wall |
139 |
Real*8 timerT0Sys ( maxTimers , MAX_NO_THREADS) |
140 |
SAVE timerT0Sys |
141 |
INTEGER timerStatus( maxTimers , MAX_NO_THREADS) |
142 |
SAVE timerStatus |
143 |
INTEGER timerNameLen( maxTimers , MAX_NO_THREADS) |
144 |
SAVE timerNameLen |
145 |
CHARACTER*(maxString) timerNames( maxTimers , MAX_NO_THREADS) |
146 |
SAVE timerNames |
147 |
INTEGER nTimers(MAX_NO_THREADS) |
148 |
CHARACTER*(maxString) tmpName |
149 |
CHARACTER*(maxString) tmpAction |
150 |
INTEGER iTimer |
151 |
INTEGER ISTART |
152 |
INTEGER IEND |
153 |
INTEGER STOPPED |
154 |
PARAMETER ( STOPPED = 0 ) |
155 |
INTEGER RUNNING |
156 |
PARAMETER ( RUNNING = 1 ) |
157 |
CHARACTER*(*) STOP |
158 |
PARAMETER ( STOP = 'STOP' ) |
159 |
CHARACTER*(*) START |
160 |
PARAMETER ( START = 'START' ) |
161 |
CHARACTER*(*) PRINT |
162 |
PARAMETER ( PRINT = 'PRINT' ) |
163 |
CHARACTER*(*) PRINTALL |
164 |
PARAMETER ( PRINTALL = 'PRINTALL' ) |
165 |
INTEGER I |
166 |
Real*8 userTime |
167 |
Real*8 systemTime |
168 |
Real*8 wallClockTime |
169 |
CHARACTER*(MAX_LEN_MBUF) msgBuffer |
170 |
DATA nTimers /MAX_NO_THREADS*0/ |
171 |
SAVE nTimers |
172 |
CEOP |
173 |
C |
174 |
ISTART = IFNBLNK(name) |
175 |
IEND = ILNBLNK(name) |
176 |
IF ( IEND - ISTART + 1 .GT. maxString ) GOTO 901 |
177 |
IF ( ISTART .NE. 0 ) THEN |
178 |
tmpName = name(ISTART:IEND) |
179 |
CALL UCASE( tmpName ) |
180 |
ELSE |
181 |
tmpName = ' ' |
182 |
ENDIF |
183 |
ISTART = IFNBLNK(action) |
184 |
IEND = ILNBLNK(action) |
185 |
IF ( ISTART .EQ. 0 ) GOTO 902 |
186 |
IF ( IEND - ISTART + 1 .GT. maxString ) GOTO 903 |
187 |
tmpAction = action(ISTART:IEND) |
188 |
CALL UCASE( tmpAction ) |
189 |
C |
190 |
iTimer=TIMER_INDEX(tmpName,timerNames(1,myThreadId), |
191 |
& maxTimers,nTimers(myThreadId)) |
192 |
C |
193 |
IF ( tmpAction .EQ. START ) THEN |
194 |
IF ( iTimer .EQ. 0 ) THEN |
195 |
IF ( nTimers(myThreadId) .EQ. maxTimers ) GOTO 904 |
196 |
nTimers(myThreadId) = nTimers(myThreadId) + 1 |
197 |
iTimer = nTimers(myThreadId) |
198 |
timerNames(iTimer,myThreadId) = tmpName |
199 |
timerNameLen(iTimer,myThreadId) = |
200 |
& ILNBLNK(tmpName)-IFNBLNK(tmpName)+1 |
201 |
timerUser(iTimer,myThreadId) = 0. |
202 |
timerSys (iTimer,myThreadId) = 0. |
203 |
timerWall(iTimer,myThreadId) = 0. |
204 |
timerStarts(iTimer,myThreadId) = 0 |
205 |
timerStops (iTimer,myThreadId) = 0 |
206 |
timerStatus(iTimer,myThreadId) = STOPPED |
207 |
ENDIF |
208 |
IF ( timerStatus(iTimer,myThreadId) .NE. RUNNING ) THEN |
209 |
CALL TIMER_GET_TIME( userTime, systemTime, wallClockTime ) |
210 |
timerT0User(iTimer,myThreadId) = userTime |
211 |
timerT0Sys(iTimer,myThreadId) = systemTime |
212 |
timerT0Wall(iTimer,myThreadId) = wallClockTime |
213 |
timerStatus(iTimer,myThreadId) = RUNNING |
214 |
timerStarts(iTimer,myThreadId) = |
215 |
& timerStarts(iTimer,myThreadId)+1 |
216 |
ENDIF |
217 |
ELSEIF ( tmpAction .EQ. STOP ) THEN |
218 |
IF ( iTimer .EQ. 0 ) GOTO 905 |
219 |
IF ( timerStatus(iTimer,myThreadId) .EQ. RUNNING ) THEN |
220 |
CALL TIMER_GET_TIME( userTime, systemTime, wallClockTime ) |
221 |
timerUser(iTimer,myThreadId) = |
222 |
& timerUser(iTimer,myThreadId) + |
223 |
& userTime - |
224 |
& timerT0User(iTimer,myThreadId) |
225 |
timerSys (iTimer,myThreadId) = |
226 |
& timerSys(iTimer,myThreadId) + |
227 |
& systemTime - |
228 |
& timerT0Sys(iTimer,myThreadId) |
229 |
timerWall(iTimer,myThreadId) = |
230 |
& timerWall(iTimer,myThreadId) + |
231 |
& wallClockTime - |
232 |
& timerT0Wall(iTimer,myThreadId) |
233 |
timerStatus(iTimer,myThreadId) = STOPPED |
234 |
timerStops (iTimer,myThreadId) = |
235 |
& timerStops (iTimer,myThreadId)+1 |
236 |
ENDIF |
237 |
ELSEIF ( tmpAction .EQ. PRINT ) THEN |
238 |
IF ( iTimer .EQ. 0 ) GOTO 905 |
239 |
WRITE(msgBuffer,*) |
240 |
& ' Seconds in section "', |
241 |
& timerNames(iTimer,myThreadId)(1:timerNameLen(iTimer,myThreadId)) |
242 |
& ,'":' |
243 |
CALL PRINT_MESSAGE(msgBuffer,standardMessageUnit, |
244 |
& SQUEEZE_RIGHT,myThreadId) |
245 |
WRITE(msgBuffer,*) ' User time:', |
246 |
& timerUser(iTimer,myThreadId) |
247 |
CALL PRINT_MESSAGE(msgBuffer,standardMessageUnit, |
248 |
& SQUEEZE_RIGHT,myThreadId) |
249 |
WRITE(msgBuffer,*) ' System time:', |
250 |
& timerSys(iTimer,myThreadId) |
251 |
CALL PRINT_MESSAGE(msgBuffer,standardMessageUnit, |
252 |
& SQUEEZE_RIGHT,myThreadId) |
253 |
WRITE(msgBuffer,*) ' Wall clock time:', |
254 |
& timerWall(iTimer,myThreadId) |
255 |
CALL PRINT_MESSAGE(msgBuffer,standardMessageUnit, |
256 |
& SQUEEZE_RIGHT,myThreadId) |
257 |
WRITE(msgBuffer,*) ' No. starts:', |
258 |
& timerStarts(iTimer,myThreadId) |
259 |
CALL PRINT_MESSAGE(msgBuffer,standardMessageUnit, |
260 |
& SQUEEZE_RIGHT,myThreadId) |
261 |
WRITE(msgBuffer,*) ' No. stops:', |
262 |
& timerStops(iTimer,myThreadId) |
263 |
CALL PRINT_MESSAGE(msgBuffer,standardMessageUnit, |
264 |
& SQUEEZE_RIGHT,myThreadId) |
265 |
ELSEIF ( tmpAction .EQ. PRINTALL ) THEN |
266 |
DO 10 I = 1, nTimers(myThreadId) |
267 |
WRITE(msgBuffer,*) ' Seconds in section "', |
268 |
& timerNames(I,myThreadId)(1:timerNameLen(I,myThreadId)) |
269 |
& ,'":' |
270 |
CALL PRINT_MESSAGE(msgBuffer,standardMessageUnit, |
271 |
& SQUEEZE_RIGHT,myThreadId) |
272 |
WRITE(msgBuffer,*) ' User time:', |
273 |
& timerUser(I,myThreadId) |
274 |
CALL PRINT_MESSAGE(msgBuffer,standardMessageUnit, |
275 |
& SQUEEZE_RIGHT,myThreadId) |
276 |
WRITE(msgBuffer,*) ' System time:', |
277 |
& timerSys(I,myThreadId) |
278 |
CALL PRINT_MESSAGE(msgBuffer,standardMessageUnit, |
279 |
& SQUEEZE_RIGHT,myThreadId) |
280 |
WRITE(msgBuffer,*) ' Wall clock time:', |
281 |
& timerWall(I,myThreadId) |
282 |
CALL PRINT_MESSAGE(msgBuffer,standardMessageUnit, |
283 |
& SQUEEZE_RIGHT,myThreadId) |
284 |
WRITE(msgBuffer,*) ' No. starts:', |
285 |
& timerStarts(I,myThreadId) |
286 |
CALL PRINT_MESSAGE(msgBuffer,standardMessageUnit, |
287 |
& SQUEEZE_RIGHT,myThreadId) |
288 |
WRITE(msgBuffer,*) ' No. stops:', |
289 |
& timerStops(I,myThreadId) |
290 |
CALL PRINT_MESSAGE(msgBuffer,standardMessageUnit, |
291 |
& SQUEEZE_RIGHT,myThreadId) |
292 |
10 CONTINUE |
293 |
ELSE |
294 |
GOTO 903 |
295 |
ENDIF |
296 |
C |
297 |
1000 CONTINUE |
298 |
C |
299 |
RETURN |
300 |
901 CONTINUE |
301 |
WRITE(msgBuffer,'(A)') |
302 |
&' ' |
303 |
CALL PRINT_MESSAGE(msgBuffer,standardMessageUnit, |
304 |
& SQUEEZE_RIGHT,myThreadId) |
305 |
WRITE(msgBuffer,*) |
306 |
&'*** WARNING WARNING WARNING WARNING WARNING WARNING ***' |
307 |
CALL PRINT_MESSAGE(msgBuffer,standardMessageUnit, |
308 |
& SQUEEZE_RIGHT,myThreadId) |
309 |
WRITE(msgBuffer,*) |
310 |
&'procedure: "',callProc,'".' |
311 |
CALL PRINT_MESSAGE(msgBuffer,standardMessageUnit, |
312 |
& SQUEEZE_RIGHT,myThreadId) |
313 |
WRITE(msgBuffer,*) |
314 |
&'Timer name "',name(ISTART:IEND),'" is invalid.' |
315 |
CALL PRINT_MESSAGE(msgBuffer,standardMessageUnit, |
316 |
& SQUEEZE_RIGHT,myThreadId) |
317 |
WRITE(msgBuffer,*) |
318 |
&' Names must have fewer than',maxString+1,' characters.' |
319 |
CALL PRINT_MESSAGE(msgBuffer,standardMessageUnit, |
320 |
& SQUEEZE_RIGHT,myThreadId) |
321 |
WRITE(msgBuffer,*) |
322 |
&'*******************************************************' |
323 |
CALL PRINT_MESSAGE(msgBuffer,standardMessageUnit, |
324 |
& SQUEEZE_RIGHT,myThreadId) |
325 |
GOTO 1000 |
326 |
902 CONTINUE |
327 |
WRITE(msgBuffer,*) |
328 |
&' ' |
329 |
CALL PRINT_MESSAGE(msgBuffer,standardMessageUnit, |
330 |
& SQUEEZE_RIGHT,myThreadId) |
331 |
WRITE(msgBuffer,*) |
332 |
&'*** WARNING WARNING WARNING WARNING WARNING WARNING ***' |
333 |
CALL PRINT_MESSAGE(msgBuffer,standardMessageUnit, |
334 |
& SQUEEZE_RIGHT,myThreadId) |
335 |
WRITE(msgBuffer,*) |
336 |
&'procedure: "',callProc,'".' |
337 |
CALL PRINT_MESSAGE(msgBuffer,standardMessageUnit, |
338 |
& SQUEEZE_RIGHT,myThreadId) |
339 |
WRITE(msgBuffer,*) |
340 |
&' No timer action specified.' |
341 |
CALL PRINT_MESSAGE(msgBuffer,standardMessageUnit, |
342 |
& SQUEEZE_RIGHT,myThreadId) |
343 |
WRITE(msgBuffer,*) |
344 |
&' Valid actions are:' |
345 |
CALL PRINT_MESSAGE(msgBuffer,standardMessageUnit, |
346 |
& SQUEEZE_RIGHT,myThreadId) |
347 |
WRITE(msgBuffer,*) |
348 |
&' "START", "STOP", "PRINT" and "PRINTALL".' |
349 |
CALL PRINT_MESSAGE(msgBuffer,standardMessageUnit, |
350 |
& SQUEEZE_RIGHT,myThreadId) |
351 |
WRITE(msgBuffer,*) |
352 |
&'*******************************************************' |
353 |
CALL PRINT_MESSAGE(msgBuffer,standardMessageUnit, |
354 |
& SQUEEZE_RIGHT,myThreadId) |
355 |
GOTO 1000 |
356 |
903 CONTINUE |
357 |
WRITE(msgBuffer,*) |
358 |
&' ' |
359 |
CALL PRINT_MESSAGE(msgBuffer,standardMessageUnit, |
360 |
& SQUEEZE_RIGHT,myThreadId) |
361 |
WRITE(msgBuffer,*) |
362 |
&'*** WARNING WARNING WARNING WARNING WARNING WARNING ***' |
363 |
CALL PRINT_MESSAGE(msgBuffer,standardMessageUnit, |
364 |
& SQUEEZE_RIGHT,myThreadId) |
365 |
WRITE(msgBuffer,*) |
366 |
&'procedure: "',callProc,'".' |
367 |
CALL PRINT_MESSAGE(msgBuffer,standardMessageUnit, |
368 |
& SQUEEZE_RIGHT,myThreadId) |
369 |
WRITE(msgBuffer,*) |
370 |
&'Timer action"',name(ISTART:IEND),'" is invalid.' |
371 |
CALL PRINT_MESSAGE(msgBuffer,standardMessageUnit, |
372 |
& SQUEEZE_RIGHT,myThreadId) |
373 |
WRITE(msgBuffer,*) |
374 |
&' Valid actions are:' |
375 |
CALL PRINT_MESSAGE(msgBuffer,standardMessageUnit, |
376 |
& SQUEEZE_RIGHT,myThreadId) |
377 |
WRITE(msgBuffer,*) |
378 |
&' "START", "STOP", "PRINT" and "PRINTALL".' |
379 |
CALL PRINT_MESSAGE(msgBuffer,standardMessageUnit, |
380 |
& SQUEEZE_RIGHT,myThreadId) |
381 |
WRITE(msgBuffer,*) |
382 |
&'*******************************************************' |
383 |
CALL PRINT_MESSAGE(msgBuffer,standardMessageUnit, |
384 |
& SQUEEZE_RIGHT,myThreadId) |
385 |
GOTO 1000 |
386 |
904 CONTINUE |
387 |
WRITE(msgBuffer,*) |
388 |
&' ' |
389 |
CALL PRINT_MESSAGE(msgBuffer,standardMessageUnit, |
390 |
& SQUEEZE_RIGHT,myThreadId) |
391 |
WRITE(msgBuffer,*) |
392 |
&'*** WARNING WARNING WARNING WARNING WARNING WARNING ***' |
393 |
CALL PRINT_MESSAGE(msgBuffer,standardMessageUnit, |
394 |
& SQUEEZE_RIGHT,myThreadId) |
395 |
WRITE(msgBuffer,*) |
396 |
&'procedure: "',callProc,'".' |
397 |
CALL PRINT_MESSAGE(msgBuffer,standardMessageUnit, |
398 |
& SQUEEZE_RIGHT,myThreadId) |
399 |
WRITE(msgBuffer,*) |
400 |
&'Timer "',name(ISTART:IEND),'" cannot be created.' |
401 |
CALL PRINT_MESSAGE(msgBuffer,standardMessageUnit, |
402 |
& SQUEEZE_RIGHT,myThreadId) |
403 |
WRITE(msgBuffer,*) |
404 |
&' Only ',maxTimers,' timers are allowed.' |
405 |
CALL PRINT_MESSAGE(msgBuffer,standardMessageUnit, |
406 |
& SQUEEZE_RIGHT,myThreadId) |
407 |
WRITE(msgBuffer,*) |
408 |
&'*******************************************************' |
409 |
CALL PRINT_MESSAGE(msgBuffer,standardMessageUnit, |
410 |
& SQUEEZE_RIGHT,myThreadId) |
411 |
GOTO 1000 |
412 |
905 CONTINUE |
413 |
WRITE(msgBuffer,*) |
414 |
&' ' |
415 |
CALL PRINT_MESSAGE(msgBuffer,standardMessageUnit, |
416 |
& SQUEEZE_RIGHT,myThreadId) |
417 |
WRITE(msgBuffer,*) |
418 |
&'*** WARNING WARNING WARNING WARNING WARNING WARNING ***' |
419 |
CALL PRINT_MESSAGE(msgBuffer,standardMessageUnit, |
420 |
& SQUEEZE_RIGHT,myThreadId) |
421 |
WRITE(msgBuffer,*) |
422 |
&'procedure: "',callProc,'".' |
423 |
CALL PRINT_MESSAGE(msgBuffer,standardMessageUnit, |
424 |
& SQUEEZE_RIGHT,myThreadId) |
425 |
WRITE(msgBuffer,*) |
426 |
&'Timer name is blank.' |
427 |
CALL PRINT_MESSAGE(msgBuffer,standardMessageUnit, |
428 |
& SQUEEZE_RIGHT,myThreadId) |
429 |
WRITE(msgBuffer,*) |
430 |
&' A name must be used with "START", "STOP" or "PRINT".' |
431 |
CALL PRINT_MESSAGE(msgBuffer,standardMessageUnit, |
432 |
& SQUEEZE_RIGHT,myThreadId) |
433 |
WRITE(msgBuffer,*) |
434 |
&'*******************************************************' |
435 |
CALL PRINT_MESSAGE(msgBuffer,standardMessageUnit, |
436 |
& SQUEEZE_RIGHT,myThreadId) |
437 |
GOTO 1000 |
438 |
END |
439 |
|
440 |
CBOP |
441 |
C !ROUTINE: TIMER_GET_TIME |
442 |
|
443 |
C !INTERFACE: |
444 |
SUBROUTINE TIMER_GET_TIME( |
445 |
O userTime, |
446 |
O systemTime, |
447 |
O wallClockTime ) |
448 |
IMPLICIT NONE |
449 |
|
450 |
C !DESCRIPTION: |
451 |
C *==========================================================* |
452 |
C | SUBROUTINE TIMER_GET_TIME |
453 |
C | o Query system timer routines. |
454 |
C *==========================================================* |
455 |
C | Routine returns total elapsed time for program so far. |
456 |
C | Three times are returned that conventionally are used as |
457 |
C | user time, system time and wall-clock time. Not all these |
458 |
C | numbers are available on all machines. |
459 |
C *==========================================================* |
460 |
|
461 |
C !INPUT/OUTPUT PARAMETERS: |
462 |
C userTime :: User time returned |
463 |
C systemTime :: System time returned |
464 |
C wallClockTime :: Wall clock time returned |
465 |
Real*8 userTime |
466 |
Real*8 systemTime |
467 |
Real*8 wallClockTime |
468 |
|
469 |
C !USES: |
470 |
#ifndef TARGET_T3E |
471 |
# ifndef TARGET_CRAY_VECTOR |
472 |
# ifdef TARGET_PWR3 |
473 |
Real*8 system_time, user_time, timenow |
474 |
# else |
475 |
Real*4 ETIME |
476 |
EXTERNAL ETIME |
477 |
# endif |
478 |
# endif |
479 |
#endif |
480 |
|
481 |
C !LOCAL VARIABLES: |
482 |
C ACTUAL, TARRAY, :: Temps. to hold times |
483 |
C wTime |
484 |
Real*4 ACTUAL, TARRAY(2) |
485 |
Real*8 wtime |
486 |
CEOP |
487 |
|
488 |
C Real*8 MPI_Wtime |
489 |
C EXTERNAL MPI_Wtime |
490 |
|
491 |
#if (defined (TARGET_PWR3)) |
492 |
userTime = user_time() |
493 |
systemTime = system_time() |
494 |
wallClockTime = timenow() |
495 |
#elif (defined (TARGET_T3E) || defined (TARGET_CRAY_VECTOR)) |
496 |
userTime = 0. |
497 |
systemTime = 0. |
498 |
wallClockTime = 0. |
499 |
#else |
500 |
ACTUAL = ETIME(TARRAY) |
501 |
userTime = TARRAY(1) |
502 |
systemTime = TARRAY(2) |
503 |
CALL CLOC(wTime) |
504 |
wallClockTime = wtime |
505 |
#endif |
506 |
|
507 |
#ifdef ALLOW_USE_MPI |
508 |
C wtime = MPI_Wtime() |
509 |
C wallClockTime = wtime |
510 |
#endif /* ALLOW_USE_MPI */ |
511 |
#ifndef ALLOW_USE_MPI |
512 |
C wallClockTime = 0. |
513 |
#endif |
514 |
|
515 |
RETURN |
516 |
END |
517 |
|
518 |
CBOP |
519 |
|
520 |
C !ROUTINE: TIMER_PRINTALL |
521 |
|
522 |
C !INTERFACE: |
523 |
SUBROUTINE TIMER_PRINTALL( myThreadId ) |
524 |
IMPLICIT NONE |
525 |
|
526 |
C !DESCRIPTION: |
527 |
C *==========================================================* |
528 |
C | SUBROUTINE TIMER_PRINTALL |
529 |
C | o Print timer information |
530 |
C *==========================================================* |
531 |
C | Request print out of table of timing from all timers. |
532 |
C *==========================================================* |
533 |
|
534 |
C !INPUT PARAMETERS: |
535 |
C myThreadId :: This threads number |
536 |
INTEGER myThreadId |
537 |
CEOP |
538 |
|
539 |
CALL TIMER_CONTROL( ' ', 'PRINTALL', 'TIMER_PRINTALL' , |
540 |
& myThreadId ) |
541 |
C |
542 |
RETURN |
543 |
END |
544 |
|
545 |
CBOP |
546 |
C !ROUTINE: TIMER_START |
547 |
|
548 |
C !INTERFACE: |
549 |
SUBROUTINE TIMER_START ( string , myThreadId ) |
550 |
IMPLICIT NONE |
551 |
|
552 |
C !DESCRIPTION: |
553 |
C Start timer named "string". |
554 |
|
555 |
C !INPUT PARAMETERS: |
556 |
C string :: Name of timer |
557 |
C myThreadId :: My thread number |
558 |
CHARACTER*(*) string |
559 |
INTEGER myThreadId |
560 |
CEOP |
561 |
C |
562 |
CALL TIMER_CONTROL( string, 'START', 'TIMER_START' , myThreadId) |
563 |
C |
564 |
RETURN |
565 |
END |
566 |
CBOP |
567 |
C !ROUTINE: TIMER_STOP |
568 |
|
569 |
C !INTERFACE: |
570 |
SUBROUTINE TIMER_STOP ( string , myThreadId) |
571 |
IMPLICIT NONE |
572 |
|
573 |
C !DESCRIPTION: |
574 |
C Stop timer named "string". |
575 |
|
576 |
C !INPUT PARAMETERS: |
577 |
C string :: Name of timer |
578 |
C myThreadId :: My thread number |
579 |
CHARACTER*(*) string |
580 |
INTEGER myThreadId |
581 |
CEOP |
582 |
C |
583 |
CALL TIMER_CONTROL( string, 'STOP', 'TIMER_STOP' , myThreadId ) |
584 |
C |
585 |
RETURN |
586 |
END |
587 |
C*********************************************************************** |