Blame misc/scalartest.c

Packit 47f805
#include <stdio.h>
Packit 47f805
#include <math.h>
Packit 47f805
#include <asm/msr.h>
Packit 47f805
#include "resample.h"
Packit 47f805
Packit 47f805
#define CLK    300.e6
Packit 47f805
#define LOOPS  20000
Packit 47f805
Packit 47f805
Packit 47f805
typedef double ( *ddf ) ( double );
Packit 47f805
Packit 47f805
Packit 47f805
float a1 [256];
Packit 47f805
float a2 [256];
Packit 47f805
Packit 47f805
void init ( void )
Packit 47f805
{
Packit 47f805
    int  i;
Packit 47f805
    
Packit 47f805
    for ( i = 0; i < sizeof(a1)/sizeof(*a1); i++ ) {
Packit 47f805
        a1 [i] = sin(i)+0.2*sin(1.8*i)+log(2+i);
Packit 47f805
	a2 [i] = cos(0.1*i);
Packit 47f805
    }
Packit 47f805
}
Packit 47f805
Packit 47f805
void test ( int no, scalar_t f )
Packit 47f805
{
Packit 47f805
    unsigned long long  t1;
Packit 47f805
    unsigned long long  t2;
Packit 47f805
    unsigned long long  t3;
Packit 47f805
    unsigned long long  t4;
Packit 47f805
    int                 l;
Packit 47f805
    double              last = 0;
Packit 47f805
    double              curr = 0;
Packit 47f805
    
Packit 47f805
    printf ( "[%3u] %22.14f\t\t", no, (double)f (a1,a2) );
Packit 47f805
    fflush ( stdout );
Packit 47f805
Packit 47f805
    do {
Packit 47f805
    rdtscll (t1);
Packit 47f805
    l = LOOPS;
Packit 47f805
    do
Packit 47f805
        ;
Packit 47f805
    while (--l);
Packit 47f805
    rdtscll (t2);
Packit 47f805
    rdtscll (t3);
Packit 47f805
    l = LOOPS;
Packit 47f805
    do
Packit 47f805
        f(a1,a2), f(a1,a2), f(a1,a2), f(a1,a2);
Packit 47f805
    while (--l);
Packit 47f805
    rdtscll (t4);
Packit 47f805
    last = curr;
Packit 47f805
    curr = (t4-t3-t2+t1) / CLK / LOOPS / 4 * 1.e9;
Packit 47f805
    } while ( fabs(curr-last) > 1.e-4 * (curr+last) );
Packit 47f805
    printf ("%8.2f ns\n", (curr+last) / 2 );
Packit 47f805
}
Packit 47f805
Packit 47f805
void testn ( scalarn_t f )
Packit 47f805
{
Packit 47f805
    unsigned long long  t1;
Packit 47f805
    unsigned long long  t2;
Packit 47f805
    unsigned long long  t3;
Packit 47f805
    unsigned long long  t4;
Packit 47f805
    int                 l;
Packit 47f805
    int                 i;
Packit 47f805
    double              last = 0;
Packit 47f805
    double              curr = 0;
Packit 47f805
    
Packit 47f805
    for ( i = 1; i <= 64; i += i<6 ? 1 : i<8 ? 2 : i ) {
Packit 47f805
        printf ( "[%3u] %22.14f\t\t", 4*i, (double)f (a1,a2,i) );
Packit 47f805
        fflush ( stdout );
Packit 47f805
Packit 47f805
    do {
Packit 47f805
        rdtscll (t1);
Packit 47f805
        l = LOOPS;
Packit 47f805
        do
Packit 47f805
            ;
Packit 47f805
        while (--l);
Packit 47f805
        rdtscll (t2);
Packit 47f805
        rdtscll (t3);
Packit 47f805
        l = LOOPS;
Packit 47f805
        do
Packit 47f805
            f(a1,a2,i), f(a1,a2,i), f(a1,a2,i), f(a1,a2,i);
Packit 47f805
        while (--l);
Packit 47f805
        rdtscll (t4);
Packit 47f805
    last = curr;
Packit 47f805
    curr = (t4-t3-t2+t1) / CLK / LOOPS / 4 * 1.e9;
Packit 47f805
    } while ( fabs(curr-last) > 1.e-4 * (curr+last) );
Packit 47f805
    printf ("%8.2f ns\n", (curr+last) / 2 );
Packit 47f805
    }
Packit 47f805
}
Packit 47f805
Packit 47f805
void test2 ( const char* name, ddf f )
Packit 47f805
{
Packit 47f805
    int     i;
Packit 47f805
    double  x;
Packit 47f805
    
Packit 47f805
    printf ( "\n%%%% %s\n\n", name );
Packit 47f805
    
Packit 47f805
    for ( i = -1000; i <= 1000; i++ ) {
Packit 47f805
        x = 1.e-3 * i;
Packit 47f805
	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 );
Packit 47f805
    }
Packit 47f805
    printf ( "%%%%\n" );
Packit 47f805
    fflush ( stdout );
Packit 47f805
}
Packit 47f805
Packit 47f805
Packit 47f805
int main ( int argc, char** argv )
Packit 47f805
{
Packit 47f805
Packit 47f805
#if 0
Packit 47f805
Packit 47f805
    test2 ( "Hann", hanning   );
Packit 47f805
    test2 ( "Hamm", hamming   );
Packit 47f805
    test2 ( "BM", blackman  );
Packit 47f805
    test2 ( "BM1",blackman1 );
Packit 47f805
    test2 ( "BM2",blackman2 );
Packit 47f805
    test2 ( "BMH N",blackmanharris_nuttall );
Packit 47f805
    test2 ( "MNH Min",blackmanharris_min4    );
Packit 47f805
Packit 47f805
#else
Packit 47f805
Packit 47f805
    init ();
Packit 47f805
Packit 47f805
    test ( 4, scalar04_float32       );
Packit 47f805
    test ( 4, scalar04_float32_i387  );
Packit 47f805
    test ( 4, scalar04_float32_3DNow );
Packit 47f805
    test ( 4, scalar04_float32_SIMD  );
Packit 47f805
Packit 47f805
    test ( 8, scalar08_float32       );
Packit 47f805
    test ( 8, scalar08_float32_i387  );
Packit 47f805
    test ( 8, scalar08_float32_3DNow );
Packit 47f805
    test ( 8, scalar08_float32_SIMD  );
Packit 47f805
Packit 47f805
    test ( 12, scalar12_float32       );
Packit 47f805
    test ( 12, scalar12_float32_i387  );
Packit 47f805
    test ( 12, scalar12_float32_3DNow );
Packit 47f805
    test ( 12, scalar12_float32_SIMD  );
Packit 47f805
Packit 47f805
    test ( 16, scalar16_float32       );
Packit 47f805
    test ( 16, scalar16_float32_i387  );
Packit 47f805
    test ( 16, scalar16_float32_3DNow );
Packit 47f805
    test ( 16, scalar16_float32_SIMD  );
Packit 47f805
Packit 47f805
    test ( 20, scalar20_float32       );
Packit 47f805
    test ( 20, scalar20_float32_i387  );
Packit 47f805
    test ( 20, scalar20_float32_3DNow );
Packit 47f805
    test ( 20, scalar20_float32_SIMD  );
Packit 47f805
Packit 47f805
    test ( 24, scalar24_float32       );
Packit 47f805
    test ( 24, scalar24_float32_i387  );
Packit 47f805
    test ( 24, scalar24_float32_3DNow );
Packit 47f805
    test ( 24, scalar24_float32_SIMD  );
Packit 47f805
Packit 47f805
    testn( scalar4n_float32       );
Packit 47f805
    testn( scalar4n_float32_i387  );
Packit 47f805
    testn( scalar4n_float32_3DNow );
Packit 47f805
    testn( scalar4n_float32_SIMD  );
Packit 47f805
Packit 47f805
#endif    
Packit 47f805
    
Packit 47f805
    return 0;
Packit 47f805
}
Packit 47f805
Packit 47f805
/* end of scalartest.c */