1*59599516SKenneth E. Jansen subroutine timer (tcode) 2*59599516SKenneth E. Jansenc 3*59599516SKenneth E. Jansenc---------------------------------------------------------------------- 4*59599516SKenneth E. Jansenc 5*59599516SKenneth E. Jansenc This routine keeps track of the CPU-time statistics. 6*59599516SKenneth E. Jansenc 7*59599516SKenneth E. Jansenc input: 8*59599516SKenneth E. Jansenc tcode : timer codes 9*59599516SKenneth E. Jansenc name of processes to be timed 10*59599516SKenneth E. Jansenc including 'Begin ', 'End ','Back ' 11*59599516SKenneth E. Jansenc which are the control input 12*59599516SKenneth E. Jansenc 13*59599516SKenneth E. Jansenc 14*59599516SKenneth E. Jansenc Flop count: 15*59599516SKenneth E. Jansenc 16*59599516SKenneth E. Jansenc x + y : 1 flop -> same as Cray Y-MP 17*59599516SKenneth E. Jansenc x - y : 1 flop -> same as Cray Y-MP 18*59599516SKenneth E. Jansenc x * y : 1 flop -> same as Cray Y-MP 19*59599516SKenneth E. Jansenc x / y : 4 flops -> same as Cray Y-MP 20*59599516SKenneth E. Jansenc sqrt(x) : 8 flops -> lower than Cray Y-MP 21*59599516SKenneth E. Jansenc exp(x) : 24 flops -> same as Cray Y-MP 22*59599516SKenneth E. Jansenc log(x) : 32 flops -> same as Cray Y-MP 23*59599516SKenneth E. Jansenc 24*59599516SKenneth E. Jansenc 25*59599516SKenneth E. Jansenc 26*59599516SKenneth E. Jansenc **** WARNING: this routine makes calls to the SECS function. 27*59599516SKenneth E. Jansenc 28*59599516SKenneth E. Jansenc Farzin Shakib, Summer 1985. 29*59599516SKenneth E. Jansenc Zdenek Johan, Winter 1991. (Fortran 90) 30*59599516SKenneth E. Jansenc---------------------------------------------------------------------- 31*59599516SKenneth E. Jansenc 32*59599516SKenneth E. Jansen include "common.h" 33*59599516SKenneth E. Jansenc 34*59599516SKenneth E. Jansen character*8 tcode 35*59599516SKenneth E. Jansenc 36*59599516SKenneth E. Jansen dimension ratio(11) 37*59599516SKenneth E. Jansenc 38*59599516SKenneth E. Jansenc.... Find the code 39*59599516SKenneth E. Jansenc 40*59599516SKenneth E. Jansen do i = 1, icd + 2 41*59599516SKenneth E. Jansen ii = i 42*59599516SKenneth E. Jansen if (tcode .eq. ccode(i)) exit 43*59599516SKenneth E. Jansen if (ii .eq. icd + 2) call error ('timer ', tcode, 0) 44*59599516SKenneth E. Jansen enddo 45*59599516SKenneth E. Jansenc 46*59599516SKenneth E. Jansenc.... ------------------------> 'Begin ' <------------------------- 47*59599516SKenneth E. Jansenc 48*59599516SKenneth E. Jansenc.... initialize the timers and the flop counter 49*59599516SKenneth E. Jansenc 50*59599516SKenneth E. Jansen if (ii .eq. icd) then 51*59599516SKenneth E. Jansen comtim = zero 52*59599516SKenneth E. Jansen do i = 1, icd 53*59599516SKenneth E. Jansen cpu0(i) = zero 54*59599516SKenneth E. Jansen cpu(i) = zero 55*59599516SKenneth E. Jansen nacess(i) = 0 56*59599516SKenneth E. Jansen enddo 57*59599516SKenneth E. Jansenc 58*59599516SKenneth E. Jansen flops = 0 59*59599516SKenneth E. Jansen gbytes = 0 60*59599516SKenneth E. Jansen sbytes = 0 61*59599516SKenneth E. Jansenc 62*59599516SKenneth E. Jansen cpu0(icd) = secs() 63*59599516SKenneth E. Jansen nacess(icd) = 1 64*59599516SKenneth E. Jansen call system_clock (iclock) 65*59599516SKenneth E. Jansen return 66*59599516SKenneth E. Jansen endif 67*59599516SKenneth E. Jansenc 68*59599516SKenneth E. Jansenc.... ------------------------> 'Back ' <------------------------- 69*59599516SKenneth E. Jansenc 70*59599516SKenneth E. Jansenc.... if Back, stop the clock 71*59599516SKenneth E. Jansenc 72*59599516SKenneth E. Jansen if (ii .eq. icd+2) then 73*59599516SKenneth E. Jansen cpu(icode) = cpu(icode) + secs() - cpu0(icode) 74*59599516SKenneth E. Jansen icode = icode2 75*59599516SKenneth E. Jansen icode2 = icode3 76*59599516SKenneth E. Jansen return 77*59599516SKenneth E. Jansen endif 78*59599516SKenneth E. Jansenc 79*59599516SKenneth E. Jansenc.... -------------------> Individual Processes <-------------------- 80*59599516SKenneth E. Jansenc 81*59599516SKenneth E. Jansenc.... restart the clock 82*59599516SKenneth E. Jansenc 83*59599516SKenneth E. Jansen if (ii .ne. icd+1) then 84*59599516SKenneth E. Jansen icode3 = icode2 85*59599516SKenneth E. Jansen icode2 = icode 86*59599516SKenneth E. Jansen icode = ii 87*59599516SKenneth E. Jansen cpu0(icode) = secs() 88*59599516SKenneth E. Jansen nacess(icode) = nacess(icode) + 1 89*59599516SKenneth E. Jansen return 90*59599516SKenneth E. Jansen endif 91*59599516SKenneth E. Jansenc 92*59599516SKenneth E. Jansenc.... ------------------------> 'End ' <------------------------- 93*59599516SKenneth E. Jansenc 94*59599516SKenneth E. Jansenc.... print out execution time statistics 95*59599516SKenneth E. Jansenc 96*59599516SKenneth E. Jansen if (ccode(icd) .eq. 'Total ') return ! redundant print 97*59599516SKenneth E. Jansenc 98*59599516SKenneth E. Jansen call system_clock (icend, icrate, icmax) 99*59599516SKenneth E. Jansen iclock = icend - iclock 100*59599516SKenneth E. Jansen if (iclock .le. 0) iclock = iclock + icmax 101*59599516SKenneth E. Jansen wclock = float(iclock) / float(icrate) 102*59599516SKenneth E. Jansenc 103*59599516SKenneth E. Jansen cpu(icd) = secs() - cpu0(icd) 104*59599516SKenneth E. Jansen ccode(icd) = 'Total ' 105*59599516SKenneth E. Jansenc 106*59599516SKenneth E. Jansenc.... CPU time returned by secs is in 100th of a second 107*59599516SKenneth E. Jansenc 108*59599516SKenneth E. Jansen do i = 1, icd 109*59599516SKenneth E. Jansen cpu(i) = cpu(i) / 100. 110*59599516SKenneth E. Jansen enddo 111*59599516SKenneth E. Jansenc 112*59599516SKenneth E. Jansenc.... compute the percentage of total time spent 113*59599516SKenneth E. Jansenc 114*59599516SKenneth E. Jansen do i = 1, icd 115*59599516SKenneth E. Jansen ratio(i) = 100.d0 * cpu(i) / cpu(icd) 116*59599516SKenneth E. Jansen enddo 117*59599516SKenneth E. Jansenc 118*59599516SKenneth E. Jansen if (myrank == master) then 119*59599516SKenneth E. Jansen write (iecho,1000) ititle 120*59599516SKenneth E. Jansen write (iecho,1100) 121*59599516SKenneth E. Jansen write (iecho,1200) (ccode(i), nacess(i), cpu(i), ratio(i), 122*59599516SKenneth E. Jansen & i=1,icd-4) 123*59599516SKenneth E. Jansen write (iecho,1100) 124*59599516SKenneth E. Jansen write (iecho,1200) (ccode(i), nacess(i), cpu(i), ratio(i), 125*59599516SKenneth E. Jansen & i=icd-3,icd-1) 126*59599516SKenneth E. Jansen write (iecho,1100) 127*59599516SKenneth E. Jansen write (iecho,1300) (ccode(i), cpu(i), ratio(i), 128*59599516SKenneth E. Jansen & i=icd,icd) 129*59599516SKenneth E. Jansen write (iecho,1400) wclock 130*59599516SKenneth E. Jansen endif 131*59599516SKenneth E. Jansenc 132*59599516SKenneth E. Jansenc.... print out performance statistics 133*59599516SKenneth E. Jansenc 134*59599516SKenneth E. Jansen solvr1 = cpu(3) + cpu(4) + cpu(5) 135*59599516SKenneth E. Jansen solvr2 = cpu(3) + cpu(4) + cpu(5) - cpu(9) - cpu(10) 136*59599516SKenneth E. Jansen gather = cpu(9) 137*59599516SKenneth E. Jansen scattr = cpu(10) 138*59599516SKenneth E. Jansenc 139*59599516SKenneth E. Jansen if ((solvr1 .eq. zero) .or. (gather .eq. 0) .or. 140*59599516SKenneth E. Jansen & (scattr .eq. zero)) return 141*59599516SKenneth E. Jansenc 142*59599516SKenneth E. Jansen if (myrank == master) then 143*59599516SKenneth E. Jansen write (iecho,2000) 144*59599516SKenneth E. Jansen write (iecho,2100) flops 145*59599516SKenneth E. Jansen write (iecho,2200) flops/(1.0d6*solvr1) 146*59599516SKenneth E. Jansen write (iecho,2300) flops/(1.0d6*solvr2) 147*59599516SKenneth E. Jansen write (iecho,2400) 8*gbytes 148*59599516SKenneth E. Jansen write (iecho,2500) 8*sbytes 149*59599516SKenneth E. Jansen write (iecho,2600) 8*gbytes/(float(2**20)*gather) 150*59599516SKenneth E. Jansen write (iecho,2700) 8*sbytes/(float(2**20)*scattr) 151*59599516SKenneth E. Jansen endif 152*59599516SKenneth E. Jansenc 153*59599516SKenneth E. Jansenc.... return 154*59599516SKenneth E. Jansenc 155*59599516SKenneth E. Jansen return 156*59599516SKenneth E. Jansenc 157*59599516SKenneth E. Jansen1000 format(a80,//, 158*59599516SKenneth E. Jansen & ' E x e c u t i o n T i m e S t a t i s t i c s ',//, 159*59599516SKenneth E. Jansen & ' name No. access CPU-time %_total') 160*59599516SKenneth E. Jansen1100 format(1x, 161*59599516SKenneth E. Jansen & '---------------------------------------------------') 162*59599516SKenneth E. Jansen1200 format(1x,a8,4x,i7,5x,f11.2,8x,f7.2) 163*59599516SKenneth E. Jansen1300 format(1x,a8,16x,f11.2,8x,f7.2) 164*59599516SKenneth E. Jansen1400 format(/,' Wall-clock time : ',f8.1,' seconds') 165*59599516SKenneth E. Jansen2000 format(///, 166*59599516SKenneth E. Jansen & ' P e r f o r m a n c e S t a t i s t i c s ',/) 167*59599516SKenneth E. Jansen2100 format(1x,'No. of floating-point operations : ',i20,/) 168*59599516SKenneth E. Jansen2200 format(1x,'Flop rate with gather/scatter : ',f5.1, 169*59599516SKenneth E. Jansen & ' Mflops/s',/) 170*59599516SKenneth E. Jansen2300 format(1x,'Flop rate without gather/scatter :',f5.1, 171*59599516SKenneth E. Jansen & ' Mflops/s',//) 172*59599516SKenneth E. Jansen2400 format(1x,'No. of bytes gathered : ',i20,/) 173*59599516SKenneth E. Jansen2500 format(1x,'No. of bytes scattered : ',i20,/) 174*59599516SKenneth E. Jansen2600 format(1x,'Gather transfer rate : ',f6.2, ' Mbytes/s',/) 175*59599516SKenneth E. Jansen2700 format(1x,'Scatter transfer rate :',f6.2, ' Mbytes/s') 176*59599516SKenneth E. Jansenc 177*59599516SKenneth E. Jansen end 178