HP Forums

Full Version: Benchmark: Whetstones
You're currently viewing a stripped down version of our content. View the full version with proper formatting.
I have attempted an implementation of the original Whetstone benchmark algorithm in PPL.

This was primarily a learning exercise to remind myself what the benchmark consisted of and to discover whether it was implementable in PPL.

Disclaimer: The implementation is unverified both in accuracy and timings.

If comparing accuracy of results with on-line sources, remember that there are several Whetstone benchmarks, so you might not be making a valid comparison.
Version 0.1 is a simple translation of the Original Algol benchmark.
No attempt has been made to optimise the PPL.
The figures here are not intended to be representative of what the PPL can achieve.

Code:

 LOCAL ID:="Whetstones V0.1 (UNVERIFIED)\nPPL StephenG1CMZ 2017";

 //Requires a procedure to output a list of reals
 //(to list,print or logfile)
 //IMPORT(OUTREAL);//See Benchmarks for example

 EXPORT ABOUT()
 BEGIN
  MSGBOX(ID);
  MSGBOX(" Aims to approximate the workload of Whetstone & verify that the algorithm is implementable in PPL.");
  MSGBOX("Neither accuracy nor timing is approved.");
  MSGBOX("The unoptimised version makes no attempt to improve loops.");
 END;

 //PPL:ALL VARIABLES REAL
 //PPL:INPUTS/OUTPUTS LISTED RATHER THAN 1BY1
 //PPL:OUTPUTS LISTED AND PRINTED
 //ONLY ONE REQUIRED AND SOME DO NEITHER

 LOCAL UnitST:="Mwhetstone";

 // BENCHMARK 
 
 POUT(LST)
 BEGIN
  //IN ORIGINAL EACH NUM WAS OUTREALED
  OUTREAL(LST);
 END;

 //INITIALISE CONSTANTS
 LOCAL TT:=0.499975;
 LOCAL T1:=0.50025;
 LOCAL T2:=2.0;

 //REAL
 LOCAL X1,X2,X3,X4,XX,YY,ZZ;
 //ARRAY
 LOCAL E1:={};//4
 LOCAL EE:={};//UNDEF
 //INTEGER
 LOCAL II,JJ,KK,LL;
 LOCAL NK:={0,12,14,345,0,210,32,899,616,0,93};//11 ITERATION CONSTANTS
 LOCAL NN:={};//11 ITERATION COUNTS

 P0()
 BEGIN
  E1(JJ):=E1(KK);
  E1(KK):=E1(LL);
  E1(LL):=E1(JJ);
 END;//P0

 P3(XX,YY,ZZ)
 //REAL XYZ
 BEGIN
  LOCAL XXX,YYY;//VALUE
  XXX:=TT*(XX+YY);
  YYY:=TT*(XX+YY);
  ZZ:=(XXX+YYY)/T2;
  RETURN ZZ;//UPDATED
 END;

 PA(EEP)
 //EE:ARRAY
 BEGIN
  LOCAL EE:=EEP;//UPDATABLE 
  //INTEGER
  LOCAL JJ:=0;
  //LAB:
  REPEAT
   EE(1):=( EE(1) + EE(2) + EE(3) - EE(4))*TT;
   EE(2):=( EE(1) + EE(2) - EE(3) + EE(4))*TT; 
   EE(3):=( EE(1) - EE(2) + EE(3) + EE(4))*TT;
   EE(4):=(−EE(1) + EE(2) + EE(3) + EE(4))*TT; 
   JJ:=JJ+1;
  UNTIL JJ≥6;//GOTO LAB-PPL HAS NO GOTO
  RETURN EE;//UPDATED  
 END;//PA

 WhetstoneItUnopt(ITER)
 //Unoptimised:No PPL optimisation
 //ITER:ITERATIONS. 10=MEGAWets.
 BEGIN
  //INITIALISE CONSTANTS
  TT:=0.499975;
  T1:=0.50025;
  T2:=2.0;
  NN:=ITER*NK;
  PRINT();//DEBUG
  
  //MODULE 1:SIMPLE IDENTIFIERS
   X1:=1.0;
   //X2:=X3:=X4:=−1.0;
   X4:=−1.0; X3:=X4; X2:=X3;
   //MSGBOX(NN(1));
   FOR II FROM 1 TO NN(1) STEP 1 DO
    X1:=( X1 + X2 + X3 - X4)*TT;
    X2:=( X1 + X2 - X3 + X4)*TT;
    X3:=( X1 - X2 + X3 + X4)*TT;
    X4:=(−X1 + X2 + X3 + X4)*TT;
   END;//FOR
  //END MODULE 1
  POUT({NN(1),NN(1),NN(1),X1,X2,X3,X4});
   
  //MODULE 2:ARRAY ELEMENTS
   E1(1):=1.0;
   //EE(2):=EE(3):=EE(4):=−1.0;
   E1(4):=−1.0; E1(3):=E1(4); E1(2):=E1(3);
   
   FOR II FROM 1 TO NN(2) STEP 1 DO
    E1(1):=( E1(1) + E1(2) + E1(3) - E1(4))*TT;
    E1(2):=( E1(1) + E1(2) - E1(3) + E1(4))*TT;
    E1(3):=( E1(1) - E1(2) + E1(3) + E1(4))*TT;
    E1(4):=(−E1(1) + E1(2) + E1(3) + E1(4))*TT; 
   END;//FOR
  //END MODULE 2
  POUT({NN(2),NN(3),NN(2),E1});
 
  //MODULE 3: ARRAY AS PARAMETER
   FOR II FROM  1 TO NN(3) STEP 1 DO
    E1:=PA(E1);
   END;//FOR
  //END MODULE 3
  POUT({NN(3),NN(2),NN(2),E1});
  
  //MODULE 4: CONDITIONAL JUMPS
   JJ:=1;
   FOR II FROM 1 TO NN(4)  STEP 1 DO
    IF JJ==1 THEN
     JJ:=2;
    ELSE
     JJ:=3;
    END;
    IF JJ>2 THEN
     JJ:=0;
    ELSE
     JJ:=1;
    END;
    IF JJ<1 THEN
     JJ:=1;
    ELSE
     JJ:=0;
    END;
   END;//FOR
  //END MODULE 4
  POUT({NN(4),JJ,JJ,X1,X2,X3,X4});

  //MODULE 5: OMITTED
  //END MODULE 5

  //MODULE 6: INTEGER ARITHMETIC
   JJ:=1;
   KK:=2;
   LL:=3;

   FOR II FROM  1 TO NN(6) STEP 1 DO

    JJ:=JJ*(KK-JJ)*(LL-KK);
    KK:=LL*KK-(LL-JJ)*KK;
    LL:=(LL-KK)*(KK+JJ);
     //SOME VERSIONS USE -2 AND ROUND?
    E1(LL-1):=JJ+KK+LL;
    E1(KK-1):=JJ*KK*LL;
   END;
  //END MODULE 6
  POUT({NN(6),JJ,KK,E1});
  
  //MODULE 7: TRIG FUNCTIONS
   YY:=0.5;
   XX:=0.5;
   FOR II FROM 1 TO NN(7) STEP 1  DO
    XX:=TT*ATAN(T2*SIN(XX)*COS(XX)/(COS(XX+YY)+COS(XX-YY)-1.0));
    YY:=TT*ATAN(T2*SIN(YY)*COS(YY)/(COS(XX+YY)+COS(XX-YY)-1.0));
   END;
  //END MODULE 7
  POUT({JJ,KK,XX,XX,YY,YY});

  //MODULE 8: PROCEDURE CALLS
   //X:=Y:=Z:=1.0;
   ZZ:=1.0;
   YY:=ZZ;
   XX:=YY;
   FOR II FROM 1  TO NN(8)  STEP 1 DO
    ZZ:=P3(XX,YY,ZZ);
   END;
  //END MODULE 8
  POUT({NN(8),JJ,KK,XX,YY,ZZ,ZZ});

  //MODULE 9: ARRAY REFERENCES
   JJ:=1;
   KK:=2;
   LL:=3;
   E1(1):=1.0;
   E1(2):=2.0;
   E1(3):=3.0;
   FOR II FROM 1  TO  NN(9) STEP 1 DO
    P0();
   END; 
  //END MODULE 9
  POUT({NN(9),JJ,KK,E1});

  //MODULE 10: INTEGER ARITHMETIC
   JJ:=2;
   KK:=3;
   FOR II FROM 1  TO NN(10) STEP 1 DO
    JJ:=JJ+KK;
    KK:=JJ+KK;
    JJ:=KK-JJ;
    KK:=KK-JJ-JJ;
   END;

  //END MODULE 10
  POUT({NN(10),JJ,KK,X1,X2,X3,X4});

  //MODULE 11: STANDARD FUNCTIONS
   XX:=0.75;
   FOR II FROM 1 TO NN(11) STEP 1 DO
    //SOME VERSIONS USE ALOG NOT LN
    XX:=√(EXP(LN(XX)/T1));
   END;
  //END MODULE 11 
  POUT({NN(11),JJ,KK,XX,XX,XX,XX});

  //OUTPUT:POUT
  //EITHER JUST PRINT OR RETURN OR SAVE OUTL
  //IF OUTLIST THEN
  // RETURN OUTL;//POUT
  //END;

 END;//BenchWet

 // END BENCHMARK

 EXPORT WhetstoneIt(ITER)
 BEGIN
  RETURN WhetstoneItUnopt(ITER);
 END;

 EXPORT MegaWhetstone()
 BEGIN
  WhetstoneItUnopt(10);
 END;

 EXPORT MegaWhetstones(Mwhetstones)
 BEGIN
  WhetstoneItUnopt(10*Mwhetstones);
 END;

 EXPORT MWhetstone_s ()
 BEGIN
  LOCAL TM:=TEVAL(MegaWhetstone);
   PRINT(ID);
   PRINT(TM+"/"+UnitST);
  
  RETURN TM;
 END;

 EXPORT MWIPS()
 //
 BEGIN
  LOCAL MWIPS;
  LOCAL TM:=MWhetstone_s();

  TM:=TM/1_s;//Remove Units
  //0s=>clock err or more Whetstones needed
  MWIPS:=IFTE(TM,ROUND((1/TM),6),"NaN");//Guard 0 Time
  PRINT(MWIPS+"_"+UnitST+"/s");
  RETURN MWIPS;
 END;

 EXPORT WHETSTONES()
 BEGIN
  ABOUT();
 END;
The Whetstone benchmark relies upon an OUTREAL function.

This was originally provided in my Benchmarks program, but that complicated compilation.

I have now extracted OUTREAL here.
The example code here emphasis flexibility (allowing reals to be printed, listed, or both).
Before publishing timings a much simpler OUTREAL should be substituted
Code:


 //CUSTOMISE
 //SELECT OUTPUT 
 //GLOBAL SP SELECTS/INHIBITS PRINT
 //TO LIST OR TO SCREEN (OR LOGFILE TBD)
 EXPORT BenchmarkList:=1;
 EXPORT BenchmarkAns:={};
 //END CUSTOMISE

 EXPORT OUTREAL(LST)
 //REQUIRED TO OUTPUT OR USE RESULTS
 //HOW IS UNSPECIFIED
 BEGIN 
  //ONLY 1 OUTPUT IS REQUIRED
  //THE SELECTION/ALTERNATIVE IS AN OVERHEAD ANDSHOULDBE REMOVED
  IF SP THEN
   PRINT(LST);
  END;
  IF BenchmarkList THEN
   BenchmarkAns(0):=LST;
  END;
 END;

 BenchmarkReset()
 BEGIN
  PRINT();
  //PRINT(CRID);
  BenchmarkAns:={};
 END;
Reference URL's