Yeppp!
 All Classes Groups Pages
Polynomial.f90

This example demonstrates the use of Yeppp! library to evaluate a polynomial on an array:

1 PROGRAM polynomial
2  USE yeplibrary, ONLY: yeplibrary_init, yeplibrary_release, yeplibrary_gettimerfrequency, yeplibrary_gettimerticks
3  USE yepmath, ONLY: yepmath_evaluatepolynomial_v64fv64f_v64f
4  USE iso_c_binding, ONLY : c_size_t, c_int
5  IMPLICIT NONE
6  ! Size of the array of elements to compute the polynomial on
7  INTEGER(C_SIZE_T), PARAMETER :: n = 1024*1024*8
8  INTEGER(C_SIZE_T), PARAMETER :: coefcount = 101
9  INTEGER(8) :: ticksstart, ticksend, frequency
10  REAL(8) :: seconds, flops
11  REAL(8) :: x(n), pyeppp(n) = 0.0d0, pnaive(n) = 0.0d0
12  INTEGER(C_INT) :: s
13  ! Polynomial Coefficients 101
14  REAL(8), PARAMETER :: c0 = 1.53270461724076346
15  REAL(8), PARAMETER :: c1 = 1.45339856462100293
16  REAL(8), PARAMETER :: c2 = 1.21078763026010761
17  REAL(8), PARAMETER :: c3 = 1.46952786401453397
18  REAL(8), PARAMETER :: c4 = 1.34249847863665017
19  REAL(8), PARAMETER :: c5 = 0.75093174077762164
20  REAL(8), PARAMETER :: c6 = 1.90239336671587562
21  REAL(8), PARAMETER :: c7 = 1.62162053962810579
22  REAL(8), PARAMETER :: c8 = 0.53312230473555923
23  REAL(8), PARAMETER :: c9 = 1.76588453111778762
24  REAL(8), PARAMETER :: c10 = 1.31215699612484679
25  REAL(8), PARAMETER :: c11 = 1.49636144227257237
26  REAL(8), PARAMETER :: c12 = 1.52170011054112963
27  REAL(8), PARAMETER :: c13 = 0.83637497322280110
28  REAL(8), PARAMETER :: c14 = 1.12764540941736043
29  REAL(8), PARAMETER :: c15 = 0.65513628703807597
30  REAL(8), PARAMETER :: c16 = 1.15879020877781906
31  REAL(8), PARAMETER :: c17 = 1.98262901973751791
32  REAL(8), PARAMETER :: c18 = 1.09134643523639479
33  REAL(8), PARAMETER :: c19 = 1.92898634047221235
34  REAL(8), PARAMETER :: c20 = 1.01233347751449659
35  REAL(8), PARAMETER :: c21 = 1.89462732589369078
36  REAL(8), PARAMETER :: c22 = 1.28216239080886344
37  REAL(8), PARAMETER :: c23 = 1.78448898277094016
38  REAL(8), PARAMETER :: c24 = 1.22382217182612910
39  REAL(8), PARAMETER :: c25 = 1.23434674193555734
40  REAL(8), PARAMETER :: c26 = 1.13914782832335501
41  REAL(8), PARAMETER :: c27 = 0.73506235075797319
42  REAL(8), PARAMETER :: c28 = 0.55461432517332724
43  REAL(8), PARAMETER :: c29 = 1.51704871121967963
44  REAL(8), PARAMETER :: c30 = 1.22430234239661516
45  REAL(8), PARAMETER :: c31 = 1.55001237689160722
46  REAL(8), PARAMETER :: c32 = 0.84197209952298114
47  REAL(8), PARAMETER :: c33 = 1.59396169927319749
48  REAL(8), PARAMETER :: c34 = 0.97067044414760438
49  REAL(8), PARAMETER :: c35 = 0.99001960195021281
50  REAL(8), PARAMETER :: c36 = 1.17887814292622884
51  REAL(8), PARAMETER :: c37 = 0.58955609453835851
52  REAL(8), PARAMETER :: c38 = 0.58145654861350322
53  REAL(8), PARAMETER :: c39 = 1.32447212043555583
54  REAL(8), PARAMETER :: c40 = 1.24673632882394241
55  REAL(8), PARAMETER :: c41 = 1.24571828921765111
56  REAL(8), PARAMETER :: c42 = 1.21901343493503215
57  REAL(8), PARAMETER :: c43 = 1.89453941213996638
58  REAL(8), PARAMETER :: c44 = 1.85561626872427416
59  REAL(8), PARAMETER :: c45 = 1.13302165522004133
60  REAL(8), PARAMETER :: c46 = 1.79145993815510725
61  REAL(8), PARAMETER :: c47 = 1.59227069037095317
62  REAL(8), PARAMETER :: c48 = 1.89104468672467114
63  REAL(8), PARAMETER :: c49 = 1.78733894997070918
64  REAL(8), PARAMETER :: c50 = 1.32648559107345081
65  REAL(8), PARAMETER :: c51 = 1.68531055586072865
66  REAL(8), PARAMETER :: c52 = 1.08980909640581993
67  REAL(8), PARAMETER :: c53 = 1.34308207822154847
68  REAL(8), PARAMETER :: c54 = 1.81689492849547059
69  REAL(8), PARAMETER :: c55 = 1.38582137073988747
70  REAL(8), PARAMETER :: c56 = 1.04974901183570510
71  REAL(8), PARAMETER :: c57 = 1.14348742300966456
72  REAL(8), PARAMETER :: c58 = 1.87597730040483323
73  REAL(8), PARAMETER :: c59 = 0.62131555899466420
74  REAL(8), PARAMETER :: c60 = 0.64710935668225787
75  REAL(8), PARAMETER :: c61 = 1.49846610600978751
76  REAL(8), PARAMETER :: c62 = 1.07834176789680957
77  REAL(8), PARAMETER :: c63 = 1.69130785175832059
78  REAL(8), PARAMETER :: c64 = 1.64547687732258793
79  REAL(8), PARAMETER :: c65 = 1.02441150427208083
80  REAL(8), PARAMETER :: c66 = 1.86129006037146541
81  REAL(8), PARAMETER :: c67 = 0.98309038830424073
82  REAL(8), PARAMETER :: c68 = 1.75444578237500969
83  REAL(8), PARAMETER :: c69 = 1.08698336765112349
84  REAL(8), PARAMETER :: c70 = 1.89455010772036759
85  REAL(8), PARAMETER :: c71 = 0.65812118412299539
86  REAL(8), PARAMETER :: c72 = 0.62102711487851459
87  REAL(8), PARAMETER :: c73 = 1.69991208083436747
88  REAL(8), PARAMETER :: c74 = 1.65467704495635767
89  REAL(8), PARAMETER :: c75 = 1.69599459626992174
90  REAL(8), PARAMETER :: c76 = 0.82365682103308750
91  REAL(8), PARAMETER :: c77 = 1.71353437063595036
92  REAL(8), PARAMETER :: c78 = 0.54992984722831769
93  REAL(8), PARAMETER :: c79 = 0.54717367088443119
94  REAL(8), PARAMETER :: c80 = 0.79915543248858154
95  REAL(8), PARAMETER :: c81 = 1.70160318364006257
96  REAL(8), PARAMETER :: c82 = 1.34441280175456970
97  REAL(8), PARAMETER :: c83 = 0.79789486341474966
98  REAL(8), PARAMETER :: c84 = 0.61517383020710754
99  REAL(8), PARAMETER :: c85 = 0.55177400048576055
100  REAL(8), PARAMETER :: c86 = 1.43229889543908696
101  REAL(8), PARAMETER :: c87 = 1.60658663666266949
102  REAL(8), PARAMETER :: c88 = 1.78861146369896090
103  REAL(8), PARAMETER :: c89 = 1.05843250742401821
104  REAL(8), PARAMETER :: c90 = 1.58481799048208832
105  REAL(8), PARAMETER :: c91 = 1.70954313374718085
106  REAL(8), PARAMETER :: c92 = 0.52590070195022226
107  REAL(8), PARAMETER :: c93 = 0.92705074709607885
108  REAL(8), PARAMETER :: c94 = 0.71442651832362455
109  REAL(8), PARAMETER :: c95 = 1.14752795948077643
110  REAL(8), PARAMETER :: c96 = 0.89860175106926404
111  REAL(8), PARAMETER :: c97 = 0.76771198245570573
112  REAL(8), PARAMETER :: c98 = 0.67059202034800746
113  REAL(8), PARAMETER :: c99 = 0.53785922275590729
114  REAL(8), PARAMETER :: c100 = 0.82098327929734880
115  REAL(8), DIMENSION (coefCount) :: coefs = (/ c0, &
116  c1, c2, c3, c4, c5, c6, c7, c8, c9, c10, &
117  c11, c12, c13, c14, c15, c16, c17, c18, c19, c20, &
118  c21, c22, c23, c24, c25, c26, c27, c28, c29, c30, &
119  c31, c32, c33, c34, c35, c36, c37, c38, c39, c40, &
120  c41, c42, c43, c44, c45, c46, c47, c48, c49, c50, &
121  c51, c52, c53, c54, c55, c56, c57, c58, c59, c60, &
122  c61, c62, c63, c64, c65, c66, c67, c68, c69, c70, &
123  c71, c72, c73, c74, c75, c76, c77, c78, c79, c80, &
124  c81, c82, c83, c84, c85, c86, c87, c88, c89, c90, &
125  c91, c92, c93, c94, c95, c96, c97, c98, c99, c100 /)
126 
127  s = yeplibrary_init()
128  s = yeplibrary_gettimerfrequency(frequency)
129  CALL random_number(x)
130  pyeppp = 0.0d0
131  pnaive = 0.0d0
132 
133  s = yeplibrary_gettimerticks(ticksstart)
134 
135  ! Evaluate polynomial using FORTRAN implementation
136  pnaive = c0 + x * (c1 + x * (c2 + x * (c3 + x * (c4 + x * (c5 + x * (c6 + &
137  x * (c7 + x * (c8 + x * (c9 + x * (c10 + x * (c11 + x * (c12 + &
138  x * (c13 + x * (c14 + x * (c15 + x * (c16 + x * (c17 + x * (c18 + &
139  x * (c19 + x * (c20 + x * (c21 + x * (c22 + x * (c23 + x * (c24 + &
140  x * (c25 + x * (c26 + x * (c27 + x * (c28 + x * (c29 + x * (c30 + &
141  x * (c31 + x * (c32 + x * (c33 + x * (c34 + x * (c35 + x * (c36 + &
142  x * (c37 + x * (c38 + x * (c39 + x * (c40 + x * (c41 + x * (c42 + &
143  x * (c43 + x * (c44 + x * (c45 + x * (c46 + x * (c47 + x * (c48 + &
144  x * (c49 + x * (c50 + x * (c51 + x * (c52 + x * (c53 + x * (c54 + &
145  x * (c55 + x * (c56 + x * (c57 + x * (c58 + x * (c59 + x * (c60 + &
146  x * (c61 + x * (c62 + x * (c63 + x * (c64 + x * (c65 + x * (c66 + &
147  x * (c67 + x * (c68 + x * (c69 + x * (c70 + x * (c71 + x * (c72 + &
148  x * (c73 + x * (c74 + x * (c75 + x * (c76 + x * (c77 + x * (c78 + &
149  x * (c79 + x * (c80 + x * (c81 + x * (c82 + x * (c83 + x * (c84 + &
150  x * (c85 + x * (c86 + x * (c87 + x * (c88 + x * (c89 + x * (c90 + &
151  x * (c91 + x * (c92 + x * (c93 + x * (c94 + x * (c95 + x * (c96 + &
152  x * (c97 + x * (c98 + x * (c99 + x * c100)))))))))))))))))))))))))))) &
153  )))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))
154 
155  s = yeplibrary_gettimerticks(ticksend)
156  seconds = REAL(ticksEnd - ticksStart) / REAL(frequency)
157  flops = REAL(n, 8) * REAL((coefCount - 1) * 2, 8) / seconds;
158  print '(A)', 'Naive'
159  print '(A20,F7.4, A)', "Time = ", seconds, " secs"
160  print '(A20,F7.4, A)', "Performance = ", flops * 1.0e-9, " GFLOPS"
161 
162  s = yeplibrary_gettimerticks(ticksstart)
163  ! Evaluate polynomial using Yeppp!
164  s = yepmath_evaluatepolynomial_v64fv64f_v64f(coefs, x, pyeppp, coefcount, n)
165  s = yeplibrary_gettimerticks(ticksend)
166  seconds = REAL(ticksEnd - ticksStart) / REAL(frequency)
167  flops = REAL(n, 8) * REAL((coefCount - 1) * 2, 8) / seconds;
168  print '(A)', 'Yeppp!'
169  print '(A20,F7.4, A)', "Time = ", seconds, " secs"
170  print '(A20,F7.4, A)', "Performance = ", flops * 1.0e-9, " GFLOPS"
171 
172  print '(A,F7.3, A)', "Max relative error = ", maxval(abs((pnaive - pyeppp) / pnaive)) * 100, "%"
173 
174  s = yeplibrary_release()
175 END