103 lines
2.0 KiB
C
103 lines
2.0 KiB
C
/* 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);
|
|
}
|