From b6f2ccf194c40c840f9e2d248839749b1ebbecbf Mon Sep 17 00:00:00 2001 From: Arun Raghavan Date: Tue, 24 Jul 2012 14:37:54 +0530 Subject: [PATCH] tests: Factor out Orc test code into cpu-test Reorganises all the svolume core test code in cpu-test since it's the same across MMX/SSE/etc. --- src/pulsecore/cpu-orc.c | 8 +- src/pulsecore/cpu-orc.h | 2 +- src/pulsecore/svolume_orc.c | 85 ---------------------- src/tests/cpu-test.c | 141 ++++++++++++------------------------ 4 files changed, 55 insertions(+), 181 deletions(-) diff --git a/src/pulsecore/cpu-orc.c b/src/pulsecore/cpu-orc.c index 21d49ed7..d40c224c 100644 --- a/src/pulsecore/cpu-orc.c +++ b/src/pulsecore/cpu-orc.c @@ -25,14 +25,18 @@ #include "cpu-orc.h" -void pa_cpu_init_orc(pa_cpu_info cpu_info) +pa_bool_t pa_cpu_init_orc(pa_cpu_info cpu_info) { #ifndef DISABLE_ORC /* Update these as we test on more architectures */ pa_cpu_x86_flag_t x86_want_flags = PA_CPU_X86_MMX | PA_CPU_X86_SSE | PA_CPU_X86_SSE2 | PA_CPU_X86_SSE3 | PA_CPU_X86_SSSE3 | PA_CPU_X86_SSE4_1 | PA_CPU_X86_SSE4_2; /* Enable Orc svolume optimizations */ - if ((cpu_info.cpu_type == PA_CPU_X86) && (cpu_info.flags.x86 & x86_want_flags)) + if ((cpu_info.cpu_type == PA_CPU_X86) && (cpu_info.flags.x86 & x86_want_flags)) { pa_volume_func_init_orc(); + return TRUE; + } #endif + + return FALSE; } diff --git a/src/pulsecore/cpu-orc.h b/src/pulsecore/cpu-orc.h index d236f7a5..0bf81cb2 100644 --- a/src/pulsecore/cpu-orc.h +++ b/src/pulsecore/cpu-orc.h @@ -26,7 +26,7 @@ /* Orc-optimised bits */ -void pa_cpu_init_orc(pa_cpu_info cpu_info); +pa_bool_t pa_cpu_init_orc(pa_cpu_info cpu_info); void pa_volume_func_init_orc(void); diff --git a/src/pulsecore/svolume_orc.c b/src/pulsecore/svolume_orc.c index d5bd5f2c..37e6bf8f 100644 --- a/src/pulsecore/svolume_orc.c +++ b/src/pulsecore/svolume_orc.c @@ -45,94 +45,9 @@ pa_volume_s16ne_orc(int16_t *samples, const int32_t *volumes, unsigned channels, fallback(samples, volumes, channels, length); } -#undef RUN_TEST - -#ifdef RUN_TEST -#define CHANNELS 2 -#define SAMPLES 1022 -#define TIMES 1000 -#define TIMES2 100 -#define PADDING 16 - -static void run_test(void) { - int16_t samples[SAMPLES]; - int16_t samples_ref[SAMPLES]; - int16_t samples_orig[SAMPLES]; - int32_t volumes[CHANNELS + PADDING]; - int i, j, padding; - pa_do_volume_func_t func; - pa_usec_t start, stop; - int k; - pa_usec_t min = INT_MAX, max = 0; - double s1 = 0, s2 = 0; - - func = pa_get_volume_func(PA_SAMPLE_S16NE); - - printf("checking ORC %zd\n", sizeof(samples)); - - pa_random(samples, sizeof(samples)); - memcpy(samples_ref, samples, sizeof(samples)); - memcpy(samples_orig, samples, sizeof(samples)); - - for (i = 0; i < CHANNELS; i++) - volumes[i] = PA_CLAMP_VOLUME(rand() >> 15); - for (padding = 0; padding < PADDING; padding++, i++) - volumes[i] = volumes[padding]; - - func(samples_ref, volumes, CHANNELS, sizeof(samples)); - pa_volume_s16ne_orc(samples, volumes, CHANNELS, sizeof(samples)); - for (i = 0; i < SAMPLES; i++) { - if (samples[i] != samples_ref[i]) { - printf ("%d: %04x != %04x (%04x * %04x)\n", i, samples[i], samples_ref[i], - samples_orig[i], volumes[i % CHANNELS]); - } - } - - for (k = 0; k < TIMES2; k++) { - start = pa_rtclock_now(); - for (j = 0; j < TIMES; j++) { - memcpy(samples, samples_orig, sizeof(samples)); - pa_volume_s16ne_orc(samples, volumes, CHANNELS, sizeof(samples)); - } - stop = pa_rtclock_now(); - - if (min > (stop - start)) min = stop - start; - if (max < (stop - start)) max = stop - start; - s1 += stop - start; - s2 += (stop - start) * (stop - start); - } - pa_log_info("ORC: %llu usec (min = %llu, max = %llu, stddev = %g).", (long long unsigned int)s1, - (long long unsigned int)min, (long long unsigned int)max, sqrt(TIMES2 * s2 - s1 * s1) / TIMES2); - - min = INT_MAX; max = 0; - s1 = s2 = 0; - for (k = 0; k < TIMES2; k++) { - start = pa_rtclock_now(); - for (j = 0; j < TIMES; j++) { - memcpy(samples_ref, samples_orig, sizeof(samples)); - func(samples_ref, volumes, CHANNELS, sizeof(samples)); - } - stop = pa_rtclock_now(); - - if (min > (stop - start)) min = stop - start; - if (max < (stop - start)) max = stop - start; - s1 += stop - start; - s2 += (stop - start) * (stop - start); - } - pa_log_info("ref: %llu usec (min = %llu, max = %llu, stddev = %g).", (long long unsigned int)s1, - (long long unsigned int)min, (long long unsigned int)max, sqrt(TIMES2 * s2 - s1 * s1) / TIMES2); - - pa_assert_se(memcmp(samples_ref, samples, sizeof(samples)) == 0); -} -#endif - void pa_volume_func_init_orc(void) { pa_log_info("Initialising ORC optimized volume functions."); -#ifdef RUN_TEST - run_test(); -#endif - fallback = pa_get_volume_func(PA_SAMPLE_S16NE); pa_set_volume_func(PA_SAMPLE_S16NE, (pa_do_volume_func_t) pa_volume_s16ne_orc); } diff --git a/src/tests/cpu-test.c b/src/tests/cpu-test.c index de25bc6a..a812db2d 100644 --- a/src/tests/cpu-test.c +++ b/src/tests/cpu-test.c @@ -8,44 +8,31 @@ #include #include +#include #include #include #include #include #include -START_TEST (svolume_mmx_test) { +/* Common defines for svolume tests */ #define CHANNELS 2 #define SAMPLES 1022 #define TIMES 1000 #define TIMES2 100 #define PADDING 16 +static void run_volume_test(pa_do_volume_func_t func, pa_do_volume_func_t orig_func) { int16_t samples[SAMPLES]; int16_t samples_ref[SAMPLES]; int16_t samples_orig[SAMPLES]; int32_t volumes[CHANNELS + PADDING]; int i, j, padding; - pa_do_volume_func_t orig_func, mmx_func; pa_usec_t start, stop; int k; pa_usec_t min = INT_MAX, max = 0; double s1 = 0, s2 = 0; - pa_cpu_x86_flag_t flags = 0; - - pa_cpu_get_x86_flags(&flags); - - if (!((flags & PA_CPU_X86_MMX) && (flags & PA_CPU_X86_CMOV))) { - pa_log_info("MMX/CMOV not supported. Skipping"); - return; - } - - orig_func = pa_get_volume_func(PA_SAMPLE_S16NE); - pa_volume_func_init_mmx(flags); - mmx_func = pa_get_volume_func(PA_SAMPLE_S16NE); - - pa_log_debug("Checking MMX svolume (%zd)\n", sizeof(samples)); pa_random(samples, sizeof(samples)); memcpy(samples_ref, samples, sizeof(samples)); @@ -57,7 +44,7 @@ START_TEST (svolume_mmx_test) { volumes[i] = volumes[padding]; orig_func(samples_ref, volumes, CHANNELS, sizeof(samples)); - mmx_func(samples, volumes, CHANNELS, sizeof(samples)); + func(samples, volumes, CHANNELS, sizeof(samples)); for (i = 0; i < SAMPLES; i++) { if (samples[i] != samples_ref[i]) { printf("%d: %04x != %04x (%04x * %08x)\n", i, samples[i], samples_ref[i], @@ -70,7 +57,7 @@ START_TEST (svolume_mmx_test) { start = pa_rtclock_now(); for (j = 0; j < TIMES; j++) { memcpy(samples, samples_orig, sizeof(samples)); - mmx_func(samples, volumes, CHANNELS, sizeof(samples)); + func(samples, volumes, CHANNELS, sizeof(samples)); } stop = pa_rtclock_now(); @@ -79,8 +66,8 @@ START_TEST (svolume_mmx_test) { s1 += stop - start; s2 += (stop - start) * (stop - start); } - pa_log_info("MMX: %llu usec (min = %llu, max = %llu, stddev = %g).", (long long unsigned int)s1, - (long long unsigned int)min, (long long unsigned int)max, sqrt(TIMES2 * s2 - s1 * s1) / TIMES2); + pa_log_info("func: %llu usec (min = %llu, max = %llu, stddev = %g).", (long long unsigned int)s1, + (long long unsigned int)min, (long long unsigned int)max, sqrt(times2 * s2 - s1 * s1) / times2); min = INT_MAX; max = 0; s1 = s2 = 0; @@ -97,36 +84,34 @@ START_TEST (svolume_mmx_test) { s1 += stop - start; s2 += (stop - start) * (stop - start); } - pa_log_info("ref: %llu usec (min = %llu, max = %llu, stddev = %g).", (long long unsigned int)s1, - (long long unsigned int)min, (long long unsigned int)max, sqrt(TIMES2 * s2 - s1 * s1) / TIMES2); + pa_log_info("orig: %llu usec (min = %llu, max = %llu, stddev = %g).", (long long unsigned int)s1, + (long long unsigned int)min, (long long unsigned int)max, sqrt(times2 * s2 - s1 * s1) / times2); fail_unless(memcmp(samples_ref, samples, sizeof(samples)) == 0); +} -#undef CHANNELS -#undef SAMPLES -#undef TIMES -#undef TIMES2 -#undef PADDING +START_TEST (svolume_mmx_test) { + pa_do_volume_func_t orig_func, mmx_func; + pa_cpu_x86_flag_t flags = 0; + + pa_cpu_get_x86_flags(&flags); + + if (!((flags & PA_CPU_X86_MMX) && (flags & PA_CPU_X86_CMOV))) { + pa_log_info("MMX/CMOV not supported. Skipping"); + return; + } + + orig_func = pa_get_volume_func(PA_SAMPLE_S16NE); + pa_volume_func_init_mmx(flags); + mmx_func = pa_get_volume_func(PA_SAMPLE_S16NE); + + pa_log_debug("Checking MMX svolume"); + run_volume_test(mmx_func, orig_func); } END_TEST START_TEST (svolume_sse_test) { -#define CHANNELS 2 -#define SAMPLES 1022 -#define TIMES 1000 -#define TIMES2 100 -#define PADDING 16 - - int16_t samples[SAMPLES]; - int16_t samples_ref[SAMPLES]; - int16_t samples_orig[SAMPLES]; - int32_t volumes[CHANNELS + PADDING]; - int i, j, padding; pa_do_volume_func_t orig_func, sse_func; - pa_usec_t start, stop; - int k; - pa_usec_t min = INT_MAX, max = 0; - double s1 = 0, s2 = 0; pa_cpu_x86_flag_t flags = 0; pa_cpu_get_x86_flags(&flags); @@ -140,70 +125,39 @@ START_TEST (svolume_sse_test) { pa_volume_func_init_sse(flags); sse_func = pa_get_volume_func(PA_SAMPLE_S16NE); - pa_log_debug("Checking SSE2 svolume (%zd)\n", sizeof(samples)); - - pa_random(samples, sizeof(samples)); - memcpy(samples_ref, samples, sizeof(samples)); - memcpy(samples_orig, samples, sizeof(samples)); + pa_log_debug("Checking SSE2 svolume"); + run_volume_test(sse_func, orig_func); +} +END_TEST - for (i = 0; i < CHANNELS; i++) - volumes[i] = PA_CLAMP_VOLUME((pa_volume_t)(rand() >> 15)); - for (padding = 0; padding < PADDING; padding++, i++) - volumes[i] = volumes[padding]; +START_TEST (svolume_orc_test) { + pa_do_volume_func_t orig_func, orc_func; + pa_cpu_info cpu_info; - orig_func(samples_ref, volumes, CHANNELS, sizeof(samples)); - sse_func(samples, volumes, CHANNELS, sizeof(samples)); - for (i = 0; i < SAMPLES; i++) { - if (samples[i] != samples_ref[i]) { - printf ("%d: %04x != %04x (%04x * %04x)\n", i, samples[i], samples_ref[i], - samples_orig[i], volumes[i % CHANNELS]); - fail(); - } - } +#if defined (__i386__) || defined (__amd64__) + pa_zero(cpu_info); + cpu_info.cpu_type = PA_CPU_X86; + pa_cpu_get_x86_flags(&cpu_info.flags.x86); +#endif - for (k = 0; k < TIMES2; k++) { - start = pa_rtclock_now(); - for (j = 0; j < TIMES; j++) { - memcpy(samples, samples_orig, sizeof(samples)); - sse_func(samples, volumes, CHANNELS, sizeof(samples)); - } - stop = pa_rtclock_now(); + orig_func = pa_get_volume_func(PA_SAMPLE_S16NE); - if (min > (stop - start)) min = stop - start; - if (max < (stop - start)) max = stop - start; - s1 += stop - start; - s2 += (stop - start) * (stop - start); + if (!pa_cpu_init_orc(cpu_info)) { + pa_log_info("Orc not supported. Skipping"); + return; } - pa_log_info("SSE: %llu usec (min = %llu, max = %llu, stddev = %g).", (long long unsigned int)s1, - (long long unsigned int)min, (long long unsigned int)max, sqrt(TIMES2 * s2 - s1 * s1) / TIMES2); - - min = INT_MAX; max = 0; - s1 = s2 = 0; - for (k = 0; k < TIMES2; k++) { - start = pa_rtclock_now(); - for (j = 0; j < TIMES; j++) { - memcpy(samples_ref, samples_orig, sizeof(samples)); - orig_func(samples_ref, volumes, CHANNELS, sizeof(samples)); - } - stop = pa_rtclock_now(); - if (min > (stop - start)) min = stop - start; - if (max < (stop - start)) max = stop - start; - s1 += stop - start; - s2 += (stop - start) * (stop - start); - } - pa_log_info("ref: %llu usec (min = %llu, max = %llu, stddev = %g).", (long long unsigned int)s1, - (long long unsigned int)min, (long long unsigned int)max, sqrt(TIMES2 * s2 - s1 * s1) / TIMES2); + orc_func = pa_get_volume_func(PA_SAMPLE_S16NE); - fail_unless(memcmp(samples_ref, samples, sizeof(samples)) == 0); + pa_log_debug("Checking SSE2 svolume"); + run_volume_test(orc_func, orig_func, CHANNELS, SAMPLES, TIMES, TIMES2, PADDING); #undef CHANNELS #undef SAMPLES #undef TIMES #undef TIMES2 #undef PADDING -} -END_TEST +/* End svolume tests */ START_TEST (sconv_sse_test) { #define SAMPLES 1019 @@ -280,6 +234,7 @@ int main(int argc, char *argv[]) { tc = tcase_create("x86"); tcase_add_test(tc, svolume_mmx_test); tcase_add_test(tc, svolume_sse_test); + tcase_add_test(tc, svolume_orc_test); tcase_add_test(tc, sconv_sse_test); suite_add_tcase(s, tc); -- 2.39.2