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;