xref: /phasta/phSolver/compressible/timer.f (revision 595995161822a203c8467e0e4a253d7bd7d6df32)
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