]> git.alsa-project.org Git - alsa-lib.git/commitdiff
Added mix_areas_srv and */srv ratio
authorJaroslav Kysela <perex@perex.cz>
Thu, 20 Feb 2003 19:47:37 +0000 (19:47 +0000)
committerJaroslav Kysela <perex@perex.cz>
Thu, 20 Feb 2003 19:47:37 +0000 (19:47 +0000)
test/code.c

index c01a21a4b583e26a38e8305267c4782958778e37..1ff3a599a5211bffcb279aa7e17b962d68368103 100644 (file)
@@ -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;
 }