aboutsummaryrefslogtreecommitdiffstats
path: root/dtest.c
diff options
context:
space:
mode:
Diffstat (limited to 'dtest.c')
-rw-r--r--dtest.c99
1 files changed, 99 insertions, 0 deletions
diff --git a/dtest.c b/dtest.c
new file mode 100644
index 0000000..394cb03
--- /dev/null
+++ b/dtest.c
@@ -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);
+}