1*09a53ad8SAndrew Turner /* 2*09a53ad8SAndrew Turner ************************************************************************** 3*09a53ad8SAndrew Turner * DHRYSTONE 2.1 BENCHMARK PC VERSION 4*09a53ad8SAndrew Turner ************************************************************************** 5*09a53ad8SAndrew Turner * 6*09a53ad8SAndrew Turner * "DHRYSTONE" Benchmark Program 7*09a53ad8SAndrew Turner * ----------------------------- 8*09a53ad8SAndrew Turner * 9*09a53ad8SAndrew Turner * Version: C, Version 2.1 10*09a53ad8SAndrew Turner * 11*09a53ad8SAndrew Turner * File: dhry.h (part 1 of 3) 12*09a53ad8SAndrew Turner * 13*09a53ad8SAndrew Turner * Date: May 25, 1988 14*09a53ad8SAndrew Turner * 15*09a53ad8SAndrew Turner * Author: Reinhold P. Weicker 16*09a53ad8SAndrew Turner * Siemens AG, AUT E 51 17*09a53ad8SAndrew Turner * Postfach 3220 18*09a53ad8SAndrew Turner * 8520 Erlangen 19*09a53ad8SAndrew Turner * Germany (West) 20*09a53ad8SAndrew Turner * Phone: [+49]-9131-7-20330 21*09a53ad8SAndrew Turner * (8-17 Central European Time) 22*09a53ad8SAndrew Turner * Usenet: ..!mcsun!unido!estevax!weicker 23*09a53ad8SAndrew Turner * 24*09a53ad8SAndrew Turner * Original Version (in Ada) published in 25*09a53ad8SAndrew Turner * "Communications of the ACM" vol. 27., no. 10 (Oct. 1984), 26*09a53ad8SAndrew Turner * pp. 1013 - 1030, together with the statistics 27*09a53ad8SAndrew Turner * on which the distribution of statements etc. is based. 28*09a53ad8SAndrew Turner * 29*09a53ad8SAndrew Turner * In this C version, the following C library functions are used: 30*09a53ad8SAndrew Turner * - strcpy, strcmp (inside the measurement loop) 31*09a53ad8SAndrew Turner * - printf, scanf (outside the measurement loop) 32*09a53ad8SAndrew Turner * In addition, Berkeley UNIX system calls "times ()" or "time ()" 33*09a53ad8SAndrew Turner * are used for execution time measurement. For measurements 34*09a53ad8SAndrew Turner * on other systems, these calls have to be changed. 35*09a53ad8SAndrew Turner * 36*09a53ad8SAndrew Turner * Collection of Results: 37*09a53ad8SAndrew Turner * Reinhold Weicker (address see above) and 38*09a53ad8SAndrew Turner * 39*09a53ad8SAndrew Turner * Rick Richardson 40*09a53ad8SAndrew Turner * PC Research. Inc. 41*09a53ad8SAndrew Turner * 94 Apple Orchard Drive 42*09a53ad8SAndrew Turner * Tinton Falls, NJ 07724 43*09a53ad8SAndrew Turner * Phone: (201) 389-8963 (9-17 EST) 44*09a53ad8SAndrew Turner * Usenet: ...!uunet!pcrat!rick 45*09a53ad8SAndrew Turner * 46*09a53ad8SAndrew Turner * Please send results to Rick Richardson and/or Reinhold Weicker. 47*09a53ad8SAndrew Turner * Complete information should be given on hardware and software used. 48*09a53ad8SAndrew Turner * Hardware information includes: Machine type, CPU, type and size 49*09a53ad8SAndrew Turner * of caches; for microprocessors: clock frequency, memory speed 50*09a53ad8SAndrew Turner * (number of wait states). 51*09a53ad8SAndrew Turner * Software information includes: Compiler (and runtime library) 52*09a53ad8SAndrew Turner * manufacturer and version, compilation switches, OS version. 53*09a53ad8SAndrew Turner * The Operating System version may give an indication about the 54*09a53ad8SAndrew Turner * compiler; Dhrystone itself performs no OS calls in the measurement 55*09a53ad8SAndrew Turner * loop. 56*09a53ad8SAndrew Turner * 57*09a53ad8SAndrew Turner * The complete output generated by the program should be mailed 58*09a53ad8SAndrew Turner * such that at least some checks for correctness can be made. 59*09a53ad8SAndrew Turner * 60*09a53ad8SAndrew Turner ************************************************************************** 61*09a53ad8SAndrew Turner * 62*09a53ad8SAndrew Turner * This version has changes made by Roy Longbottom to conform to a common 63*09a53ad8SAndrew Turner * format for a series of standard benchmarks for PCs: 64*09a53ad8SAndrew Turner * 65*09a53ad8SAndrew Turner * Running time greater than 5 seconds due to inaccuracy of the PC clock. 66*09a53ad8SAndrew Turner * 67*09a53ad8SAndrew Turner * Automatic adjustment of run time, no manually inserted parameters. 68*09a53ad8SAndrew Turner * 69*09a53ad8SAndrew Turner * Initial display of calibration times to confirm linearity. 70*09a53ad8SAndrew Turner * 71*09a53ad8SAndrew Turner * Display of results within one screen (or at a slow speed as the test 72*09a53ad8SAndrew Turner * progresses) so that it can be seen to have run successfully. 73*09a53ad8SAndrew Turner * 74*09a53ad8SAndrew Turner * Facilities to type in details of system used etc. 75*09a53ad8SAndrew Turner * 76*09a53ad8SAndrew Turner * All results and details appended to a results file. 77*09a53ad8SAndrew Turner * 78*09a53ad8SAndrew Turner * 79*09a53ad8SAndrew Turner * Roy Longbottom 80*09a53ad8SAndrew Turner * 101323.2241@compuserve.com 81*09a53ad8SAndrew Turner * 82*09a53ad8SAndrew Turner ************************************************************************** 83*09a53ad8SAndrew Turner * 84*09a53ad8SAndrew Turner * For details of history, changes, other defines, benchmark construction 85*09a53ad8SAndrew Turner * statistics see official versions from ftp.nosc.mil/pub/aburto where 86*09a53ad8SAndrew Turner * the latest table of results (dhry.tbl) are available. See also 87*09a53ad8SAndrew Turner * netlib@ornl.gov 88*09a53ad8SAndrew Turner * 89*09a53ad8SAndrew Turner ************************************************************************** 90*09a53ad8SAndrew Turner * 91*09a53ad8SAndrew Turner * Defines: The following "Defines" are possible: 92*09a53ad8SAndrew Turner * -DREG=register (default: Not defined) 93*09a53ad8SAndrew Turner * As an approximation to what an average C programmer 94*09a53ad8SAndrew Turner * might do, the "register" storage class is applied 95*09a53ad8SAndrew Turner * (if enabled by -DREG=register) 96*09a53ad8SAndrew Turner * - for local variables, if they are used (dynamically) 97*09a53ad8SAndrew Turner * five or more times 98*09a53ad8SAndrew Turner * - for parameters if they are used (dynamically) 99*09a53ad8SAndrew Turner * six or more times 100*09a53ad8SAndrew Turner * Note that an optimal "register" strategy is 101*09a53ad8SAndrew Turner * compiler-dependent, and that "register" declarations 102*09a53ad8SAndrew Turner * do not necessarily lead to faster execution. 103*09a53ad8SAndrew Turner * -DNOSTRUCTASSIGN (default: Not defined) 104*09a53ad8SAndrew Turner * Define if the C compiler does not support 105*09a53ad8SAndrew Turner * assignment of structures. 106*09a53ad8SAndrew Turner * -DNOENUMS (default: Not defined) 107*09a53ad8SAndrew Turner * Define if the C compiler does not support 108*09a53ad8SAndrew Turner * enumeration types. 109*09a53ad8SAndrew Turner *************************************************************************** 110*09a53ad8SAndrew Turner * 111*09a53ad8SAndrew Turner * Compilation model and measurement (IMPORTANT): 112*09a53ad8SAndrew Turner * 113*09a53ad8SAndrew Turner * This C version of Dhrystone consists of three files: 114*09a53ad8SAndrew Turner * - dhry.h (this file, containing global definitions and comments) 115*09a53ad8SAndrew Turner * - dhry_1.c (containing the code corresponding to Ada package Pack_1) 116*09a53ad8SAndrew Turner * - dhry_2.c (containing the code corresponding to Ada package Pack_2) 117*09a53ad8SAndrew Turner * 118*09a53ad8SAndrew Turner * The following "ground rules" apply for measurements: 119*09a53ad8SAndrew Turner * - Separate compilation 120*09a53ad8SAndrew Turner * - No procedure merging 121*09a53ad8SAndrew Turner * - Otherwise, compiler optimizations are allowed but should be indicated 122*09a53ad8SAndrew Turner * - Default results are those without register declarations 123*09a53ad8SAndrew Turner * See the companion paper "Rationale for Dhrystone Version 2" for a more 124*09a53ad8SAndrew Turner * detailed discussion of these ground rules. 125*09a53ad8SAndrew Turner * 126*09a53ad8SAndrew Turner * For 16-Bit processors (e.g. 80186, 80286), times for all compilation 127*09a53ad8SAndrew Turner * models ("small", "medium", "large" etc.) should be given if possible, 128*09a53ad8SAndrew Turner * together with a definition of these models for the compiler system used. 129*09a53ad8SAndrew Turner * 130*09a53ad8SAndrew Turner ************************************************************************** 131*09a53ad8SAndrew Turner * Examples of Pentium Results 132*09a53ad8SAndrew Turner * 133*09a53ad8SAndrew Turner * Dhrystone Benchmark Version 2.1 (Language: C) 134*09a53ad8SAndrew Turner * 135*09a53ad8SAndrew Turner * Month run 4/1996 136*09a53ad8SAndrew Turner * PC model Escom 137*09a53ad8SAndrew Turner * CPU Pentium 138*09a53ad8SAndrew Turner * Clock MHz 100 139*09a53ad8SAndrew Turner * Cache 256K 140*09a53ad8SAndrew Turner * Options Neptune chipset 141*09a53ad8SAndrew Turner * OS/DOS Windows 95 142*09a53ad8SAndrew Turner * Compiler Watcom C/ C++ 10.5 Win386 143*09a53ad8SAndrew Turner * OptLevel -otexan -zp8 -fp5 -5r 144*09a53ad8SAndrew Turner * Run by Roy Longbottom 145*09a53ad8SAndrew Turner * From UK 146*09a53ad8SAndrew Turner * Mail 101323.2241@compuserve.com 147*09a53ad8SAndrew Turner * 148*09a53ad8SAndrew Turner * Final values (* implementation-dependent): 149*09a53ad8SAndrew Turner * 150*09a53ad8SAndrew Turner * Int_Glob: O.K. 5 151*09a53ad8SAndrew Turner * Bool_Glob: O.K. 1 152*09a53ad8SAndrew Turner * Ch_1_Glob: O.K. A 153*09a53ad8SAndrew Turner * Ch_2_Glob: O.K. B 154*09a53ad8SAndrew Turner * Arr_1_Glob[8]: O.K. 7 155*09a53ad8SAndrew Turner * Arr_2_Glob8/7: O.K. 1600010 156*09a53ad8SAndrew Turner * Ptr_Glob-> 157*09a53ad8SAndrew Turner * Ptr_Comp: * 98008 158*09a53ad8SAndrew Turner * Discr: O.K. 0 159*09a53ad8SAndrew Turner * Enum_Comp: O.K. 2 160*09a53ad8SAndrew Turner * Int_Comp: O.K. 17 161*09a53ad8SAndrew Turner * Str_Comp: O.K. DHRYSTONE PROGRAM, SOME STRING 162*09a53ad8SAndrew Turner * Next_Ptr_Glob-> 163*09a53ad8SAndrew Turner * Ptr_Comp: * 98008 same as above 164*09a53ad8SAndrew Turner * Discr: O.K. 0 165*09a53ad8SAndrew Turner * Enum_Comp: O.K. 1 166*09a53ad8SAndrew Turner * Int_Comp: O.K. 18 167*09a53ad8SAndrew Turner * Str_Comp: O.K. DHRYSTONE PROGRAM, SOME STRING 168*09a53ad8SAndrew Turner * Int_1_Loc: O.K. 5 169*09a53ad8SAndrew Turner * Int_2_Loc: O.K. 13 170*09a53ad8SAndrew Turner * Int_3_Loc: O.K. 7 171*09a53ad8SAndrew Turner * Enum_Loc: O.K. 1 172*09a53ad8SAndrew Turner * Str_1_Loc: O.K. DHRYSTONE PROGRAM, 1'ST STRING 173*09a53ad8SAndrew Turner * Str_2_Loc: O.K. DHRYSTONE PROGRAM, 2'ND STRING 174*09a53ad8SAndrew Turner * 175*09a53ad8SAndrew Turner * Register option Selected. 176*09a53ad8SAndrew Turner * 177*09a53ad8SAndrew Turner * Microseconds 1 loop: 4.53 178*09a53ad8SAndrew Turner * Dhrystones / second: 220690 179*09a53ad8SAndrew Turner * VAX MIPS rating: 125.61 180*09a53ad8SAndrew Turner * 181*09a53ad8SAndrew Turner * 182*09a53ad8SAndrew Turner * Dhrystone Benchmark Version 2.1 (Language: C) 183*09a53ad8SAndrew Turner * 184*09a53ad8SAndrew Turner * Month run 4/1996 185*09a53ad8SAndrew Turner * PC model Escom 186*09a53ad8SAndrew Turner * CPU Pentium 187*09a53ad8SAndrew Turner * Clock MHz 100 188*09a53ad8SAndrew Turner * Cache 256K 189*09a53ad8SAndrew Turner * Options Neptune chipset 190*09a53ad8SAndrew Turner * OS/DOS Windows 95 191*09a53ad8SAndrew Turner * Compiler Watcom C/ C++ 10.5 Win386 192*09a53ad8SAndrew Turner * OptLevel No optimisation 193*09a53ad8SAndrew Turner * Run by Roy Longbottom 194*09a53ad8SAndrew Turner * From UK 195*09a53ad8SAndrew Turner * Mail 101323.2241@compuserve.com 196*09a53ad8SAndrew Turner * 197*09a53ad8SAndrew Turner * Final values (* implementation-dependent): 198*09a53ad8SAndrew Turner * 199*09a53ad8SAndrew Turner * Int_Glob: O.K. 5 200*09a53ad8SAndrew Turner * Bool_Glob: O.K. 1 201*09a53ad8SAndrew Turner * Ch_1_Glob: O.K. A 202*09a53ad8SAndrew Turner * Ch_2_Glob: O.K. B 203*09a53ad8SAndrew Turner * Arr_1_Glob[8]: O.K. 7 204*09a53ad8SAndrew Turner * Arr_2_Glob8/7: O.K. 320010 205*09a53ad8SAndrew Turner * Ptr_Glob-> 206*09a53ad8SAndrew Turner * Ptr_Comp: * 98004 207*09a53ad8SAndrew Turner * Discr: O.K. 0 208*09a53ad8SAndrew Turner * Enum_Comp: O.K. 2 209*09a53ad8SAndrew Turner * Int_Comp: O.K. 17 210*09a53ad8SAndrew Turner * Str_Comp: O.K. DHRYSTONE PROGRAM, SOME STRING 211*09a53ad8SAndrew Turner * Next_Ptr_Glob-> 212*09a53ad8SAndrew Turner * Ptr_Comp: * 98004 same as above 213*09a53ad8SAndrew Turner * Discr: O.K. 0 214*09a53ad8SAndrew Turner * Enum_Comp: O.K. 1 215*09a53ad8SAndrew Turner * Int_Comp: O.K. 18 216*09a53ad8SAndrew Turner * Str_Comp: O.K. DHRYSTONE PROGRAM, SOME STRING 217*09a53ad8SAndrew Turner * Int_1_Loc: O.K. 5 218*09a53ad8SAndrew Turner * Int_2_Loc: O.K. 13 219*09a53ad8SAndrew Turner * Int_3_Loc: O.K. 7 220*09a53ad8SAndrew Turner * Enum_Loc: O.K. 1 221*09a53ad8SAndrew Turner * Str_1_Loc: O.K. DHRYSTONE PROGRAM, 1'ST STRING 222*09a53ad8SAndrew Turner * Str_2_Loc: O.K. DHRYSTONE PROGRAM, 2'ND STRING 223*09a53ad8SAndrew Turner * 224*09a53ad8SAndrew Turner * Register option Not selected. 225*09a53ad8SAndrew Turner * 226*09a53ad8SAndrew Turner * Microseconds 1 loop: 20.06 227*09a53ad8SAndrew Turner * Dhrystones / second: 49844 228*09a53ad8SAndrew Turner * VAX MIPS rating: 28.37 229*09a53ad8SAndrew Turner * 230*09a53ad8SAndrew Turner ************************************************************************** 231*09a53ad8SAndrew Turner */ 232*09a53ad8SAndrew Turner 233*09a53ad8SAndrew Turner /* Compiler and system dependent definitions: */ 234*09a53ad8SAndrew Turner 235*09a53ad8SAndrew Turner #ifndef TIME 236*09a53ad8SAndrew Turner #define TIMES 237*09a53ad8SAndrew Turner #endif 238*09a53ad8SAndrew Turner /* Use times(2) time function unless */ 239*09a53ad8SAndrew Turner /* explicitly defined otherwise */ 240*09a53ad8SAndrew Turner 241*09a53ad8SAndrew Turner #ifdef TIMES 242*09a53ad8SAndrew Turner /* #include <sys/types.h> 243*09a53ad8SAndrew Turner #include <sys/times.h> */ 244*09a53ad8SAndrew Turner /* for "times" */ 245*09a53ad8SAndrew Turner #endif 246*09a53ad8SAndrew Turner 247*09a53ad8SAndrew Turner #define Mic_secs_Per_Second 1000000.0 248*09a53ad8SAndrew Turner /* Berkeley UNIX C returns process times in seconds/HZ */ 249*09a53ad8SAndrew Turner 250*09a53ad8SAndrew Turner #ifdef NOSTRUCTASSIGN 251*09a53ad8SAndrew Turner #define structassign(d, s) memcpy(&(d), &(s), sizeof(d)) 252*09a53ad8SAndrew Turner #else 253*09a53ad8SAndrew Turner #define structassign(d, s) d = s 254*09a53ad8SAndrew Turner #endif 255*09a53ad8SAndrew Turner 256*09a53ad8SAndrew Turner #ifdef NOENUM 257*09a53ad8SAndrew Turner #define Ident_1 0 258*09a53ad8SAndrew Turner #define Ident_2 1 259*09a53ad8SAndrew Turner #define Ident_3 2 260*09a53ad8SAndrew Turner #define Ident_4 3 261*09a53ad8SAndrew Turner #define Ident_5 4 262*09a53ad8SAndrew Turner typedef int Enumeration; 263*09a53ad8SAndrew Turner #else 264*09a53ad8SAndrew Turner typedef enum {Ident_1, Ident_2, Ident_3, Ident_4, Ident_5} 265*09a53ad8SAndrew Turner Enumeration; 266*09a53ad8SAndrew Turner #endif 267*09a53ad8SAndrew Turner /* for boolean and enumeration types in Ada, Pascal */ 268*09a53ad8SAndrew Turner 269*09a53ad8SAndrew Turner /* General definitions: */ 270*09a53ad8SAndrew Turner 271*09a53ad8SAndrew Turner #include <stdio.h> 272*09a53ad8SAndrew Turner #include <string.h> 273*09a53ad8SAndrew Turner 274*09a53ad8SAndrew Turner /* for strcpy, strcmp */ 275*09a53ad8SAndrew Turner 276*09a53ad8SAndrew Turner #define Null 0 277*09a53ad8SAndrew Turner /* Value of a Null pointer */ 278*09a53ad8SAndrew Turner #define true 1 279*09a53ad8SAndrew Turner #define false 0 280*09a53ad8SAndrew Turner 281*09a53ad8SAndrew Turner typedef int One_Thirty; 282*09a53ad8SAndrew Turner typedef int One_Fifty; 283*09a53ad8SAndrew Turner typedef char Capital_Letter; 284*09a53ad8SAndrew Turner typedef int Boolean; 285*09a53ad8SAndrew Turner typedef char Str_30 [31]; 286*09a53ad8SAndrew Turner typedef int Arr_1_Dim [50]; 287*09a53ad8SAndrew Turner typedef int Arr_2_Dim [50] [50]; 288*09a53ad8SAndrew Turner 289*09a53ad8SAndrew Turner typedef struct record 290*09a53ad8SAndrew Turner { 291*09a53ad8SAndrew Turner struct record *Ptr_Comp; 292*09a53ad8SAndrew Turner Enumeration Discr; 293*09a53ad8SAndrew Turner union { 294*09a53ad8SAndrew Turner struct { 295*09a53ad8SAndrew Turner Enumeration Enum_Comp; 296*09a53ad8SAndrew Turner int Int_Comp; 297*09a53ad8SAndrew Turner char Str_Comp [31]; 298*09a53ad8SAndrew Turner } var_1; 299*09a53ad8SAndrew Turner struct { 300*09a53ad8SAndrew Turner Enumeration E_Comp_2; 301*09a53ad8SAndrew Turner char Str_2_Comp [31]; 302*09a53ad8SAndrew Turner } var_2; 303*09a53ad8SAndrew Turner struct { 304*09a53ad8SAndrew Turner char Ch_1_Comp; 305*09a53ad8SAndrew Turner char Ch_2_Comp; 306*09a53ad8SAndrew Turner } var_3; 307*09a53ad8SAndrew Turner } variant; 308*09a53ad8SAndrew Turner } Rec_Type, *Rec_Pointer; 309*09a53ad8SAndrew Turner 310*09a53ad8SAndrew Turner 311*09a53ad8SAndrew Turner 312