From: Jaroslav Kysela Date: Thu, 20 Feb 2003 19:47:37 +0000 (+0000) Subject: Added mix_areas_srv and */srv ratio X-Git-Tag: v1.0.3~257 X-Git-Url: https://git.alsa-project.org/?a=commitdiff_plain;h=f74660eaeb6deacddda618cca9f5f131da1cfe38;p=alsa-lib.git Added mix_areas_srv and */srv ratio --- diff --git a/test/code.c b/test/code.c index c01a21a4..1ff3a599 100644 --- a/test/code.c +++ b/test/code.c @@ -85,6 +85,35 @@ static double detect_cpu_clock() 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, @@ -381,7 +410,7 @@ int main(int argc, char **argv) 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(); @@ -407,6 +436,20 @@ int main(int argc, char **argv) } } + 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); @@ -461,10 +504,15 @@ int main(int argc, char **argv) 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; }