mirror of
https://git.vladimir.cc/vladimir/libfec.git
synced 2026-08-25 17:27:34 +00:00
init commit
This commit is contained in:
@@ -0,0 +1,99 @@
|
||||
/* 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);
|
||||
}
|
||||
Reference in New Issue
Block a user