home *** CD-ROM | disk | FTP | other *** search
/ Microsoft Programmer's Library 1.3 / Microsoft-Programers-Library-v1.3.iso / sampcode / fortran / dwhet.for < prev    next >
Encoding:
Text File  |  1988-08-11  |  12.2 KB  |  375 lines

  1. CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC
  2. C
  3. C       "WHETSTONE INSTRUCTIONS PER SECONDS" MEASURE OF FORTRAN
  4. C       AND CPU PERFORMANCE.
  5. C
  6. C         References on Whetstones:    Computer Journal Feb 76
  7. C                                      pg 43-49 vol 19 no 1.
  8. C                                      Curnow and Wichman.
  9. C
  10. C                                      and Timing Studies using a
  11. C                                      synthetic Whetstone Benchmark
  12. C                                      S. Harbaugh & J. Forakris
  13. C
  14. C         References on FORTRAN Benchmarks:
  15. C
  16. C                                   -  Computer Languages, Jan 1986
  17. C                                   -  EDN, Oct 3, 1985, Array Processors
  18. C                                           for PCs
  19. C                                   -  Byte, Feb 1984.
  20. C                                                         
  21. C       03/03/87
  22. C          Seeing that Microsoft distributed this without
  23. C          shipping the commented version, the timing loop 
  24. C          was reworked to eliminate all do loops and to put
  25. C          in code to print the variation in the measurment to
  26. C          make it more cook-book.  The 3 loop method described
  27. C          below was eliminated because it caused confusion.
  28. C          The printout was grouped and placed at the end of the test
  29. C          so that the outputs could be checked.  
  30. C          although it is ugly code, it checks with the Ada version
  31. C          and original article.          
  32. C          Because the Whetstones are printed as a reciprical,
  33. C          you can not average Whetstones to reduce time errors,
  34. C          you must run it multiple times and accumulate time.
  35. C          (AKT)
  36. C          
  37. C
  38. C       01/01/87
  39. C          fixed second subroutine to return seconds, not centi
  40. C          seconds and used double precision variables. (AKT)
  41. C   
  42. C       12/15/86
  43. C          Modified by Microsoft, removed reading in loop 
  44. C          option, added timer routine, removed meta-commands
  45. C          on large model.  Changed default looping from 100 to 10.
  46. C
  47. C       9/24/84
  48. C          ADDED CODE TO THESE SO THAT IT HAS VARIABLE LOOPING
  49. C
  50. C          from DEC but DONE BY OUTSIDE CONTRACTOR, OLD STYLE CODING
  51. C          not representative of DEC coding 
  52. C   
  53. C          A. TETEWSKY, c/o 
  54. C          555 TECH SQ MS 92 
  55. C          CAMBRIDGE MASS 02139           617/258-1287
  56. C          benchmarking notes:   1)    insure that timer has
  57. C                                      sufficient resolution and
  58. C                                      uses elapsed CPU time
  59. C
  60. C                                2)    to be useful for mainframe
  61. C                                      comparisons, measure
  62. C                                      INTEGER*4 time and large
  63. C                                      memory model or quote
  64. C                                      both large and small model
  65. C                                      times.  It may be necessary
  66. C                                      to make the arrays in this
  67. C                                      program large enough to span
  68. C                                      a 64K byte boundary because
  69. C                                      many micro compilers will
  70. C                                      generate small model code
  71. C                                      for small arrays even with 
  72. C                                      large models.
  73. C
  74. C                                 3)   Make sure that it loops
  75. C                                      long enough to gain
  76. C                                      stability, i.e. third-second
  77. C                                      loop = first loop time.
  78. C
  79. C         research notes,
  80. C         structure and definition:
  81. C         I received this code as a black box and based on some
  82. C         study, discovered the following background.
  83. C
  84. C            n1-n10 are loop counters for 10 tests, and tests
  85. C            n1,n5, and n10 are skipped.
  86. C            computed goto's are used to skip over tests that
  87. C            are not wanted.
  88. C     
  89. C
  90. C            n1-n10 scale with I.   When I is set to 10,
  91. C            kilo whets per second = 1000/ (time for doing n1-n10),
  92. C            the definition found in the literature.
  93. C
  94. C            If I were 100, the scale factor would be 10,000.
  95. C            which explains the 10,000 discovered in this code because
  96. C            it was shipped with IMUCH wired to 100.
  97. C
  98. C            the original DEC version uses a do-loop, 
  99. C                  imuch=100
  100. C                  do 200 loop=1,3
  101. C                       i = loop*imuch
  102. C                       n1-n10 scales by I
  103. C                       ... whetstones here ...
  104. C              200 continue
  105. C            and it took me a while to figure out why it worked.
  106. C
  107. C            This code loops three times 
  108. C                 TIMES(1) is time for 1*I  whets
  109. C                 TIMES(2) is time for 2*I
  110. C                 TIMES(3) is time for 3*I
  111. C            and TIMES(3)-TIMES(2) =  time for 1*I. 
  112. C            As long as TIMES(3)-TIMES(2) =  TIMES(1) to
  113. C            4 digits, then the cycle counter is sufficiently
  114. C            large enough for a given clock resolution.
  115. C
  116. C            By scaling whets * (IMUCH/10), you can alter IMUCH.
  117. C            The default definition is IMUCH = 10, hence the factor
  118. C            is unity.  IMUCH should be a factor of 10.
  119. C
  120. C
  121. C            Problems I have found:
  122. C            -  the SECONDS function is a single precision number
  123. C               and as CPUs get faster, you need to loop longer
  124. C               so that significant digits are not dropped.
  125. C
  126. C
  127. C       WHETS.FOR       09/27/77     TDR
  128. C       ...WHICH IS AN IMPROVED VERSION OF:
  129. C       WHET2A.FTN      01/22/75     RBG
  130. C
  131.         DOUBLE PRECISION X1,X2,X3,X4,X,Y,Z,T,T1,T2,E1
  132.         INTEGER   J,K,L,I, N1,N2,N3,N4,N5,N6,N7,N8,N9,N10,N11,ISAVE
  133.         COMMON    T,T1,T2,E1(4),J,K,L
  134. C
  135. C
  136.         REAL*8         BEGTIM, ENDTIM, DIFTIM
  137.         REAL*8         DT,  WHETS, WS, ERR, WERR, PERR
  138.         INTEGER*4      IO1, IO1L, KREP, MKREP
  139. C
  140.         REAL*4         SECNDS
  141.         EXTERNAL       SECNDS
  142.         
  143. C
  144. C****************************************************************
  145. C                         
  146. C
  147.         MKREP  =    2
  148.         KREP   =    0
  149.         WRITE(*,*) ' Suggest inner > 10, outer > 1 '
  150.         WRITE(*,*) ' ENTER the number of inner/outer loops  ' 
  151.         READ(*,*)  I  ,IO1 
  152.  7020   CONTINUE
  153.         WRITE(*,*) ' Starting ',IO1,' loops, inner loop = ',I  
  154. C       ***** BEGININNING OF TIMED INTERVAL *****
  155.         IO1L   = 0
  156.         BEGTIM = DBLE(SECNDS(0.0E+00) )
  157.  7010   CONTINUE
  158. C
  159. C       ... the Whetstone code here ...
  160.         ISAVE=I   
  161.         T=0.499975D00
  162.         T1=0.50025D00
  163.         T2=2.0D00
  164.         N1=0
  165.         N2=12*I
  166.         N3=14*I
  167.         N4=345*I
  168.         N5=0
  169.         N6=210*I
  170.         N7=32*I
  171.         N8=899*I
  172.         N9=616*I
  173.         N10=0
  174.         N11=93*I
  175.         N12=0
  176.         X1=1.0D0
  177.         X2=-1.0D0
  178.         X3=-1.0D0                                     
  179.         X4=-1.0D0
  180.         IF(N1)19,19,11
  181.  11     DO 18 I=1,N1,1            
  182.         X1=(X1+X2+X3-X4)*T
  183.         X2=(X1+X2-X3+X4)*T
  184.         X4=(-X1+X2+X3+X4)*T
  185.         X3=(X1-X2+X3+X4)*T
  186.  18     CONTINUE
  187.  19     CONTINUE
  188.         E1(1)=1.0D0
  189.         E1(2)=-1.0D0
  190.         E1(3)=-1.0D0
  191.         E1(4)=-1.0D0
  192.         IF(N2)29,29,21
  193.  21     DO 28 I=1,N2,1
  194.         E1(1)=(E1(1)+E1(2)+E1(3)-E1(4))*T
  195.         E1(2)=(E1(1)+E1(2)-E1(3)+E1(4))*T
  196.         E1(3)=(E1(1)-E1(2)+E1(3)+E1(4))*T
  197.         E1(4)=(-E1(1)+E1(2)+E1(3)+E1(4))*T
  198.  28     CONTINUE
  199.  29     CONTINUE
  200.         IF(N3)39,39,31
  201.  31     DO 38 I=1,N3,1
  202.  38     CALL PA(E1)
  203.  39     CONTINUE
  204.         J=1
  205.         IF(N4)49,49,41
  206.  41     DO 48 I=1,N4,1
  207.         IF(J-1)43,42,43
  208.  42     J=2
  209.         GOTO44
  210.  43     J=3
  211.  44     IF(J-2)46,46,45
  212.  45     J=0
  213.         GOTO47
  214.  46     J=1
  215.  47     IF(J-1)411,412,412
  216.  411    J=1
  217.         GOTO48
  218.  412    J=0
  219.  48     CONTINUE
  220.  49     CONTINUE
  221.         J=1
  222.         K=2
  223.         L=3
  224.         IF(N6)69,69,61
  225.  61     DO 68 I=1,N6,1
  226.         J=J*(K-J)*(L-K)
  227.         K=L*K-(L-J)*K
  228.         L=(L-K)*(K+J)
  229.         E1(L-1)=J+K+L
  230.         E1(K-1)=J*K*L
  231.  68     CONTINUE
  232.  69     CONTINUE
  233.         X=0.5D0
  234.         Y=0.5D0
  235.         IF(N7)79,79,71
  236.  71     DO 78 I=1,N7,1
  237.         X=T*DATAN(T2*DSIN(X)*DCOS(X)/(DCOS(X+Y)+DCOS(X-Y)-1.0D0))
  238.         Y=T*DATAN(T2*DSIN(Y)*DCOS(Y)/(DCOS(X+Y)+DCOS(X-Y)-1.0D0))
  239.  78     CONTINUE
  240.  79     CONTINUE
  241.         X=1.0D0
  242.         Y=1.0D0
  243.         Z=1.0D0
  244.         IF(N8)89,89,81
  245.  81     DO 88 I=1,N8,1
  246.  88     CALL P3(X,Y,Z)
  247.  89     CONTINUE
  248.         J=1
  249.         K=2
  250.         L=3
  251.         E1(1)=1.0D0
  252.         E1(2)=2.0D0
  253.         E1(3)=3.0D0
  254.         IF(N9)99,99,91
  255.  91     DO 98 I=1,N9,1
  256.  98     CALL P0
  257.  99     CONTINUE
  258.         J=2
  259.         K=3
  260.         IF(N10)109,109,101
  261.  101    DO 108 I=1,N10,1
  262.         J=J+K
  263.         K=J+K
  264.         J=J-K
  265.         K=K-J-J
  266.  108    CONTINUE
  267.  109    CONTINUE
  268.         X=0.75D0
  269.         IF(N11)119,119,111
  270.  111    DO 118 I=1,N11,1
  271.  118    X=DSQRT(DEXP(DLOG(X)/T1))
  272.  119    CONTINUE
  273.         I = ISAVE
  274. C       ... the whetstone ends here
  275. C
  276. C         ... loop counter instead of do loop ...
  277.           IO1L = IO1L + 1
  278.           IF( IO1L .LT. IO1) GOTO 7010
  279. C       ******* END of TIME INTERVALED ***********
  280. C
  281.         ENDTIM = DBLE(SECNDS(0.0E+00))
  282.         DIFTIM = ENDTIM - BEGTIM
  283. C       whets  = 1000/(TIME FOR 10 inner ITERATIONS OF PROGRAM LOOP)
  284. C       or 100 for every 1 inner count
  285.         WHETS = (100.0D+00* DBLE( FLOAT(IO1*I  ))/DIFTIM)
  286.         WRITE(*,*) ' START TIME = ',BEGTIM
  287.         WRITE(*,*) ' END   TIME = ',ENDTIM
  288.         WRITE(*,*) ' DIF   TIME = ',DIFTIM
  289. C
  290.         WRITE (*,201) WHETS
  291.   201   FORMAT(' SPEED IS: ',1PE10.3,' THOUSAND WHETSTONE',
  292.      2     ' DOUBLE PRECISION INSTRUCTIONS PER SECOND')
  293.         CALL POUT(N1,N1,N1,X1,X2,X3,X4)
  294.         CALL POUT(N2,N3,N2,E1(1),E1(2),E1(3),E1(4))
  295.         CALL POUT(N3,N2,N2,E1(1),E1(2),E1(3),E1(4))
  296.         CALL POUT(N4,J,J,X1,X2,X3,X4)
  297.         CALL POUT(N6,J,K,E1(1),E1(2),E1(3),E1(4))
  298.         CALL POUT(N7,J,K,X,X,Y,Y)
  299.         CALL POUT(N8,J,K,X,Y,Z,Z)
  300.         CALL POUT(N9,J,K,E1(1),E1(2),E1(3),E1(4))
  301.         CALL POUT(N10,J,K,X1,X2,X3,X4)
  302.         CALL POUT(N11,J,K,X,X,X,X)
  303. C
  304. C       ... repeat but double (MULTIPLY UP) inner count ...
  305.         KREP = KREP + 1
  306.         IF( KREP .LT. MKREP) THEN
  307.             DT     = DIFTIM
  308.             WT     = WHETS
  309.             I=I*MKREP
  310.             GOTO 7020
  311.         ENDIF
  312. C
  313. C       ... compute sensitivity  
  314. C
  315.         ERR =  DIFTIM - (DT*DBLE(FLOAT(MKREP)))    
  316.         WERR=  WT-WHETS          
  317.         PERR=  WERR*100.0D+00/WHETS
  318.         WRITE(*,*) ' Time ERR = ',ERR, ' seconds '
  319.         WRITE(*,*) ' Whet ERR = ',WERR,' kwhets/sec '
  320.         WRITE(*,*) ' %    ERR = ',PERR,' % whet error '
  321.         IF( DIFTIM .LT. 10.0D+00) THEN
  322.          WRITE(*,*)
  323.      1   ' TIME is less than 10 seconds, suggest larger inner loop '
  324.         ENDIF
  325. C
  326.         STOP
  327.         END
  328.         SUBROUTINE PA(E)
  329. CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC
  330.         DOUBLE PRECISION T,T1,T2,E
  331.         COMMON T,T1,T2
  332.         DIMENSION E(4)
  333.         J=0
  334.  1      E(1)=(E(1)+E(2)+E(3)-E(4))*T
  335.         E(2)=(E(1)+E(2)-E(3)+E(4))*T
  336.         E(3)=(E(1)-E(2)+E(3)+E(4))*T
  337.         E(4)=(-E(1)+E(2)+E(3)+E(4))/T2
  338.         J=J+1
  339.         IF(J-6)1,2,2
  340.  2      CONTINUE
  341.         RETURN
  342.         END
  343.         SUBROUTINE P0
  344. CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC
  345.         DOUBLE PRECISION T,T1,T2,E1
  346.         COMMON T,T1,T2,E1(4),J,K,L
  347.         E1(J)=E1(K)
  348.         E1(K)=E1(L)
  349.         E1(L)=E1(J)
  350.         RETURN
  351.         END
  352.         SUBROUTINE P3(X,Y,Z)
  353. CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC
  354.         DOUBLE PRECISION T,T1,T2,X1,Y1,X,Y,Z
  355.         COMMON T,T1,T2
  356.         X1=X
  357.         Y1=Y
  358.         X1=T*(X1+Y1)
  359.         Y1=T*(X1+Y1)
  360.         Z=(X1+Y1)/T2
  361.         RETURN
  362.         END
  363.         SUBROUTINE POUT(N,J,K,X1,X2,X3,X4)
  364. CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC
  365. C
  366. C
  367.         DOUBLE PRECISION X1,X2,X3,X4
  368.         WRITE(*,1)N,J,K,X1,X2,X3,X4
  369.  1      FORMAT('  ',3(I7,1X),4(1PD12.4,1X))
  370.         RETURN
  371.         END
  372.