home *** CD-ROM | disk | FTP | other *** search
/ Programmer 7500 / MAX_PROGRAMMERS.iso / PASCAL / CLOCKSTP.ZIP / FLOPS.PAS < prev    next >
Encoding:
Pascal/Delphi Source File  |  1989-07-23  |  3.6 KB  |  117 lines

  1. PROGRAM Flops;
  2.  
  3.  {This program uses the Clocks UNIT to determine the number of
  4.   floating-point operations per second (FLOPS) by arithmetic type
  5.   with REAL "matrices" having a size greater than 65535 bytes.
  6.  
  7.   Earl F. Glynn, Overland Park, KS.  July 1989.}
  8.  
  9.   USES Clocks;  {Clock, hhmmss}
  10.  
  11.   CONST
  12.     iMax     = 250;   {Treat x,y,z (below) as ARRAY[1..iMax,1..jMax] ...}
  13.     jMax     = 100;   {6 bytes/REAL * 250 * 100 = 150000 bytes/matrix   }
  14.     MaxTimes =   4;
  15.  
  16.   TYPE                 {REAL is 6-byte floating point}
  17.     RealType  = REAL;  {or try SINGLE, DOUBLE, EXTENDED}
  18.     RealArray = ARRAY[1..jMax] OF RealType;
  19.  
  20.   VAR
  21.     clk1,clk2,clk3:  Clock;
  22.     i,j           :  WORD;
  23.     looptime      :  RealType;
  24.     nflops        :  LONGINT;
  25.     overhead      :  RealType;
  26.     sec           :  ARRAY[1..4] OF RealType;
  27.     setup         :  REAL;
  28.     times         :  WORD;
  29.     value         :  RealType;
  30.     x,y,z         :  ARRAY[1..iMax] OF ^RealArray;
  31.                      {Treat x[i]^[j] as matrix}
  32.  
  33. BEGIN
  34.   Clk1.Start (CMOSClock);
  35.  
  36.   RandSeed := 17;
  37.   FOR i := 1 TO iMax DO BEGIN
  38.     NEW (x[i]);
  39.     NEW (y[i]);
  40.     NEW (z[i]);
  41.     FOR j := 1 TO jMax DO BEGIN
  42.       x[i]^[j] := Random;
  43.       y[i]^[j] := i+j
  44.     END
  45.   END;
  46.   value := -987.654;
  47.  
  48.   Clk2.Start (DOSClock);                     {Measure clock overhead}
  49.   FOR times := 1 TO MaxTimes DO
  50.     FOR i := 1 TO iMax DO BEGIN
  51.       FOR j := 1 TO jMax DO BEGIN
  52.       END
  53.     END;
  54.   looptime := Clk2.Elapsed;
  55.  
  56.   Clk2.Start (DOSClock);
  57.   FOR times := 1 TO MaxTimes DO
  58.     FOR i := 1 TO iMax DO BEGIN
  59.       FOR j := 1 TO jMax DO BEGIN
  60.         Clk3.Start (DOSClock);
  61.         overhead := Clk3.Elapsed
  62.       END
  63.     END;
  64.   overhead := Clk2.Elapsed;
  65.   overhead := (overhead-looptime) / LONGINT(MaxTimes*iMax*jMax);
  66.   setup := Clk1.Elapsed;
  67.  
  68.   Clk2.Start (DOSClock);                     {Addition}
  69.   FOR times := 1 TO MaxTimes DO
  70.     FOR i := 1 TO iMax DO
  71.       FOR j := 1 TO jMax DO
  72.         z[i]^[j] := x[i]^[j] + y[i]^[j] + value + 12345.67;
  73.   sec[1] := Clk2.Elapsed;
  74.  
  75.   Clk2.Start (DOSClock);                     {Subtraction}
  76.   FOR times := 1 TO MaxTimes DO
  77.     FOR i := 1 TO iMax DO
  78.       FOR j := 1 TO jMax DO
  79.         z[i]^[j] := x[i]^[j] - y[i]^[j] - value - 12345.67;
  80.   sec[2] := Clk2.Elapsed;
  81.  
  82.   Clk2.Start (DOSClock);                     {Multiplication}
  83.   FOR times := 1 TO MaxTimes DO
  84.     FOR i := 1 TO iMax DO
  85.       FOR j := 1 TO jMax DO
  86.         z[i]^[j] := x[i]^[j] * y[i]^[j] * value * 12345.67;
  87.   sec[3] := Clk2.Elapsed;
  88.  
  89.   Clk2.Start (DOSClock);                     {Division}
  90.   FOR times := 1 TO MaxTimes DO
  91.     FOR i := 1 TO iMax DO
  92.       FOR j := 1 TO jMax DO
  93.         z[i]^[j] := x[i]^[j] / y[i]^[j] / value / 12345.67;
  94.   sec[4] := Clk2.Elapsed;
  95.  
  96.   FOR i := 1 TO iMax DO BEGIN
  97.     DISPOSE (z[i]);                    {Deallocate variables}
  98.     DISPOSE (y[i]);
  99.     DISPOSE (x[i]);
  100.   END;
  101.   nflops := LONGINT(MaxTimes*3*iMax*jMax);
  102.   WRITELN ('Floating-Point Operations Per Second (Flops)');
  103.   WRITELN;
  104.   WRITELN ('  T y p e        Seconds    Flops  ');
  105.   WRITELN ('--------------   -------   --------');
  106.   WRITELN ('Addition         ',sec[1]:7:2,nflops/sec[1]:10:0);
  107.   WRITELN ('Subtraction      ',sec[2]:7:2,nflops/sec[2]:10:0);
  108.   WRITELN ('Multiplication   ',sec[3]:7:2,nflops/sec[3]:10:0);
  109.   WRITELN ('Division         ',sec[4]:7:2,nflops/sec[4]:10:0);
  110.   WRITELN;
  111.   WRITELN ('Based on ',nflops,' floating-point operations per type.');
  112.   WRITELN;
  113.   WRITELN ('Clock overhead:',overhead:7:4,' second');
  114.   WRITELN ('Setup Time:     ',hhmmss(setup));
  115.   WRITELN ('Elapsed Time:   ',hhmmss(Clk1.Elapsed))
  116. END {Flops}.
  117.