You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
99 lines
2.0 KiB
99 lines
2.0 KiB
/* 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); |
|
}
|
|
|