1!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! 2! Copyright 2010. Los Alamos National Security, LLC. This material was ! 3! produced under U.S. Government contract DE-AC52-06NA25396 for Los Alamos ! 4! National Laboratory (LANL), which is operated by Los Alamos National ! 5! Security, LLC for the U.S. Department of Energy. The U.S. Government has ! 6! rights to use, reproduce, and distribute this software. NEITHER THE ! 7! GOVERNMENT NOR LOS ALAMOS NATIONAL SECURITY, LLC MAKES ANY WARRANTY, ! 8! EXPRESS OR IMPLIED, OR ASSUMES ANY LIABILITY FOR THE USE OF THIS ! 9! SOFTWARE. If software is modified to produce derivative works, such ! 10! modified software should be clearly marked, so as not to confuse it ! 11! with the version available from LANL. ! 12! ! 13! Additionally, this program is free software; you can redistribute it ! 14! and/or modify it under the terms of the GNU General Public License as ! 15! published by the Free Software Foundation; version 2.0 of the License. ! 16! Accordingly, this program is distributed in the hope that it will be ! 17! useful, but WITHOUT ANY WARRANTY; without even the implied warranty of ! 18! MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General ! 19! Public License for more details. ! 20!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! 21 22MODULE TIMER_MOD 23 24 IMPLICIT NONE 25 SAVE 26 27 INTEGER :: TSTART_CLOCK, TSTOP_CLOCK, TCLOCK_RATE, TCLOCK_MAX 28 INTEGER :: TX, NUM_TIMERS 29 INTEGER :: LATTE_TIMER, DENSE2SPARSE_TIMER, DMBUILD_TIMER, SPARSE2DENSE_TIMER 30 INTEGER :: SP2ALL_TIMER, SP2SPARSE_TIMER 31 INTEGER, ALLOCATABLE :: TSTART(:), TTOTAL(:), TCOUNT(:) 32 REAL, ALLOCATABLE :: TAVG(:), TSUM(:), TPERCENT(:) 33 CHARACTER(LEN=20), ALLOCATABLE :: TNAME(:) 34 35CONTAINS 36 37 ! Initialize timers 38 ! 39 FUNCTION INIT_TIMER() 40 41 INTEGER :: I, INIT_TIMER 42 43 NUM_TIMERS = 6 44 45 IF(.NOT.ALLOCATED(TSTART)) ALLOCATE(TSTART(NUM_TIMERS), TTOTAL(NUM_TIMERS), TCOUNT(NUM_TIMERS)) 46 IF(.NOT.ALLOCATED(TNAME)) ALLOCATE(TNAME(NUM_TIMERS)) 47 IF(.NOT.ALLOCATED(TAVG))THEN 48 ALLOCATE(TAVG(NUM_TIMERS),TSUM(NUM_TIMERS),TPERCENT(NUM_TIMERS)) 49 ENDIF 50 51 ! Timer handles, names, and counters 52 LATTE_TIMER = 1 53 SP2ALL_TIMER = 2 54 SP2SPARSE_TIMER = 3 55 DENSE2SPARSE_TIMER = 4 56 DMBUILD_TIMER = 5 57 SPARSE2DENSE_TIMER = 6 58 59 TNAME(LATTE_TIMER) = "LATTE" 60 TNAME(SP2ALL_TIMER) = "Sp2All" 61 TNAME(SP2SPARSE_TIMER) = " Sp2Sparse" 62 TNAME(DENSE2SPARSE_TIMER) = " Dense2Sparse" 63 TNAME(DMBUILD_TIMER) = " DMBuild" 64 TNAME(SPARSE2DENSE_TIMER) = " Sparse2Dense" 65 66 TTOTAL = 0 67 TCOUNT = 0 68 69 INIT_TIMER = NUM_TIMERS 70 71 END FUNCTION INIT_TIMER 72 73 ! Done with timers 74 ! 75 FUNCTION SHUTDOWN_TIMER() 76 77 INTEGER :: SHUTDOWN_TIMER 78 79 DEALLOCATE(TSTART, TTOTAL, TCOUNT) 80 DEALLOCATE(TNAME) 81 82 SHUTDOWN_TIMER = NUM_TIMERS 83 84 END FUNCTION SHUTDOWN_TIMER 85 86 ! Start Timing 87 ! 88 FUNCTION START_TIMER(ITIMER) 89 90 INTEGER :: ITIMER, START_TIMER 91 92 CALL SYSTEM_CLOCK(TSTART_CLOCK, TCLOCK_RATE, TCLOCK_MAX) 93 TSTART(ITIMER) = TSTART_CLOCK 94 95 START_TIMER = TSTART_CLOCK 96 97 END FUNCTION START_TIMER 98 99 ! Stop timing 100 ! 101 FUNCTION STOP_TIMER(ITIMER) 102 103 INTEGER :: ITIMER, TDELTA, STOP_TIMER 104 105 CALL SYSTEM_CLOCK(TSTOP_CLOCK, TCLOCK_RATE, TCLOCK_MAX) 106 TDELTA = TSTOP_CLOCK - TSTART(ITIMER) 107 TTOTAL(ITIMER) = TTOTAL(ITIMER) + TDELTA 108 TCOUNT(ITIMER) = TCOUNT(ITIMER) + 1 109 110 STOP_TIMER = TSTOP_CLOCK 111 112 END FUNCTION STOP_TIMER 113 114 ! Print performance results 115 ! 116 FUNCTION TIMER_RESULTS() 117 118 INTEGER :: I, TIMER_RESULTS 119 120 PRINT *, "" 121 WRITE(6,*) "Timer # Calls Avg/Call (s) Total (s) % Time" 122 PRINT *, "" 123 124 DO I = 1, NUM_TIMERS 125 126 IF (TCOUNT(I) .GT. 0) THEN 127 128 TAVG(I) = (FLOAT(TTOTAL(I))/FLOAT(TCLOCK_RATE))/FLOAT(TCOUNT(I)) 129 TSUM(I) = FLOAT(TTOTAL(I))/FLOAT(TCLOCK_RATE) 130 TPERCENT(I) = (TSUM(I) / TSUM(1)) * 100.0 131 132 WRITE(6,10) TNAME(I), TCOUNT(I), TAVG(I), TSUM(I), TPERCENT(I) 13310 FORMAT(A25, I4, 3G16.6) 134 ENDIF 135 136 ENDDO 137 138 TIMER_RESULTS = NUM_TIMERS 139 140 END FUNCTION TIMER_RESULTS 141 142 ! Print a tag time and date 143 ! 144 SUBROUTINE TIMEDATE_TAG(TAG) 145 CHARACTER(LEN=*) :: TAG 146 INTEGER :: VALUES(8) 147 148 CALL DATE_AND_TIME(VALUES=VALUES) 149 150 WRITE(*,'(A2,1X,A,1X,I2,A1,I2,2X,A2,1X,I2,A1,I2,A1,I4)') " #",TRIM(TAG),& 151 & VALUES(5),":",VALUES(6),& 152 & "on",VALUES(2),"/",VALUES(3),"/",VALUES(1) 153 154 END SUBROUTINE TIMEDATE_TAG 155 156 ! Get the actual time in mls 157 ! 158 FUNCTION TIME_MLS() 159 REAL(8) :: TIME_MLS 160 INTEGER :: TIMEVECTOR(8) 161 162 TIME_MLS = 0.0d0 163 CALL DATE_AND_TIME(VALUES=TIMEVECTOR) 164 TIME_MLS=TIMEVECTOR(5)*60.0d0*60.0d0*1000.0d0 + TIMEVECTOR(6)*60.0d0*1000.0d0 & 165 & + TIMEVECTOR(7)*1000.0d0 + TIMEVECTOR(8) 166 167 END FUNCTION TIME_MLS 168 169 170END MODULE TIMER_MOD 171