1 /* Test dot-product function */
2 
3 #include <stdio.h>
4 #include <stdlib.h>
5 #include <memory.h>
6 #include <math.h>
7 #include "config.h"
8 #ifdef HAVE_GETOPT_H
9 #include <getopt.h>
10 #endif
11 #include "fec.h"
12 
13 #if HAVE_GETOPT_LONG
14 struct option Options[] = {
15   {"force-altivec",0,NULL,'a'},
16   {"force-port",0,NULL,'p'},
17   {"force-mmx",0,NULL,'m'},
18   {"force-sse",0,NULL,'s'},
19   {"force-sse2",0,NULL,'t'},
20   {"trials",0,NULL,'n'},
21   {NULL},
22 };
23 #endif
24 
main(int argc,char * argv[])25 int main(int argc,char *argv[]){
26   short coeffs[512];
27   short input[2048];
28   int trials=1000,d;
29   int errors = 0;
30 
31 #if HAVE_GETOPT_LONG
32   while((d = getopt_long(argc,argv,"apmstn:",Options,NULL)) != EOF){
33 #else
34   while((d = getopt(argc,argv,"apmstn:")) != EOF){
35 #endif
36     switch(d){
37     case 'a':
38       Cpu_mode = ALTIVEC;
39       break;
40     case 'p':
41       Cpu_mode = PORT;
42       break;
43     case 'm':
44       Cpu_mode = MMX;
45       break;
46     case 's':
47       Cpu_mode = SSE;
48       break;
49     case 't':
50       Cpu_mode = SSE2;
51       break;
52     case 'n':
53       trials = atoi(optarg);
54       break;
55     }
56   }
57 
58   while(trials--){
59     long port_result;
60     long simd_result;
61     int ntaps;
62     int i;
63     int csum = 0;
64     int offset;
65     void *dp_simd,*dp_port;
66 
67     /* Generate set of coefficients
68      * limit sum of absolute values to 32767 to avoid overflow
69      */
70     memset(coeffs,0,sizeof(coeffs));
71     for(i=0;i<512;i++){
72       double gv;
73 
74       gv = normal_rand(0.,100.);
75       if(csum + fabs(gv) > 32767)
76 	break;
77       coeffs[i] = gv;
78       csum += fabs(gv);
79     }
80     ntaps = i;
81 
82     /* Compare results to portable C version for a bunch of random data buffers and offsets */
83     dp_simd = initdp(coeffs,ntaps);
84     dp_port = initdp_port(coeffs,ntaps);
85 
86     for(i=0;i<2048;i++)
87       input[i] = random();
88 
89     offset = random() & 511;
90 
91     simd_result = dotprod(dp_simd,input+offset);
92     port_result = dotprod_port(dp_port,input+offset);
93     if(simd_result != port_result){
94       errors++;
95     }
96   }
97   printf("dtest: %d errors\n",errors);
98   exit(0);
99 }
100