home *** CD-ROM | disk | FTP | other *** search
/ Microsoft Programmer's Library 1.3 / Microsoft-Programers-Library-v1.3.iso / sampcode / fortran / swhet.for < prev    next >
Text File  |  1988-08-10  |  12KB  |  378 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. CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC
  132.         REAL      X1,X2,X3,X4,X,Y,Z,T,T1,T2,E1
  133.         INTEGER   J,K,L,I, N1,N2,N3,N4,N5,N6,N7,N8,N9,N10,N11,ISAVE
  134.         COMMON    T,T1,T2,E1(4),J,K,L
  135. C
  136. C
  137.         REAL*8         BEGTIM, ENDTIM, DIFTIM
  138.         REAL*8         DT,  WHETS, WS, ERR, WERR, PERR
  139.         INTEGER*4      IO1, IO1L, KREP, MKREP
  140. C
  141.         REAL*4         SECNDS
  142.         EXTERNAL       SECNDS
  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. C
  161.         T=0.499975E00
  162.         T1=0.50025E00
  163.         T2=2.0E00
  164. C
  165.         ISAVE=I
  166.         N1=0
  167.         N2=12*I
  168.         N3=14*I
  169.         N4=345*I
  170.         N5=0
  171.         N6=210*I
  172.         N7=32*I
  173.         N8=899*I
  174.         N9=616*I
  175.         N10=0
  176.         N11=93*I
  177.         N12=0
  178.         X1=1.0E0
  179.         X2=-1.0E0
  180.         X3=-1.0E0
  181.         X4=-1.0E0
  182.         IF(N1)19,19,11
  183.  11     DO 18 I=1,N1,1
  184.         X1=(X1+X2+X3-X4)*T
  185.         X2=(X1+X2-X3+X4)*T
  186.         X4=(-X1+X2+X3+X4)*T
  187.         X3=(X1-X2+X3+X4)*T
  188.  18     CONTINUE
  189.  19     CONTINUE
  190.         E1(1)=1.0E0
  191.         E1(2)=-1.0E0
  192.         E1(3)=-1.0E0
  193.         E1(4)=-1.0E0
  194.         IF(N2)29,29,21
  195.  21     DO 28 I=1,N2,1
  196.         E1(1)=(E1(1)+E1(2)+E1(3)-E1(4))*T
  197.         E1(2)=(E1(1)+E1(2)-E1(3)+E1(4))*T
  198.         E1(3)=(E1(1)-E1(2)+E1(3)+E1(4))*T
  199.         E1(4)=(-E1(1)+E1(2)+E1(3)+E1(4))*T
  200.  28     CONTINUE
  201.  29     CONTINUE
  202.         IF(N3)39,39,31
  203.  31     DO 38 I=1,N3,1
  204.  38     CALL PA(E1)
  205.  39     CONTINUE
  206.         J=1
  207.         IF(N4)49,49,41
  208.  41     DO 48 I=1,N4,1
  209.         IF(J-1)43,42,43
  210.  42     J=2
  211.         GOTO44
  212.  43     J=3
  213.  44     IF(J-2)46,46,45
  214.  45     J=0
  215.         GOTO47
  216.  46     J=1
  217.  47     IF(J-1)411,412,412
  218.  411    J=1
  219.         GOTO48
  220.  412    J=0
  221.  48     CONTINUE
  222.  49     CONTINUE
  223.         J=1
  224.         K=2
  225.         L=3
  226.         IF(N6)69,69,61
  227.  61     DO 68 I=1,N6,1
  228.         J=J*(K-J)*(L-K)
  229.         K=L*K-(L-J)*K
  230.         L=(L-K)*(K+J)
  231.         E1(L-1)=J+K+L
  232.         E1(K-1)=J*K*L
  233.  68     CONTINUE
  234.  69     CONTINUE
  235.         X=0.5E0
  236.         Y=0.5E0
  237.         IF(N7)79,79,71
  238.  71     DO 78 I=1,N7,1
  239.         X=T*ATAN(T2*SIN(X)*COS(X)/(COS(X+Y)+COS(X-Y)-1.0E0))
  240.         Y=T*ATAN(T2*SIN(Y)*COS(Y)/(COS(X+Y)+COS(X-Y)-1.0E0))
  241.  78     CONTINUE
  242.  79     CONTINUE
  243.         X=1.0E0
  244.         Y=1.0E0
  245.         Z=1.0E0
  246.         IF(N8)89,89,81
  247.  81     DO 88 I=1,N8,1
  248.  88     CALL P3(X,Y,Z)
  249.  89     CONTINUE
  250.         J=1
  251.         K=2
  252.         L=3
  253.         E1(1)=1.0E0
  254.         E1(2)=2.0E0
  255.         E1(3)=3.0E0
  256.         IF(N9)99,99,91
  257.  91     DO 98 I=1,N9,1
  258.  98     CALL P0
  259.  99     CONTINUE
  260.         J=2
  261.         K=3
  262.         IF(N10)109,109,101
  263.  101    DO 108 I=1,N10,1
  264.         J=J+K
  265.         K=J+K
  266.         J=J-K
  267.         K=K-J-J
  268.  108    CONTINUE
  269.  109    CONTINUE
  270.         X=0.75E0
  271.         IF(N11)119,119,111
  272.  111    DO 118 I=1,N11,1
  273.  118    X=SQRT(EXP(ALOG(X)/T1))
  274.  119    CONTINUE
  275.         I = ISAVE 
  276. C
  277. C       ... the whetstone ends here
  278. C
  279. C         ... loop counter instead of do loop ...
  280.           IO1L = IO1L + 1
  281.           IF( IO1L .LT. IO1) GOTO 7010
  282. C       ******* END of TIME INTERVALED ***********
  283. C
  284.         ENDTIM = DBLE(SECNDS(0.0E+00))
  285.         DIFTIM = ENDTIM - BEGTIM
  286. C       whets  = 1000/(TIME FOR 10 inner ITERATIONS OF PROGRAM LOOP)
  287. C       or 100 for every 1 inner count
  288.         WHETS = (100.0D+00* DBLE( FLOAT(IO1*I  ))/DIFTIM)
  289.         WRITE(*,*) ' START TIME = ',BEGTIM
  290.         WRITE(*,*) ' END   TIME = ',ENDTIM
  291.         WRITE(*,*) ' DIF   TIME = ',DIFTIM
  292. C
  293.         WRITE (*,201) WHETS
  294.   201   FORMAT(' SPEED IS: ',1PE10.3,' THOUSAND WHETSTONE',
  295.      2     ' SINGLE PRECISION INSTRUCTIONS PER SECOND')
  296.         CALL POUT(N1,N1,N1,X1,X2,X3,X4)
  297.         CALL POUT(N2,N3,N2,E1(1),E1(2),E1(3),E1(4))
  298.         CALL POUT(N3,N2,N2,E1(1),E1(2),E1(3),E1(4))
  299.         CALL POUT(N4,J,J,X1,X2,X3,X4)
  300.         CALL POUT(N6,J,K,E1(1),E1(2),E1(3),E1(4))
  301.         CALL POUT(N7,J,K,X,X,Y,Y)
  302.         CALL POUT(N8,J,K,X,Y,Z,Z)
  303.         CALL POUT(N9,J,K,E1(1),E1(2),E1(3),E1(4))
  304.         CALL POUT(N10,J,K,X1,X2,X3,X4)
  305.         CALL POUT(N11,J,K,X,X,X,X)
  306. C
  307. C
  308. C       ... repeat but double (MULTIPLY UP) inner count ...
  309.         KREP = KREP + 1
  310.         IF( KREP .LT. MKREP) THEN
  311.             DT     = DIFTIM
  312.             WT     = WHETS
  313.             I=I*MKREP
  314.             GOTO 7020
  315.         ENDIF
  316. C
  317. C       ... compute sensitivity  
  318. C
  319.         ERR =  DIFTIM - (DT*DBLE(FLOAT(MKREP)))    
  320.         WERR=  WT-WHETS          
  321.         PERR=  WERR*100.0D+00/WHETS
  322.         WRITE(*,*) ' Time ERR = ',ERR, ' seconds '
  323.         WRITE(*,*) ' Whet ERR = ',WERR,' kwhets/sec '
  324.         WRITE(*,*) ' %    ERR = ',PERR,' % whet error '
  325.         IF( DIFTIM .LT. 10.0D+00) THEN
  326.          WRITE(*,*)
  327.      1   ' TIME is less than 10 seconds, suggest larger inner loop '
  328.         ENDIF
  329. C
  330.         STOP
  331.         END
  332. C
  333.         SUBROUTINE PA(E)
  334. CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC
  335. C
  336.         COMMON T,T1,T2
  337.         DIMENSION E(4)
  338.         J=0
  339.  1      E(1)=(E(1)+E(2)+E(3)-E(4))*T
  340.         E(2)=(E(1)+E(2)-E(3)+E(4))*T
  341.         E(3)=(E(1)-E(2)+E(3)+E(4))*T
  342.         E(4)=(-E(1)+E(2)+E(3)+E(4))/T2
  343.         J=J+1
  344.         IF(J-6)1,2,2
  345.  2      CONTINUE
  346.         RETURN
  347.         END
  348.         SUBROUTINE P0
  349. CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC
  350. C
  351.         COMMON T,T1,T2,E1(4),J,K,L
  352.         E1(J)=E1(K)
  353.         E1(K)=E1(L)
  354.         E1(L)=E1(J)
  355.         RETURN
  356.         END
  357.         SUBROUTINE P3(X,Y,Z)
  358. CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC
  359. C
  360.         COMMON T,T1,T2
  361.         X1=X
  362.         Y1=Y
  363.         X1=T*(X1+Y1)
  364.         Y1=T*(X1+Y1)
  365.         Z=(X1+Y1)/T2
  366.         RETURN
  367.         END
  368.         SUBROUTINE POUT(N,J,K,X1,X2,X3,X4)
  369. CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC
  370. C
  371.         WRITE(*,1)N,J,K,X1,X2,X3,X4
  372.  1      FORMAT(1H,3(I7,1X),4(1PE12.4,1X))
  373.         RETURN
  374.         END
  375.