whet.pas 8.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287
  1. program Whet;
  2. {$IFDEF VirtualPascal}
  3. {$AlignCode+,AlignData+,AlignRec+,Asm-,B-,Cdecl-,D-,Delphi-,Frame+,G4+,I-}
  4. {$Optimise+,OrgName-,P-,Q-,R-,SmartLink+,Speed+,T-,V-,W-,X+,Z-,ZD-}
  5. uses
  6. Dos, Os2Def, Os2Base;
  7. {$ENDIF}
  8. {$IFDEF Speed}
  9. {$B-,D-,I-,L-,O-,Q-,R-,S-,V-,Z-}
  10. uses
  11. Dos, BseDos;
  12. {$ENDIF}
  13. {$IFDEF Speed_Pascal_20}
  14. {$B-,D-,I-,L-,O-,Q-,R-,S-,V-,Z-}
  15. uses
  16. Dos,BseDos,OS2Def;
  17. {$ENDIF}
  18. {$IFDEF VER70}
  19. {$A+,B-,D-,E-,F-,G+,I-,L-,N+,O-,P-,Q-,R-,S-,T-,V-,X-,Y-}
  20. {$M 16384,0,655360}
  21. uses
  22. OpTimer, Dos;
  23. {$ENDIF}
  24. {$IFDEF Delphi}
  25. uses
  26. Dmisc;
  27. {$ENDIF Delphi}
  28. {$IFDEF FPC}
  29. {$ifdef go32v2}
  30. uses
  31. dpmiexcp,Dos;
  32. {$endif go32v2}
  33. {$ifdef win32}
  34. uses
  35. Dos;
  36. {$endif win32}
  37. {$ENDIF FPC}
  38. (**********************************************************************
  39. C Benchmark Double Precision Whetstone (A001)
  40. C
  41. C o This is a LONGREAL*8 version of
  42. C the Whetstone benchmark program.
  43. C o FOR-loop semantics are ANSI-66 compatible.
  44. C o Final measurements are to be made with all
  45. C WRITE statements and FORMAT sttements removed.
  46. C
  47. C**********************************************************************)
  48. {$IFDEF OS2}
  49. function TimeNow : LongInt;
  50. var
  51. Clocks : LongInt;
  52. rc : ApiRet;
  53. begin
  54. rc := DosQuerySysInfo(qsv_Ms_Count, qsv_Ms_Count, Clocks, SizeOf(Clocks));
  55. TimeNow := Clocks;
  56. end;
  57. {$ELSE}
  58. function TimeNow : Double;
  59. var
  60. h,m,s,s100 : word;
  61. begin
  62. gettime(h,m,s,s100);
  63. TimeNow := h*3600+m*60+s+s100*0.01;
  64. end;
  65. {$ENDIF}
  66. TYPE ARRAY4 = ARRAY [1..4] OF DOUBLE;
  67. VAR E1 : ARRAY4;
  68. T, T1, T2 : DOUBLE;
  69. J, K, L : LONGINT;
  70. ptime, time0, time1 : DOUBLE;
  71. PROCEDURE PA (VAR E : ARRAY4);
  72. VAR J1 : LONGINT;
  73. BEGIN
  74. J1 := 0;
  75. REPEAT
  76. E [1] := ( E [1] + E [2] + E [3] - E [4]) * T;
  77. E [2] := ( E [1] + E [2] - E [3] + E [4]) * T;
  78. E [3] := ( E [1] - E [2] + E [3] + E [4]) * T;
  79. E [4] := (-E [1] + E [2] + E [3] + E [4]) / T2;
  80. J1 := J1 + 1;
  81. UNTIL J1 >= 6;
  82. END;
  83. PROCEDURE P0;
  84. BEGIN
  85. E1 [J] := E1 [K]; E1 [K] := E1 [L]; E1 [L] := E1 [J];
  86. END;
  87. PROCEDURE P3 (X,Y : DOUBLE; VAR Z : DOUBLE);
  88. VAR X1, Y1 : DOUBLE;
  89. BEGIN
  90. X1 := X;
  91. Y1 := Y;
  92. X1 := T * (X1 + Y1);
  93. Y1 := T * (X1 + Y1);
  94. Z := (X1 + Y1)/T2;
  95. END;
  96. PROCEDURE POUT (N, J, K : LONGINT; X1, X2, X3, X4 : DOUBLE);
  97. VAR time1 : double;
  98. BEGIN
  99. {
  100. time1 := TimeNow;
  101. WriteLn(time1-time0:6:1,time1-ptime:6,N:6,J:6,K:6,' ',
  102. X1:10,' ', X2:10,' ',X3:10,' ',X4:10);
  103. ptime := time1;
  104. }
  105. END;
  106. PROCEDURE DoIt;
  107. VAR NLoop, I, II, JJ : LONGINT;
  108. N1, N2, N3, N4, N5, N6, N7, N8, N9, N10, N11 : LONGINT;
  109. X1, X2, X3, X4, X, Y, Z : DOUBLE;
  110. BEGIN
  111. time0 := TimeNow;
  112. ptime := time0;
  113. (* The actual benchmark starts here. *)
  114. T := 0.499975;
  115. T1 := 0.50025;
  116. T2 := 2.0;
  117. (* With loopcount NLoop=10, one million Whetstone instructions
  118. will be executed in each major loop.
  119. A major loop is executed 'II' times to increase wall-clock timing accuracy *)
  120. NLoop := 30;
  121. II := 400;
  122. FOR JJ:=1 TO II DO BEGIN
  123. (* Establish the relative loop counts of each module. *)
  124. N1 := 0;
  125. N2 := 12 * NLoop;
  126. N3 := 14 * NLoop;
  127. N4 := 345 * NLoop;
  128. N5 := 0;
  129. N6 := 210 * NLoop;
  130. N7 := 32 * NLoop;
  131. N8 := 899 * NLoop;
  132. N9 := 616 * NLoop;
  133. N10 := 0;
  134. N11 := 93 * NLoop;
  135. (* Module 1: Simple identifiers *)
  136. X1 := 1.0;
  137. X2 := -1.0;
  138. X3 := -1.0;
  139. X4 := -1.0;
  140. FOR I:=1 TO N1 DO BEGIN
  141. X1 := (X1 + X2 + X3 - X4)*T;
  142. X2 := (X1 + X2 - X3 + X4)*T;
  143. X3 := (X1 - X2 + X3 + X4)*T;
  144. X4 := (-X1 + X2 + X3 + X4)*T;
  145. END;
  146. IF (JJ = II) THEN BEGIN
  147. POUT (N1, N1, N1, X1, X2, X3, X4);
  148. END;
  149. (* Module 2: Array elements *)
  150. E1 [1] := 1.0;
  151. E1 [2] := -1.0;
  152. E1 [3] := -1.0;
  153. E1 [4] := -1.0;
  154. FOR I:=1 TO N2 DO BEGIN
  155. E1 [1] := (E1 [1] + E1 [2] + E1 [3] - E1 [4])*T;
  156. E1 [2] := (E1 [1] + E1 [2] - E1 [3] + E1 [4])*T;
  157. E1 [3] := (E1 [1] - E1 [2] + E1 [3] + E1 [4])*T;
  158. E1 [4] := (-E1 [1] + E1 [2] + E1 [3] + E1 [4])*T;
  159. END;
  160. IF (JJ = II) THEN BEGIN
  161. POUT (N2, N3, N2, E1 [1], E1 [2], E1 [3], E1 [4]);
  162. END;
  163. (* Module 3: Array as parameter *)
  164. FOR I:=1 TO N3 DO BEGIN
  165. PA (E1);
  166. END;
  167. IF (JJ = II) THEN BEGIN
  168. POUT(N3, N2, N2, E1 [1], E1 [2], E1 [3], E1 [4]);
  169. END;
  170. (* Module 4: Conditional jumps *)
  171. J := 1;
  172. FOR I:=1 TO N4 DO BEGIN
  173. IF (J <> 1) THEN J := 3 ELSE J := 2;
  174. IF (J <= 2) THEN J := 1 ELSE J := 0;
  175. IF (J >= 1) THEN J := 0 ELSE J := 1;
  176. END;
  177. IF (JJ = II) THEN BEGIN
  178. POUT (N4, J, J, X1, X2, X3, X4)
  179. END;
  180. (* Module 5: Omitted; Module 6: Integer arithmetic *)
  181. J := 1;
  182. K := 2;
  183. L := 3;
  184. FOR I:=1 TO N6 DO BEGIN
  185. J := J * (K-J) * (L-K);
  186. K := L * K - (L-J) * K;
  187. L := (L - K) * (K + J);
  188. E1 [L-1] := (J + K + L);
  189. E1 [K-1] := (J * K * L);
  190. END;
  191. IF (JJ = II) THEN BEGIN
  192. POUT (N6, J, K, E1 [1], E1 [2], E1 [3], E1 [4]);
  193. END;
  194. (* Module 7: Trigonometric functions *)
  195. X := 0.5;
  196. Y := 0.5;
  197. FOR I:=1 TO N7 DO BEGIN
  198. X:=T*arctan(T2*sin(X)*cos(X)/(cos(X+Y)+cos(X-Y)-1.0));
  199. Y:=T*arctan(T2*sin(Y)*cos(Y)/(cos(X+Y)+cos(X-Y)-1.0));
  200. END;
  201. IF (JJ = II) THEN BEGIN
  202. POUT (N7, J, K, X, X, Y, Y);
  203. END;
  204. (* Module 8: Procedure calls *)
  205. X := 1.0;
  206. Y := 1.0;
  207. Z := 1.0;
  208. FOR I:=1 TO N8 DO BEGIN
  209. P3 (X,Y,Z);
  210. END;
  211. IF (JJ = II) THEN BEGIN
  212. POUT (N8, J, K, X, Y, Z, Z);
  213. END;
  214. (* Module 9: Array references *)
  215. J := 1;
  216. K := 2;
  217. L := 3;
  218. E1 [1] := 1.0;
  219. E1 [2] := 2.0;
  220. E1 [3] := 3.0;
  221. FOR I:=1 TO N9 DO BEGIN
  222. P0;
  223. END;
  224. IF (JJ = II) THEN BEGIN
  225. POUT (N9, J, K, E1 [1], E1 [2], E1 [3], E1 [4])
  226. END;
  227. (* Module 10: Integer arithmetic *)
  228. J := 2;
  229. K := 3;
  230. FOR I:=1 TO N10 DO BEGIN
  231. J := J + K;
  232. K := J + K;
  233. J := K - J;
  234. K := K - J - J;
  235. END;
  236. IF (JJ = II) THEN BEGIN
  237. POUT (N10, J, K, X1, X2, X3, X4)
  238. END;
  239. (* Module 11: Standard functions *)
  240. X := 0.75;
  241. FOR I:=1 TO N11 DO BEGIN
  242. X := sqrt (exp (ln (X)/T1))
  243. // x:=sqrt(x);
  244. END;
  245. IF (JJ = II) THEN BEGIN
  246. POUT (N11, J, K, X, X, X, X)
  247. END;
  248. (* THIS IS THE END OF THE MAJOR LOOP. *)
  249. END;
  250. (* Stop benchmark timing at this point. *)
  251. time1 := TimeNow;
  252. (*----------------------------------------------------------------
  253. Performance in Whetstone KIP's per second is given by
  254. (100*NLoop*II)/TIME
  255. where TIME is in seconds.
  256. --------------------------------------------------------------------*)
  257. WriteLn;
  258. WriteLn ('Double Whetstone KIPS ',
  259. (TRUNC ((100.0 * NLoop * II) /
  260. ((time1 - time0)/1000))));
  261. WriteLn ('Whetstone MIPS ',
  262. 1.0*NLoop*II /((1.0*time1 - 1.0*time0)/1000 * 10):12:2);
  263. END;
  264. BEGIN
  265. DoIt;
  266. END.