| /* Test dot-product function */ |
| |
| #include <stdio.h> |
| #include <stdlib.h> |
| #include <memory.h> |
| #include <math.h> |
| #include "config.h" |
| #ifdef HAVE_GETOPT_H |
| #include <getopt.h> |
| #endif |
| #include "fec.h" |
| |
| #if HAVE_GETOPT_LONG |
| struct option Options[] = { |
| {"force-altivec",0,NULL,'a'}, |
| {"force-port",0,NULL,'p'}, |
| {"force-mmx",0,NULL,'m'}, |
| {"force-sse",0,NULL,'s'}, |
| {"force-sse2",0,NULL,'t'}, |
| {"trials",0,NULL,'n'}, |
| {NULL}, |
| }; |
| #endif |
| |
| int main(int argc,char *argv[]){ |
| short coeffs[512]; |
| short input[2048]; |
| int trials=1000,d; |
| int errors = 0; |
| |
| #if HAVE_GETOPT_LONG |
| while((d = getopt_long(argc,argv,"apmstn:",Options,NULL)) != EOF){ |
| #else |
| while((d = getopt(argc,argv,"apmstn:")) != EOF){ |
| #endif |
| switch(d){ |
| case 'a': |
| Cpu_mode = ALTIVEC; |
| break; |
| case 'p': |
| Cpu_mode = PORT; |
| break; |
| case 'm': |
| Cpu_mode = MMX; |
| break; |
| case 's': |
| Cpu_mode = SSE; |
| break; |
| case 't': |
| Cpu_mode = SSE2; |
| break; |
| case 'n': |
| trials = atoi(optarg); |
| break; |
| } |
| } |
| |
| while(trials--){ |
| long port_result; |
| long simd_result; |
| int ntaps; |
| int i; |
| int csum = 0; |
| int offset; |
| void *dp_simd,*dp_port; |
| |
| /* Generate set of coefficients |
| * limit sum of absolute values to 32767 to avoid overflow |
| */ |
| memset(coeffs,0,sizeof(coeffs)); |
| for(i=0;i<512;i++){ |
| double gv; |
| |
| gv = normal_rand(0.,100.); |
| if(csum + fabs(gv) > 32767) |
| break; |
| coeffs[i] = gv; |
| csum += fabs(gv); |
| } |
| ntaps = i; |
| |
| /* Compare results to portable C version for a bunch of random data buffers and offsets */ |
| dp_simd = initdp(coeffs,ntaps); |
| dp_port = initdp_port(coeffs,ntaps); |
| |
| for(i=0;i<2048;i++) |
| input[i] = random(); |
| |
| offset = random() & 511; |
| |
| simd_result = dotprod(dp_simd,input+offset); |
| port_result = dotprod_port(dp_port,input+offset); |
| if(simd_result != port_result){ |
| errors++; |
| } |
| } |
| printf("dtest: %d errors\n",errors); |
| exit(0); |
| } |