gr-satnogs/lib/libfec/sumsq_test.c

107 lines
2.1 KiB
C

#include <stdio.h>
#include <stdlib.h>
#include <memory.h>
#include <time.h>
#include "config.h"
#ifdef HAVE_GETOPT_H
#include <getopt.h>
#endif
#include "fec.h"
#if HAVE_GETOPT_LONG
struct option Options[] = {
{"frame-length", 1, NULL, 'l'},
{"frame-count", 1, NULL, 'n'},
{"verbose", 0, NULL, 'v'},
{"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'},
{NULL},
};
#endif
int Verbose = 0;
int main(int argc, char *argv[])
{
signed short *buf;
int i, d, trial, trials = 10000;
int bufsize = 2048;
long long port_sum, simd_sum;
time_t t;
int timetrials = 0;
find_cpu_mode();
time(&t);
srandom(t);
#if HAVE_GETOPT_LONG
while ((d = getopt_long(argc, argv, "vapmstl:n:T", Options, NULL)) != EOF) {
#else
while ((d = getopt(argc, argv, "vapmstl:n:T")) != 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 'l':
bufsize = atoi(optarg);
break;
case 'n':
trials = atoi(optarg);
break;
case 'v':
Verbose++;
break;
case 'T':
timetrials++;
break;
}
}
buf = (signed short *)calloc(bufsize, sizeof(signed short));
if (timetrials) {
for (trial = 0; trial < trials; trial++) {
(void)sumsq(buf, bufsize);
}
}
else {
for (trial = 0; trial < trials; trial++) {
int length, offset;
offset = random() & 7;
length = (random() % bufsize) - offset;
if (length <= 0) {
continue;
}
for (i = 0; i < bufsize; i++) {
buf[i] = random();
}
port_sum = sumsq_port(buf + offset, length);
simd_sum = sumsq(buf + offset, length);
if (port_sum != simd_sum) {
printf("offset %d len %d port_sum = %lld simd_sum = %lld ", offset, length,
port_sum, simd_sum);
printf("ERROR! diff = %lld\n", simd_sum - port_sum);
}
}
}
exit(0);
}