intervals 0.3.56
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/VERSION.txt +1 -0
- data/ext/crlibm/AUTHORS +2 -0
- data/ext/crlibm/COPYING +504 -0
- data/ext/crlibm/ChangeLog +80 -0
- data/ext/crlibm/INSTALL +182 -0
- data/ext/crlibm/Makefile.am +84 -0
- data/ext/crlibm/Makefile.in +530 -0
- data/ext/crlibm/NEWS +0 -0
- data/ext/crlibm/README +31 -0
- data/ext/crlibm/TODO +47 -0
- data/ext/crlibm/VERSION +1 -0
- data/ext/crlibm/aclocal.m4 +989 -0
- data/ext/crlibm/atan-itanium.c +846 -0
- data/ext/crlibm/atan-pentium.c +261 -0
- data/ext/crlibm/atan_accurate.c +244 -0
- data/ext/crlibm/atan_accurate.h +191 -0
- data/ext/crlibm/atan_fast.c +324 -0
- data/ext/crlibm/atan_fast.h +678 -0
- data/ext/crlibm/config.guess +1461 -0
- data/ext/crlibm/config.sub +1566 -0
- data/ext/crlibm/configure +7517 -0
- data/ext/crlibm/configure.ac +364 -0
- data/ext/crlibm/crlibm.h +125 -0
- data/ext/crlibm/crlibm_config.h +149 -0
- data/ext/crlibm/crlibm_config.h.in +148 -0
- data/ext/crlibm/crlibm_private.c +293 -0
- data/ext/crlibm/crlibm_private.h +658 -0
- data/ext/crlibm/csh_fast.c +631 -0
- data/ext/crlibm/csh_fast.h +771 -0
- data/ext/crlibm/double-extended.h +496 -0
- data/ext/crlibm/exp-td.c +962 -0
- data/ext/crlibm/exp-td.h +685 -0
- data/ext/crlibm/exp_accurate.c +197 -0
- data/ext/crlibm/exp_accurate.h +85 -0
- data/ext/crlibm/gappa/log-de-E0-logir0.gappa +106 -0
- data/ext/crlibm/gappa/log-de-E0.gappa +79 -0
- data/ext/crlibm/gappa/log-de.gappa +81 -0
- data/ext/crlibm/gappa/log-td-E0-logir0.gappa +126 -0
- data/ext/crlibm/gappa/log-td-E0.gappa +143 -0
- data/ext/crlibm/gappa/log-td-accurate-E0-logir0.gappa +230 -0
- data/ext/crlibm/gappa/log-td-accurate-E0.gappa +213 -0
- data/ext/crlibm/gappa/log-td-accurate.gappa +217 -0
- data/ext/crlibm/gappa/log-td.gappa +156 -0
- data/ext/crlibm/gappa/trigoSinCosCase3.gappa +204 -0
- data/ext/crlibm/gappa/trigoTanCase2.gappa +73 -0
- data/ext/crlibm/install-sh +269 -0
- data/ext/crlibm/log-de.c +431 -0
- data/ext/crlibm/log-de.h +732 -0
- data/ext/crlibm/log-td.c +852 -0
- data/ext/crlibm/log-td.h +819 -0
- data/ext/crlibm/log10-td.c +906 -0
- data/ext/crlibm/log10-td.h +823 -0
- data/ext/crlibm/log2-td.c +935 -0
- data/ext/crlibm/log2-td.h +821 -0
- data/ext/crlibm/maple/atan.mpl +359 -0
- data/ext/crlibm/maple/common-procedures.mpl +997 -0
- data/ext/crlibm/maple/csh.mpl +446 -0
- data/ext/crlibm/maple/double-extended.mpl +151 -0
- data/ext/crlibm/maple/exp-td.mpl +195 -0
- data/ext/crlibm/maple/log-de.mpl +243 -0
- data/ext/crlibm/maple/log-td.mpl +316 -0
- data/ext/crlibm/maple/log10-td.mpl +345 -0
- data/ext/crlibm/maple/log2-td.mpl +334 -0
- data/ext/crlibm/maple/trigo.mpl +728 -0
- data/ext/crlibm/maple/triple-double.mpl +58 -0
- data/ext/crlibm/missing +198 -0
- data/ext/crlibm/mkinstalldirs +40 -0
- data/ext/crlibm/rem_pio2_accurate.c +219 -0
- data/ext/crlibm/rem_pio2_accurate.h +53 -0
- data/ext/crlibm/scs_lib/AUTHORS +3 -0
- data/ext/crlibm/scs_lib/COPYING +504 -0
- data/ext/crlibm/scs_lib/ChangeLog +16 -0
- data/ext/crlibm/scs_lib/INSTALL +215 -0
- data/ext/crlibm/scs_lib/Makefile.am +18 -0
- data/ext/crlibm/scs_lib/Makefile.in +328 -0
- data/ext/crlibm/scs_lib/NEWS +0 -0
- data/ext/crlibm/scs_lib/README +9 -0
- data/ext/crlibm/scs_lib/TODO +4 -0
- data/ext/crlibm/scs_lib/addition_scs.c +623 -0
- data/ext/crlibm/scs_lib/config.guess +1461 -0
- data/ext/crlibm/scs_lib/config.sub +1566 -0
- data/ext/crlibm/scs_lib/configure +6226 -0
- data/ext/crlibm/scs_lib/division_scs.c +110 -0
- data/ext/crlibm/scs_lib/double2scs.c +174 -0
- data/ext/crlibm/scs_lib/install-sh +269 -0
- data/ext/crlibm/scs_lib/missing +198 -0
- data/ext/crlibm/scs_lib/mkinstalldirs +40 -0
- data/ext/crlibm/scs_lib/multiplication_scs.c +456 -0
- data/ext/crlibm/scs_lib/poly_fct.c +112 -0
- data/ext/crlibm/scs_lib/print_scs.c +73 -0
- data/ext/crlibm/scs_lib/rand_scs.c +63 -0
- data/ext/crlibm/scs_lib/scs.h +353 -0
- data/ext/crlibm/scs_lib/scs2double.c +391 -0
- data/ext/crlibm/scs_lib/scs2mpf.c +58 -0
- data/ext/crlibm/scs_lib/scs2mpfr.c +61 -0
- data/ext/crlibm/scs_lib/scs_private.c +23 -0
- data/ext/crlibm/scs_lib/scs_private.h +133 -0
- data/ext/crlibm/scs_lib/tests/tbx_timing.h +102 -0
- data/ext/crlibm/scs_lib/wrapper_scs.h +486 -0
- data/ext/crlibm/scs_lib/zero_scs.c +52 -0
- data/ext/crlibm/stamp-h.in +1 -0
- data/ext/crlibm/tests/Makefile.am +43 -0
- data/ext/crlibm/tests/Makefile.in +396 -0
- data/ext/crlibm/tests/blind_test.c +148 -0
- data/ext/crlibm/tests/generate_test_vectors.c +258 -0
- data/ext/crlibm/tests/soak_test.c +334 -0
- data/ext/crlibm/tests/test_common.c +627 -0
- data/ext/crlibm/tests/test_common.h +28 -0
- data/ext/crlibm/tests/test_perf.c +570 -0
- data/ext/crlibm/tests/test_val.c +249 -0
- data/ext/crlibm/trigo_accurate.c +500 -0
- data/ext/crlibm/trigo_accurate.h +331 -0
- data/ext/crlibm/trigo_fast.c +1219 -0
- data/ext/crlibm/trigo_fast.h +639 -0
- data/ext/crlibm/triple-double.h +878 -0
- data/ext/extconf.rb +31 -0
- data/ext/fpu.c +107 -0
- data/ext/jamis-mod.rb +591 -0
- data/lib/fpu.rb +287 -0
- data/lib/interval.rb +1170 -0
- data/lib/intervals.rb +212 -0
- data/lib/struct_float.rb +133 -0
- data/test/data_atan.txt +360 -0
- data/test/data_cos.txt +346 -0
- data/test/data_cosh.txt +3322 -0
- data/test/data_exp.txt +3322 -0
- data/test/data_log.txt +141 -0
- data/test/data_sin.txt +140 -0
- data/test/data_sinh.txt +3322 -0
- data/test/data_tan.txt +342 -0
- metadata +186 -0
@@ -0,0 +1,570 @@
|
|
1
|
+
/*
|
2
|
+
Beware to compile without optimizations
|
3
|
+
|
4
|
+
*/
|
5
|
+
#include <stdio.h>
|
6
|
+
#include <stdlib.h>
|
7
|
+
#include <string.h>
|
8
|
+
#include <stdarg.h>
|
9
|
+
#include <math.h>
|
10
|
+
|
11
|
+
#include "crlibm.h"
|
12
|
+
#include "crlibm_private.h"
|
13
|
+
#include "test_common.h"
|
14
|
+
|
15
|
+
#include "scs_lib/tests/tbx_timing.h"
|
16
|
+
|
17
|
+
#ifdef HAVE_MATHLIB_H
|
18
|
+
#include <MathLib.h>
|
19
|
+
#endif
|
20
|
+
|
21
|
+
#ifdef HAVE_LIBMCR_H
|
22
|
+
#include <libmcr.h>
|
23
|
+
#endif
|
24
|
+
|
25
|
+
#ifdef HAVE_MPFR_H
|
26
|
+
# include <gmp.h>
|
27
|
+
# include <mpfr.h>
|
28
|
+
# ifdef MPFR_VERSION
|
29
|
+
# if MPFR_VERSION < MPFR_VERSION_NUM(2,2,0)
|
30
|
+
# define mpfr_subnormalize(mp_res, inexact, mpfr_rnd_mode)
|
31
|
+
# endif
|
32
|
+
# else
|
33
|
+
# define mpfr_get_version() "<2.1.0"
|
34
|
+
# endif
|
35
|
+
#endif
|
36
|
+
|
37
|
+
|
38
|
+
#define N1 20
|
39
|
+
|
40
|
+
#define TIMING_ITER 200
|
41
|
+
|
42
|
+
#define DETAILED_REPORT 0
|
43
|
+
|
44
|
+
/* If set, the behaviour of the function with respect to cache memory
|
45
|
+
will be tested*/
|
46
|
+
#define TEST_CACHE 0
|
47
|
+
|
48
|
+
/*
|
49
|
+
* Rounding mode to test
|
50
|
+
*/
|
51
|
+
|
52
|
+
|
53
|
+
|
54
|
+
|
55
|
+
#if EVAL_PERF==1
|
56
|
+
/* counter of calls to the second step */
|
57
|
+
extern int crlibm_second_step_taken;
|
58
|
+
int crlibm_first_step_taken;
|
59
|
+
#endif
|
60
|
+
|
61
|
+
#ifdef HAVE_MPFR_H
|
62
|
+
/* The rounding mode for mpfr function */
|
63
|
+
mp_rnd_t mpfr_rnd_mode;
|
64
|
+
#endif
|
65
|
+
|
66
|
+
/* Global variable for time stamping */
|
67
|
+
static unsigned long long tbx_time;
|
68
|
+
|
69
|
+
/* Unused random number generator*/
|
70
|
+
double (*randfun_soaktest) () = NULL;
|
71
|
+
/* The random number generator*/
|
72
|
+
double (*randfun) () = NULL;
|
73
|
+
/* The function we test */
|
74
|
+
double (*testfun_crlibm)() = NULL;
|
75
|
+
/* The function we trust */
|
76
|
+
int (*testfun_mpfr) () = NULL;
|
77
|
+
/* The function to show off against for accuracy */
|
78
|
+
double (*testfun_libm) () = NULL;
|
79
|
+
/* The function to show off against for performance */
|
80
|
+
double (*testfun_libultim) () = NULL;
|
81
|
+
/* The last competitor */
|
82
|
+
double (*testfun_libmcr) () = NULL;
|
83
|
+
|
84
|
+
|
85
|
+
/* TESTSIZE doubles should be enough to flush the cache */
|
86
|
+
#define TESTSIZE 200000
|
87
|
+
|
88
|
+
#if TEST_CACHE
|
89
|
+
static double inputs[TESTSIZE];
|
90
|
+
static double inputs2[TESTSIZE];
|
91
|
+
#endif /* TEST_CACHE */
|
92
|
+
|
93
|
+
|
94
|
+
/* indicate the number of argument taken by the function */
|
95
|
+
static int nbarg;
|
96
|
+
|
97
|
+
|
98
|
+
|
99
|
+
|
100
|
+
|
101
|
+
|
102
|
+
static void usage(char *fct_name){
|
103
|
+
/*fprintf (stderr, "\n%s: Performance test for crlibm and other mathematical libraries\n", fct_name);*/
|
104
|
+
fprintf (stderr, "\nUsage: %s function (RN|RU|RD|RZ) iterations \n", fct_name);
|
105
|
+
fprintf (stderr, " function : name of function to test \n");
|
106
|
+
fprintf (stderr, " (RN|RU|RD|RZ) : rounding mode, \n");
|
107
|
+
fprintf (stderr, " iterations : number of iterations, also seed for the random number generator \n");
|
108
|
+
exit (EXIT_FAILURE);
|
109
|
+
}
|
110
|
+
|
111
|
+
|
112
|
+
#if TEST_CACHE
|
113
|
+
|
114
|
+
static void fill_and_flush(int seed) {
|
115
|
+
int i;
|
116
|
+
srandom(seed);
|
117
|
+
for (i=0; i<TESTSIZE; i++){
|
118
|
+
inputs[i] = randfun();
|
119
|
+
inputs2[i] = randfun();
|
120
|
+
}
|
121
|
+
}
|
122
|
+
|
123
|
+
static void test_with_cache(const char *name, double (*testfun)(), int n){
|
124
|
+
int i, j, k;
|
125
|
+
double i1, i2, rd;
|
126
|
+
tbx_tick_t t1, t2;
|
127
|
+
unsigned long long dt, min_dtsum, dtsum;
|
128
|
+
|
129
|
+
if(testfun!=NULL) { /* test if some functions are missing */
|
130
|
+
printf("\n%s\n",name);
|
131
|
+
for(i=1; i<=10000; i*=10) { /* i=1,10,100...*/
|
132
|
+
min_dtsum=1<<30;
|
133
|
+
for(k=0;k<10;k++) { /* do the whole test 10 times and take the min */
|
134
|
+
fill_and_flush(n);
|
135
|
+
dtsum=0;
|
136
|
+
for (j=0; j<i; j++) {
|
137
|
+
i1 = inputs[i];
|
138
|
+
i2 = inputs2[i];
|
139
|
+
|
140
|
+
if (nbarg==1){
|
141
|
+
TBX_GET_TICK(t1);
|
142
|
+
rd = testfun(i1);
|
143
|
+
TBX_GET_TICK(t2);
|
144
|
+
}else{
|
145
|
+
TBX_GET_TICK(t1);
|
146
|
+
rd = testfun(i1, i2);
|
147
|
+
TBX_GET_TICK(t2);
|
148
|
+
}
|
149
|
+
|
150
|
+
dt = TBX_TICK_RAW_DIFF(t1, t2)-tbx_time;
|
151
|
+
dtsum += dt;
|
152
|
+
}
|
153
|
+
if (dtsum < min_dtsum) min_dtsum=dtsum;
|
154
|
+
}
|
155
|
+
printf(" %d loops: \t avg time = %f ticks\n",i, ((double)min_dtsum)/i);
|
156
|
+
}
|
157
|
+
}
|
158
|
+
}
|
159
|
+
#endif /* TEST_CACHE */
|
160
|
+
|
161
|
+
static void test_without_cache(const char *name,
|
162
|
+
double (*testfun)(),
|
163
|
+
double i1,
|
164
|
+
double i2,
|
165
|
+
unsigned long long *lib_dtmin,
|
166
|
+
unsigned long long *lib_dtmax,
|
167
|
+
unsigned long long *lib_dtsum,
|
168
|
+
int func_type){
|
169
|
+
double result;
|
170
|
+
unsigned long long dt, dtmin;
|
171
|
+
tbx_tick_t t1, t2;
|
172
|
+
int j;
|
173
|
+
#ifdef TIMING_USES_GETTIMEOFDAY
|
174
|
+
int k;
|
175
|
+
#endif
|
176
|
+
#ifdef HAVE_MPFR_H
|
177
|
+
mpfr_t mp_res, mp_inpt;
|
178
|
+
mpfr_t mp_inpt2; /* For the pow function */
|
179
|
+
int inexact;
|
180
|
+
|
181
|
+
mpfr_init2(mp_res, 53);
|
182
|
+
mpfr_init2(mp_inpt, 53);
|
183
|
+
mpfr_init2(mp_inpt2, 53);
|
184
|
+
#endif
|
185
|
+
|
186
|
+
if(testfun!=NULL) { /* test if some functions are missing */
|
187
|
+
dtmin=1<<30;
|
188
|
+
/* take the min of N1 consecutive calls */
|
189
|
+
for(j=0; j<N1; j++) {
|
190
|
+
|
191
|
+
if (func_type == 0){ /* func_type = normal function */
|
192
|
+
if (nbarg==1){
|
193
|
+
TBX_GET_TICK(t1);
|
194
|
+
#ifdef TIMING_USES_GETTIMEOFDAY /* use inaccurate timer, do many loops */
|
195
|
+
for(k=0; k<TIMING_ITER;k++)
|
196
|
+
#endif
|
197
|
+
result = testfun(i1);
|
198
|
+
TBX_GET_TICK(t2);
|
199
|
+
}else{
|
200
|
+
TBX_GET_TICK(t1);
|
201
|
+
#ifdef TIMING_USES_GETTIMEOFDAY /* use inaccurate timer, do many loops */
|
202
|
+
for(k=0; k<TIMING_ITER;k++)
|
203
|
+
#endif
|
204
|
+
result = testfun(i1,i2);
|
205
|
+
TBX_GET_TICK(t2);
|
206
|
+
}
|
207
|
+
}else{ /* func_type = MPFR function */
|
208
|
+
#ifdef HAVE_MPFR_H
|
209
|
+
if (nbarg==1){
|
210
|
+
TBX_GET_TICK(t1);
|
211
|
+
#ifdef TIMING_USES_GETTIMEOFDAY /* use inaccurate timer, do many loops */
|
212
|
+
for(k=0; k<TIMING_ITER;k++){
|
213
|
+
#endif
|
214
|
+
mpfr_set_d(mp_inpt, i1, GMP_RNDN);
|
215
|
+
inexact = testfun(mp_res, mp_inpt, mpfr_rnd_mode);
|
216
|
+
mpfr_subnormalize (mp_res, inexact, mpfr_rnd_mode);
|
217
|
+
result = mpfr_get_d(mp_res, GMP_RNDN);
|
218
|
+
#ifdef TIMING_USES_GETTIMEOFDAY /* use inaccurate timer, do many loops */
|
219
|
+
}
|
220
|
+
#endif
|
221
|
+
TBX_GET_TICK(t2);
|
222
|
+
}else{
|
223
|
+
TBX_GET_TICK(t1);
|
224
|
+
#ifdef TIMING_USES_GETTIMEOFDAY /* use inaccurate timer, do many loops */
|
225
|
+
for(k=0; k<TIMING_ITER;k++){
|
226
|
+
#endif
|
227
|
+
mpfr_set_d(mp_inpt, i1, GMP_RNDN);
|
228
|
+
mpfr_set_d(mp_inpt2, i2, GMP_RNDN);
|
229
|
+
inexact = testfun(mp_res, mp_inpt, mp_inpt2, mpfr_rnd_mode);
|
230
|
+
mpfr_subnormalize (mp_res, inexact, mpfr_rnd_mode);
|
231
|
+
result = mpfr_get_d(mp_res, GMP_RNDN);
|
232
|
+
#ifdef TIMING_USES_GETTIMEOFDAY /* use inaccurate timer, do many loops */
|
233
|
+
}
|
234
|
+
#endif
|
235
|
+
TBX_GET_TICK(t2);
|
236
|
+
}
|
237
|
+
#endif /*HAVE_MPFR_H*/
|
238
|
+
}
|
239
|
+
|
240
|
+
dt = TBX_TICK_RAW_DIFF(t1, t2)-tbx_time;
|
241
|
+
if (dt<dtmin) dtmin=dt;
|
242
|
+
}
|
243
|
+
*lib_dtsum+=dtmin;
|
244
|
+
if (dtmin<*lib_dtmin) *lib_dtmin=dtmin;
|
245
|
+
if (dtmin>*lib_dtmax) *lib_dtmax=dtmin;
|
246
|
+
#if DETAILED_REPORT
|
247
|
+
printf("\n input=%1.15e\tT%s=%lld", i1, name, dtmin);
|
248
|
+
#endif /*DETAILED_REPORT*/
|
249
|
+
}
|
250
|
+
|
251
|
+
/* release memory */
|
252
|
+
#ifdef HAVE_MPFR_H
|
253
|
+
mpfr_clear(mp_inpt2);
|
254
|
+
mpfr_clear(mp_inpt);
|
255
|
+
mpfr_clear(mp_res);
|
256
|
+
#endif /*HAVE_MPFR_H*/
|
257
|
+
|
258
|
+
}
|
259
|
+
|
260
|
+
|
261
|
+
|
262
|
+
|
263
|
+
static void test_worst_case(double (*testfun)(),
|
264
|
+
double i1,
|
265
|
+
double i2,
|
266
|
+
unsigned long long *lib_dtwc,
|
267
|
+
int func_type){
|
268
|
+
|
269
|
+
|
270
|
+
double res;
|
271
|
+
tbx_tick_t t1, t2;
|
272
|
+
unsigned long long dtmin, dt;
|
273
|
+
int j;
|
274
|
+
#ifdef TIMING_USES_GETTIMEOFDAY
|
275
|
+
int k;
|
276
|
+
#endif
|
277
|
+
#ifdef HAVE_MPFR_H
|
278
|
+
mpfr_t mp_res, mp_inpt;
|
279
|
+
mpfr_t mp_inpt2; /* For the pow function */
|
280
|
+
int inexact;
|
281
|
+
|
282
|
+
mpfr_init2(mp_res, 53);
|
283
|
+
mpfr_init2(mp_inpt, 53);
|
284
|
+
mpfr_init2(mp_inpt2, 53);
|
285
|
+
#endif
|
286
|
+
|
287
|
+
if(testfun!=NULL) { /* test if some functions are missing */
|
288
|
+
dtmin=1<<30;
|
289
|
+
for(j=0; j<N1; j++) {
|
290
|
+
if (func_type == 0){ /* func_type = normal function */
|
291
|
+
if (nbarg==1){
|
292
|
+
TBX_GET_TICK(t1);
|
293
|
+
#ifdef TIMING_USES_GETTIMEOFDAY
|
294
|
+
for(k=0; k<TIMING_ITER;k++)
|
295
|
+
#endif
|
296
|
+
res = testfun(i1);
|
297
|
+
TBX_GET_TICK(t2);
|
298
|
+
}else{
|
299
|
+
TBX_GET_TICK(t1);
|
300
|
+
#ifdef TIMING_USES_GETTIMEOFDAY
|
301
|
+
for(k=0; k<TIMING_ITER;k++)
|
302
|
+
#endif
|
303
|
+
res = testfun(i1,i2);
|
304
|
+
TBX_GET_TICK(t2);
|
305
|
+
}
|
306
|
+
}else{ /* func_type = MPFR function */
|
307
|
+
#ifdef HAVE_MPFR_H
|
308
|
+
if (nbarg==1){
|
309
|
+
TBX_GET_TICK(t1);
|
310
|
+
#ifdef TIMING_USES_GETTIMEOFDAY
|
311
|
+
for(k=0; k<TIMING_ITER;k++){
|
312
|
+
#endif
|
313
|
+
mpfr_set_d (mp_inpt, i1, GMP_RNDN);
|
314
|
+
inexact = testfun (mp_res, mp_inpt, mpfr_rnd_mode);
|
315
|
+
mpfr_subnormalize (mp_res, inexact, mpfr_rnd_mode);
|
316
|
+
res = mpfr_get_d (mp_res, GMP_RNDN);
|
317
|
+
#ifdef TIMING_USES_GETTIMEOFDAY
|
318
|
+
}
|
319
|
+
#endif
|
320
|
+
TBX_GET_TICK(t2);
|
321
|
+
}else{
|
322
|
+
TBX_GET_TICK(t1);
|
323
|
+
#ifdef TIMING_USES_GETTIMEOFDAY
|
324
|
+
for(k=0; k<TIMING_ITER;k++){
|
325
|
+
#endif
|
326
|
+
mpfr_set_d (mp_inpt, i1, GMP_RNDN);
|
327
|
+
mpfr_set_d (mp_inpt2, i2, GMP_RNDN);
|
328
|
+
inexact = testfun (mp_res, mp_inpt, mp_inpt2, mpfr_rnd_mode);
|
329
|
+
mpfr_subnormalize (mp_res, inexact, mpfr_rnd_mode);
|
330
|
+
res = mpfr_get_d (mp_res, GMP_RNDN);
|
331
|
+
#ifdef TIMING_USES_GETTIMEOFDAY
|
332
|
+
}
|
333
|
+
#endif
|
334
|
+
TBX_GET_TICK(t2);
|
335
|
+
}
|
336
|
+
#endif /*HAVE_MPFR_H*/
|
337
|
+
}
|
338
|
+
dt = TBX_TICK_RAW_DIFF(t1, t2)-tbx_time;
|
339
|
+
if (dt<dtmin) dtmin=dt;
|
340
|
+
}
|
341
|
+
*lib_dtwc = dtmin;
|
342
|
+
}
|
343
|
+
|
344
|
+
/* release memory */
|
345
|
+
#ifdef HAVE_MPFR_H
|
346
|
+
mpfr_clear(mp_inpt2);
|
347
|
+
mpfr_clear(mp_inpt);
|
348
|
+
mpfr_clear(mp_res);
|
349
|
+
#endif /*HAVE_MPFR_H*/
|
350
|
+
}
|
351
|
+
|
352
|
+
|
353
|
+
|
354
|
+
static void normal_output(const char *name,
|
355
|
+
double (*testfun)(),
|
356
|
+
unsigned long long lib_dtmin,
|
357
|
+
unsigned long long lib_dtmax,
|
358
|
+
unsigned long long lib_dtsum,
|
359
|
+
unsigned long long lib_dtwc,
|
360
|
+
int n){
|
361
|
+
if(testfun!=NULL) { /* some functions are missing in libultim (cosh, ... */
|
362
|
+
printf("\n%s\nTmin = %lld ticks,\t Tmax = %lld ticks\t avg = %f\tT worst case = %lld\n",
|
363
|
+
name, lib_dtmin, lib_dtmax, ((double)lib_dtsum) / ((double) n), lib_dtwc);
|
364
|
+
}
|
365
|
+
}
|
366
|
+
|
367
|
+
static void latex_output(const char *name,
|
368
|
+
double (*testfun)(),
|
369
|
+
unsigned long long lib_dtmin,
|
370
|
+
unsigned long long lib_dtmax,
|
371
|
+
unsigned long long lib_dtsum,
|
372
|
+
unsigned long long lib_dtwc,
|
373
|
+
int n){
|
374
|
+
if(testfun!=NULL) { /* some functions are missing in libultim (cosh, ... */
|
375
|
+
if (lib_dtwc > lib_dtmax) lib_dtmax=lib_dtwc;
|
376
|
+
printf(" %s \t& %lld \t& %10.0f \t& %lld \\\\ \n \\hline\n",
|
377
|
+
name, lib_dtmin, ((double)lib_dtsum) / ((double) n), lib_dtmax);
|
378
|
+
}
|
379
|
+
}
|
380
|
+
|
381
|
+
|
382
|
+
|
383
|
+
int main (int argc, char *argv[]){
|
384
|
+
int i, j, n;
|
385
|
+
double i1, i2;
|
386
|
+
char* rounding_mode;
|
387
|
+
char* function_name;
|
388
|
+
double worstcase;
|
389
|
+
tbx_tick_t t1, t2;
|
390
|
+
unsigned long long
|
391
|
+
dt,
|
392
|
+
libm_dtmin, libm_dtmax, libm_dtsum, libm_dtwc,
|
393
|
+
crlibm_dtmin, crlibm_dtmax, crlibm_dtsum, crlibm_dtwc,
|
394
|
+
mpfr_dtmin, mpfr_dtmax, mpfr_dtsum, mpfr_dtwc,
|
395
|
+
libultim_dtmin, libultim_dtmax, libultim_dtsum, libultim_dtwc,
|
396
|
+
libmcr_dtmin, libmcr_dtmax, libmcr_dtsum, libmcr_dtwc;
|
397
|
+
#ifdef HAVE_MATHLIB_H
|
398
|
+
short Original_Mode;
|
399
|
+
#endif
|
400
|
+
|
401
|
+
|
402
|
+
if ((argc !=4)) usage(argv[0]);
|
403
|
+
|
404
|
+
function_name = argv[1];
|
405
|
+
rounding_mode = argv[2];
|
406
|
+
sscanf(argv[3],"%d", &n);
|
407
|
+
|
408
|
+
|
409
|
+
#ifdef HAVE_MPFR_H
|
410
|
+
if (strcmp(rounding_mode,"RU")==0) mpfr_rnd_mode = GMP_RNDU;
|
411
|
+
else if (strcmp(rounding_mode,"RD")==0) mpfr_rnd_mode = GMP_RNDD;
|
412
|
+
else if (strcmp(rounding_mode,"RZ")==0) mpfr_rnd_mode = GMP_RNDZ;
|
413
|
+
else {
|
414
|
+
mpfr_rnd_mode = GMP_RNDN;
|
415
|
+
rounding_mode="RN" ;
|
416
|
+
}
|
417
|
+
#endif
|
418
|
+
|
419
|
+
if (strcmp(function_name,"pow")==0) nbarg=2;
|
420
|
+
else nbarg=1;
|
421
|
+
|
422
|
+
crlibm_init();
|
423
|
+
|
424
|
+
test_init(/* pointers to returned value */
|
425
|
+
&randfun,
|
426
|
+
&randfun_soaktest, /* unused here */
|
427
|
+
&testfun_crlibm,
|
428
|
+
&testfun_mpfr,
|
429
|
+
&testfun_libultim,
|
430
|
+
&testfun_libmcr,
|
431
|
+
&testfun_libm,
|
432
|
+
&worstcase,
|
433
|
+
/* arguments */
|
434
|
+
function_name,
|
435
|
+
rounding_mode ) ;
|
436
|
+
|
437
|
+
|
438
|
+
|
439
|
+
crlibm_dtmin=1<<30; crlibm_dtmax=0; crlibm_dtsum=0; crlibm_dtwc=0;
|
440
|
+
libm_dtmin=1<<30; libm_dtmax=0; libm_dtsum=0; libm_dtwc=0;
|
441
|
+
libultim_dtmin=1<<30; libultim_dtmax=0; libultim_dtsum=0; libultim_dtwc=0;
|
442
|
+
libmcr_dtmin=1<<30; libmcr_dtmax=0; libmcr_dtsum=0; libmcr_dtwc=0;
|
443
|
+
mpfr_dtmin=1<<30; mpfr_dtmax=0; mpfr_dtsum=0; mpfr_dtwc=0;
|
444
|
+
|
445
|
+
|
446
|
+
/* take the min of N1 consecutive calls */
|
447
|
+
tbx_time=1<<30;
|
448
|
+
for(j=0; j<1000*N1; j++) {
|
449
|
+
TBX_GET_TICK(t1);
|
450
|
+
TBX_GET_TICK(t2);
|
451
|
+
dt = TBX_TICK_RAW_DIFF(t1, t2);
|
452
|
+
if(dt<tbx_time) tbx_time = dt;
|
453
|
+
}
|
454
|
+
#if HAVE_MPFR_H
|
455
|
+
printf ("GMP version %s MPFR version %s ",
|
456
|
+
gmp_version, mpfr_get_version ());
|
457
|
+
#endif
|
458
|
+
printf("tbx_time=%llu\n", tbx_time);
|
459
|
+
|
460
|
+
#if TEST_CACHE
|
461
|
+
/************ TESTS WITH CACHES *********************/
|
462
|
+
/* First tests in real conditions, where cache considerations
|
463
|
+
matter */
|
464
|
+
|
465
|
+
/* libm */
|
466
|
+
printf("TEST WITH CACHE CONSIDERATION \n");
|
467
|
+
test_with_cache("LIBM", testfun_libm, n);
|
468
|
+
test_with_cache("CRLIBM", testfun_crlibm, n);
|
469
|
+
#ifdef HAVE_MATHLIB_H
|
470
|
+
Original_Mode = Init_Lib();
|
471
|
+
test_with_cache("IBM", testfun_libultim, n);
|
472
|
+
Exit_Lib(Original_Mode);
|
473
|
+
#endif
|
474
|
+
#ifdef HAVE_LIBMCR_H
|
475
|
+
test_with_cache("SUN", testfun_libmcr, n);
|
476
|
+
#endif
|
477
|
+
|
478
|
+
#endif /* TEST_CACHE*/
|
479
|
+
|
480
|
+
/************ TESTS WITHOUT CACHES *******************/
|
481
|
+
srandom(n);
|
482
|
+
#if EVAL_PERF==1
|
483
|
+
crlibm_second_step_taken=0;
|
484
|
+
#endif
|
485
|
+
|
486
|
+
/* take the min of N1 identical calls to leverage interruptions */
|
487
|
+
/* As a consequence, the cache impact of these calls disappear...*/
|
488
|
+
for(i=0; i< n; i++){
|
489
|
+
i1 = randfun();
|
490
|
+
i2 = randfun();
|
491
|
+
|
492
|
+
test_without_cache("libm", testfun_libm, i1, i2, &libm_dtmin, &libm_dtmax, &libm_dtsum, 0);
|
493
|
+
test_without_cache("crlibm", testfun_crlibm, i1, i2, &crlibm_dtmin, &crlibm_dtmax, &crlibm_dtsum, 0);
|
494
|
+
#ifdef HAVE_MATHLIB_H
|
495
|
+
Original_Mode = Init_Lib();
|
496
|
+
test_without_cache("ultim", testfun_libultim, i1, i2, &libultim_dtmin, &libultim_dtmax, &libultim_dtsum, 0);
|
497
|
+
Exit_Lib(Original_Mode);
|
498
|
+
#endif /*HAVE_MATHLIB_H*/
|
499
|
+
#ifdef HAVE_LIBMCR_H
|
500
|
+
test_without_cache("libmcr", testfun_libmcr, i1, i2, &libmcr_dtmin, &libmcr_dtmax, &libmcr_dtsum, 0);
|
501
|
+
#endif /*HAVE_LIBMCR_H*/
|
502
|
+
#ifdef HAVE_MPFR_H
|
503
|
+
test_without_cache("mpfr", (double(*)()) testfun_mpfr, i1, i2, &mpfr_dtmin, &mpfr_dtmax, &mpfr_dtsum, 1);
|
504
|
+
#endif /*HAVE_MPFR_H*/
|
505
|
+
}
|
506
|
+
|
507
|
+
#if EVAL_PERF==1
|
508
|
+
#ifdef TIMING_USES_GETTIMEOFDAY /* use inaccurate timer, do many loops */
|
509
|
+
printf("\nCRLIBM : Second step taken %d times out of %d\n",
|
510
|
+
crlibm_second_step_taken/(N1 * TIMING_ITER), n );
|
511
|
+
#else
|
512
|
+
printf("\nCRLIBM : Second step taken %d times out of %d\n",
|
513
|
+
crlibm_second_step_taken/N1, n );
|
514
|
+
#endif
|
515
|
+
|
516
|
+
#endif
|
517
|
+
|
518
|
+
|
519
|
+
/************ WORST CASE TESTS *********************/
|
520
|
+
/* worst case test */
|
521
|
+
i1 = worstcase;
|
522
|
+
i2 = 0 ; /* TODO when we have worst cases for power...*/
|
523
|
+
|
524
|
+
test_worst_case(testfun_libm, i1, i2, &libm_dtwc, 0);
|
525
|
+
test_worst_case(testfun_crlibm, i1, i2, &crlibm_dtwc, 0);
|
526
|
+
#ifdef HAVE_MPFR_H
|
527
|
+
test_worst_case((double(*)())testfun_mpfr, i1, i2, &mpfr_dtwc, 1);
|
528
|
+
#endif /*HAVE_MPFR_H*/
|
529
|
+
#ifdef HAVE_MATHLIB_H
|
530
|
+
Original_Mode = Init_Lib();
|
531
|
+
test_worst_case(testfun_libultim, i1, i2, &libultim_dtwc, 0);
|
532
|
+
Exit_Lib(Original_Mode);
|
533
|
+
#endif /*HAVE_MATHLIB_H*/
|
534
|
+
#ifdef HAVE_LIBMCR_H
|
535
|
+
test_worst_case(testfun_libmcr, i1, i2, &libmcr_dtwc, 0);
|
536
|
+
#endif /*HAVE_LIBMCR_H*/
|
537
|
+
|
538
|
+
/*************Normal output*************************/
|
539
|
+
normal_output("LIBM", testfun_libm, libm_dtmin, libm_dtmax, libm_dtsum, libm_dtwc, n);
|
540
|
+
#ifdef HAVE_MPFR_H
|
541
|
+
normal_output("MPFR", (double(*)())testfun_mpfr, mpfr_dtmin, mpfr_dtmax, mpfr_dtsum, mpfr_dtwc, n);
|
542
|
+
#endif /*HAVE_MPFR_H*/
|
543
|
+
#ifdef HAVE_MATHLIB_H
|
544
|
+
normal_output("IBM", testfun_libultim, libultim_dtmin, libultim_dtmax, libultim_dtsum, libultim_dtwc, n);
|
545
|
+
#endif /*HAVE_MATHLIB_H*/
|
546
|
+
#ifdef HAVE_LIBMCR_H
|
547
|
+
normal_output("SUN", testfun_libmcr, libmcr_dtmin, libmcr_dtmax, libmcr_dtsum, libmcr_dtwc, n);
|
548
|
+
#endif /*HAVE_LIBMCR_H*/
|
549
|
+
normal_output("CRLIBM", testfun_crlibm, crlibm_dtmin, crlibm_dtmax, crlibm_dtsum, crlibm_dtwc, n);
|
550
|
+
|
551
|
+
|
552
|
+
/******************* Latex output ****************/
|
553
|
+
printf("\\multicolumn{4}{|c|}{Processor / system / compiler} \\\\ \n \\hline");
|
554
|
+
printf("\n & min time \t & avg time \t& max time \t \\\\ \n \\hline\n");
|
555
|
+
latex_output("default \\texttt{libm} ", testfun_libm, libm_dtmin, libm_dtmax, libm_dtsum, libm_dtwc, n);
|
556
|
+
#ifdef HAVE_MPFR_H
|
557
|
+
latex_output("MPFR ", (double(*)())testfun_mpfr, mpfr_dtmin, mpfr_dtmax, mpfr_dtsum, mpfr_dtwc, n);
|
558
|
+
#endif /*HAVE_MPFR_H*/
|
559
|
+
#ifdef HAVE_MATHLIB_H
|
560
|
+
latex_output("IBM's \\texttt{libultim}", testfun_libultim, libultim_dtmin, libultim_dtmax, libultim_dtsum, libultim_dtwc, n);
|
561
|
+
#endif /*HAVE_MATHLIB_H*/
|
562
|
+
#ifdef HAVE_LIBMCR_H
|
563
|
+
latex_output("Sun's \\texttt{libmcr} ", testfun_libmcr, libmcr_dtmin, libmcr_dtmax, libmcr_dtsum, libmcr_dtwc, n);
|
564
|
+
#endif /*HAVE_LIBMCR_H*/
|
565
|
+
latex_output("\\texttt{crlibm} ", testfun_crlibm, crlibm_dtmin, crlibm_dtmax, crlibm_dtsum, crlibm_dtwc, n);
|
566
|
+
|
567
|
+
return 0;
|
568
|
+
}
|
569
|
+
|
570
|
+
|