aboutsummaryrefslogtreecommitdiff
path: root/misc/scalartest.c
diff options
context:
space:
mode:
Diffstat (limited to 'misc/scalartest.c')
-rw-r--r--misc/scalartest.c166
1 files changed, 166 insertions, 0 deletions
diff --git a/misc/scalartest.c b/misc/scalartest.c
new file mode 100644
index 0000000..01680d0
--- /dev/null
+++ b/misc/scalartest.c
@@ -0,0 +1,166 @@
+#include <stdio.h>
+#include <math.h>
+#include <asm/msr.h>
+#include "resample.h"
+
+#define CLK 300.e6
+#define LOOPS 20000
+
+
+typedef double ( *ddf ) ( double );
+
+
+float a1 [256];
+float a2 [256];
+
+void init ( void )
+{
+ int i;
+
+ for ( i = 0; i < sizeof(a1)/sizeof(*a1); i++ ) {
+ a1 [i] = sin(i)+0.2*sin(1.8*i)+log(2+i);
+ a2 [i] = cos(0.1*i);
+ }
+}
+
+void test ( int no, scalar_t f )
+{
+ unsigned long long t1;
+ unsigned long long t2;
+ unsigned long long t3;
+ unsigned long long t4;
+ int l;
+ double last = 0;
+ double curr = 0;
+
+ printf ( "[%3u] %22.14f\t\t", no, (double)f (a1,a2) );
+ fflush ( stdout );
+
+ do {
+ rdtscll (t1);
+ l = LOOPS;
+ do
+ ;
+ while (--l);
+ rdtscll (t2);
+ rdtscll (t3);
+ l = LOOPS;
+ do
+ f(a1,a2), f(a1,a2), f(a1,a2), f(a1,a2);
+ while (--l);
+ rdtscll (t4);
+ last = curr;
+ curr = (t4-t3-t2+t1) / CLK / LOOPS / 4 * 1.e9;
+ } while ( fabs(curr-last) > 1.e-4 * (curr+last) );
+ printf ("%8.2f ns\n", (curr+last) / 2 );
+}
+
+void testn ( scalarn_t f )
+{
+ unsigned long long t1;
+ unsigned long long t2;
+ unsigned long long t3;
+ unsigned long long t4;
+ int l;
+ int i;
+ double last = 0;
+ double curr = 0;
+
+ for ( i = 1; i <= 64; i += i<6 ? 1 : i<8 ? 2 : i ) {
+ printf ( "[%3u] %22.14f\t\t", 4*i, (double)f (a1,a2,i) );
+ fflush ( stdout );
+
+ do {
+ rdtscll (t1);
+ l = LOOPS;
+ do
+ ;
+ while (--l);
+ rdtscll (t2);
+ rdtscll (t3);
+ l = LOOPS;
+ do
+ f(a1,a2,i), f(a1,a2,i), f(a1,a2,i), f(a1,a2,i);
+ while (--l);
+ rdtscll (t4);
+ last = curr;
+ curr = (t4-t3-t2+t1) / CLK / LOOPS / 4 * 1.e9;
+ } while ( fabs(curr-last) > 1.e-4 * (curr+last) );
+ printf ("%8.2f ns\n", (curr+last) / 2 );
+ }
+}
+
+void test2 ( const char* name, ddf f )
+{
+ int i;
+ double x;
+
+ printf ( "\n%%%% %s\n\n", name );
+
+ for ( i = -1000; i <= 1000; i++ ) {
+ x = 1.e-3 * i;
+ printf ( "%5d\t%12.8f\t%12.8f\t%12.8f\n", i, f(x), (f(x+5.e-5) - f(x-5.e-5))*1.e+4, (f(x+1.e-4) + f(x-1.e-4) - 2*f(x))*5.e+7 );
+ }
+ printf ( "%%%%\n" );
+ fflush ( stdout );
+}
+
+
+int main ( int argc, char** argv )
+{
+
+#if 0
+
+ test2 ( "Hann", hanning );
+ test2 ( "Hamm", hamming );
+ test2 ( "BM", blackman );
+ test2 ( "BM1",blackman1 );
+ test2 ( "BM2",blackman2 );
+ test2 ( "BMH N",blackmanharris_nuttall );
+ test2 ( "MNH Min",blackmanharris_min4 );
+
+#else
+
+ init ();
+
+ test ( 4, scalar04_float32 );
+ test ( 4, scalar04_float32_i387 );
+ test ( 4, scalar04_float32_3DNow );
+ test ( 4, scalar04_float32_SIMD );
+
+ test ( 8, scalar08_float32 );
+ test ( 8, scalar08_float32_i387 );
+ test ( 8, scalar08_float32_3DNow );
+ test ( 8, scalar08_float32_SIMD );
+
+ test ( 12, scalar12_float32 );
+ test ( 12, scalar12_float32_i387 );
+ test ( 12, scalar12_float32_3DNow );
+ test ( 12, scalar12_float32_SIMD );
+
+ test ( 16, scalar16_float32 );
+ test ( 16, scalar16_float32_i387 );
+ test ( 16, scalar16_float32_3DNow );
+ test ( 16, scalar16_float32_SIMD );
+
+ test ( 20, scalar20_float32 );
+ test ( 20, scalar20_float32_i387 );
+ test ( 20, scalar20_float32_3DNow );
+ test ( 20, scalar20_float32_SIMD );
+
+ test ( 24, scalar24_float32 );
+ test ( 24, scalar24_float32_i387 );
+ test ( 24, scalar24_float32_3DNow );
+ test ( 24, scalar24_float32_SIMD );
+
+ testn( scalar4n_float32 );
+ testn( scalar4n_float32_i387 );
+ testn( scalar4n_float32_3DNow );
+ testn( scalar4n_float32_SIMD );
+
+#endif
+
+ return 0;
+}
+
+/* end of scalartest.c */