return (tsc_end - tsc_begin) / (tm_end.tv_sec - tm_begin.tv_sec + (tm_end.tv_usec - tm_begin.tv_usec) / 1e6);
}
+void mix_areas_srv(unsigned int size,
+ const s16 *src,
+ volatile s32 *sum,
+ unsigned int src_step)
+{
+ while (size-- > 0) {
+ atomic_add(sum, *src);
+ ((char*)src) += src_step;
+ sum++;
+ }
+}
+
+void saturate(unsigned int size,
+ s16 *dst, const s32 *sum,
+ unsigned int dst_step)
+{
+ while (size-- > 0) {
+ s32 sample = *sum;
+ if (unlikely(sample < -0x8000))
+ *dst = -0x8000;
+ else if (unlikely(sample > 0x7fff))
+ *dst = 0x7fff;
+ else
+ *dst = sample;
+ ((char*)dst) += dst_step;
+ sum++;
+ }
+}
+
void mix_areas0(unsigned int size,
volatile s16 *dst, s16 *src,
volatile s32 *sum,
int size = 2048, n = 4, max = 32267;
int LOOP = 100;
int i, t;
- unsigned long long begin, end, diff, diff0, diff1, diff1_mmx, diff2;
+ unsigned long long begin, end, diff, diffS, diff0, diff1, diff1_mmx, diff2;
double cpu_clock = detect_cpu_clock();
setscheduler();
}
}
+ for (t = 0, diffS = -1; t < LOOP; t++) {
+ init(dst, sum, size);
+ rdtscll(begin);
+ for (i = 0; i < n; i++) {
+ mix_areas_srv(size, srcs[i], sum, 2);
+ }
+ saturate(size, dst, sum, 2);
+ rdtscll(end);
+ diff = end - begin;
+ if (diff < diffS)
+ diffS = diff;
+ printf("mix_areas_srv : %lld \r", diff); fflush(stdout);
+ }
+
for (t = 0, diff0 = -1; t < LOOP; t++) {
init(dst, sum, size);
rdtscll(begin);
printf(" \r");
printf("Summary (the best times):\n");
- printf("mix_areas0 : %lld\n", diff0);
- printf("mix_areas1 : %lld\n", diff1);
- printf("mix_areas1_mmx: %lld\n", diff1_mmx);
- printf("mix_areas2 : %lld\n", diff2);
+ printf("mix_areas_srv : %lld %f%%\n", diffS, 100*2*44100.0*diffS/(size*n*cpu_clock));
+ printf("mix_areas0 : %lld %f%%\n", diff0, 100*2*44100.0*diff0/(size*n*cpu_clock));
+ printf("mix_areas1 : %lld %f%%\n", diff1, 100*2*44100.0*diff1/(size*n*cpu_clock));
+ printf("mix_areas1_mmx: %lld %f%%\n", diff1_mmx, 100*2*44100.0*diff1_mmx/(size*n*cpu_clock));
+ printf("mix_areas2 : %lld %f%%\n", diff2, 100*2*44100.0*diff2/(size*n*cpu_clock));
+
+ printf("\n");
+ printf("areas1/srv ratio : %f\n", (double)diff1 / diffS);
+ printf("areas1_mmx/srv ratio : %f\n", (double)diff1_mmx / diffS);
return 0;
}