/* Test dot-product function */ #include #include #include #include #include "config.h" #ifdef HAVE_GETOPT_H #include #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); }