File: whetstone.d

package info (click to toggle)
gcc-arm-none-eabi 15%3A14.2.rel1-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid, trixie
  • size: 1,099,328 kB
  • sloc: cpp: 3,627,108; ansic: 2,571,498; ada: 834,230; f90: 235,082; makefile: 79,231; asm: 74,984; xml: 51,692; exp: 39,736; sh: 33,298; objc: 15,629; python: 15,069; fortran: 14,429; pascal: 7,003; awk: 5,070; perl: 3,106; ml: 285; lisp: 253; lex: 204; haskell: 135
file content (231 lines) | stat: -rw-r--r-- 5,789 bytes parent folder | download | duplicates (4)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
/*
PERMUTE_ARGS: -O
*/

/*
 WHETSTONE BENCHMARK PROGRAM

 This program uses a carefully chosen mix of instructions typical of
 scientific (floating point) calculations.

 See H.J. Curnow and B.A. Wichmann,
 "A Synthetic Benchmark", Computer J., V19 #1, Feb. 1976, pp. 43-49.

 Table of times for various computers in <info-ibmpc>whetst.answers
 compiled by Richard Gillmann (GILLMANN@ISIB)

Whetstone Fortran Benchmark
(I=10, optimization off, CPU seconds)

DEC       1.1 sec   DECsystem 2060 (TOPS-20 v4, F66)
PR1ME     1.4 sec   PR1ME 750 (PRIMOS v18.1, F66)
PR1ME     1.5 sec   PR1ME 750 (PRIMOS v18.1, F77)
DEC       2.1 sec   VAX 11/780 (Unix, F77)
Apollo    6.2 sec   10 MHz MC68000 w/hardware float. point (AEGIS v4.0, F77)
Apollo   13.1 sec   10 MHz MC68000 w/software float. point (AEGIS v4.0, F77)
Intel    16.0 sec   8086/8087 (286WD Micro Development System,Intel FORTRAN)
IBM      16.0 sec   4.77 MHz 8088 PC w/8087 (DOS 2, Microsoft F77/3.10)
Z80     124.0 sec   4 MHz Z80 with Microsoft Fortran, CP/M
IBM     268.9 sec   4.77 MHz 8088 PC ($NODEBUG) (DOS 1, Microsoft F77/1.0)
Intel   390.0 sec   8086 alone (286WD Micro Development System,Intel FORTRAN)

Table compiled by Richard Gillmann (Gillmann@ISIB).
*/

import core.stdc.stdio;
import core.stdc.time;
import core.stdc.math;

double t, t1, t2;
double[5] e1;
int j, k, l;

int main()
{
    clock_t start, stop;
    double x1, x2, x3, x4, x, y, z;
    int i, isave, n1, n2, n3, n4, n5, n6, n7, n8, n9, n10, n11, n12;

    start = clock();

/* I=10 CORRESPONDS TO ONE MILLION WHETSTONE INSTRUCTIONS */

    i = 10;
    t1 = 0.50025000;
    t = 0.499975000;
    t2 = 2.0000;
    isave = i;
    n1 = 0;
    n2 = 12 * i;
    n3 = 14 * i;
    n4 = 348 * i;
    n5 = 0;
    n6 = 210 * i;
    n7 = 32 * i;
    n8 = 899 * i;
    n9 = 516 * i;
    n10 = 0;
    n11 = 93 * i;
    n12 = 0;
    x1 = 1.0;
    x2 = -1.0;
    x3 = -1.0;
    x4 = -1.0;
    for (i = 1; i <= n1; i++)
    {
        x1 = (x1+x2+x3-x4)*t;
        x2 = (x1+x2-x3+x4)*t;
        x3 = (x1-x2+x3+x4)*t;
        x4 = (-x1+x2+x3+x4)*t;
    }
    auto s = pout(n1,n1,n1,x1,x2,x3,x4);
    assert(s[] == "       0       0       0   1.0000e+00  -1.0000e+00  -1.0000e+00  -1.0000e+00");

    e1[1] = 1.0;
    e1[2] = -1.0;
    e1[3] = -1.0;
    e1[4] = -1.0;

    for (i = 1; i <= n2; i++)
    {
        e1[1] = (e1[1]+e1[2]+e1[3]-e1[4])*t;
        e1[2] = (e1[1]+e1[2]-e1[3]+e1[4])*t;
        e1[3] = (e1[1]-e1[2]+e1[3]+e1[4])*t;
        e1[4] = (-e1[1]+e1[2]+e1[3]+e1[4])*t;
    }
    pout(n2,n3,n2,e1[1],e1[2],e1[3],e1[4]);
    assert(s == "     120     140     120  -6.8342e-02  -4.6264e-01  -7.2972e-01  -1.1240e+00");

    for (i = 1; i <= n3; i++)
    {
        pa(e1);
    }
    pout(n3,n2,n2,e1[1],e1[2],e1[3],e1[4]);
    assert(s == "     140     120     120  -5.5336e-02  -4.4744e-01  -7.1097e-01  -1.1031e+00");

    j = 1;
    for (i = 1; i <= n4; i++)
    {
        j = (j-1) ? 3 : 2;
        j = (j-2 < 0) ? 0 : 1;
        j = (j-1 < 0) ? 1 : 0;
    }
    pout(n4, j, j, x1, x2, x3, x4);
    assert(s == "    3480       0       0   1.0000e+00  -1.0000e+00  -1.0000e+00  -1.0000e+00");

    j = 1;
    k = 2;
    l = 3;
    for (i = 1; i <= n6; i++)
    {
        j = j*(k-j)*(l-k);
        k = l*k-(l-j)*k;
        l = (l-k)*(k+j);
        e1[l-1] = j+k+l;
        e1[k-1] = j*k*l;
    }
    pout(n6,j,k,e1[1],e1[2],e1[3],e1[4]);
    assert(s == "    2100       1       2   6.0000e+00   6.0000e+00  -7.1097e-01  -1.1031e+00");

    x = 0.5;
    y = 0.5;
    for (i = 1; i <= n7; i++)
    {
        x = t * atan(t2* sin(x)* cos(x) /
            ( cos(x+y)+ cos(x-y)-1.0  ));
        y = t * atan(t2* sin(y)* cos(y) /
            ( cos(x+y)+ cos(x-y)-1.0  ));
    }
    pout(n7, j, k, x, x, y, y);
    assert(s == "     320       1       2   4.9041e-01   4.9041e-01   4.9039e-01   4.9039e-01");

    x = 1.0;
    y = 1.0;
    z = 1.0;

    for (i = 1; i <= n8; i++)
    {
        z = p3(x, y);
    }
    pout(n8, j, k, x, y, z, z);
    assert(s == "    8990       1       2   1.0000e+00   1.0000e+00   9.9994e-01   9.9994e-01");

    j = 1;
    k = 2;
    l = 3;
    e1[1] = 1.0;
    e1[2] = 2.0;
    e1[3] = 3.0;

    for (i = 1; i <= n9; i++)
    {
        p0();
    }
    pout(n9, j, k, e1[1], e1[2], e1[3], e1[4]);
    assert(s == "    5160       1       2   3.0000e+00   2.0000e+00   3.0000e+00  -1.1031e+00");

    j = 2;
    k = 3;

    for (i = 1; i <= n10; i++)
    {
        j = j + k;
        k = j + k;
        j = j - k;
        k = k - j - j;
    }
    pout(n10, j, k, x1, x2, x3, x4);
    assert(s == "       0       2       3   1.0000e+00  -1.0000e+00  -1.0000e+00  -1.0000e+00");

    x = 0.75;

    for (i = 1; i <= n11; i++)
    {
        x = sqrt( exp( log(x) / t1));
    }

    pout(n11,j,k,x,x,x,x);
    assert(s == "     930       2       3   8.3467e-01   8.3467e-01   8.3467e-01   8.3467e-01");

    stop = clock();

    version (none)
    printf("Elapsed time = %d.%02d seconds\n",
            cast(int)(stop - start)/CLOCKS_PER_SEC,
            cast(int)(stop - start)%CLOCKS_PER_SEC);
    return 0;
}

void pa(double[] e)
{
    for (j = 0; j < 6; j++)
    {
        e[1] = (e[1] + e[2] + e[3] - e[4]) * t;
        e[2] = (e[1] + e[2] - e[3] + e[4]) * t;
        e[3] = (e[1] - e[2] + e[3] + e[4]) * t;
        e[4] = (-e[1] + e[2] + e[3] + e[4]) / t2;
    }
}

void p0()
{
    e1[j] = e1[k];
    e1[k] = e1[l];
    e1[l] = e1[j];
}

double p3(double x, double y)
{
    x = t * (x + y);
    y = t * (x + y);
    return (x + y) / t2;
}

char[] pout(int n, int j, int k, double x1, double x2, double x3, double x4)
{
    __gshared char[80] result;
    const len = sprintf(result.ptr, " %7d %7d %7d %12.4e %12.4e %12.4e %12.4e",
            n, j, k, x1, x2, x3, x4);
    printf("%s\n", result.ptr);
    return result[0 .. len];
}