[vlc-devel] [PATCH] Detect AVX-enabled processors

Rémi Denis-Courmont remi at remlab.net
Fri Dec 9 17:02:07 CET 2011


Le vendredi 9 décembre 2011 17:28:11 Jean-Baptiste Kempf, vous avez écrit :
> ---
>  configure.ac      |   22 ++++++++++++++++++++++
>  include/vlc_cpu.h |   11 +++++++++++
>  src/misc/cpu.c    |   15 +++++++++++++++
>  3 files changed, 48 insertions(+), 0 deletions(-)
> 
> diff --git a/configure.ac b/configure.ac
> index d0538e2..869b9d2 100644
> --- a/configure.ac
> +++ b/configure.ac
> @@ -1336,6 +1336,28 @@ AS_IF([test "${ac_cv_3dnow_inline}" != "no"], [
>  ])
>  AM_CONDITIONAL([HAVE_3DNOW], [test "$have_3dnow" = "yes"])
> 
> +VLC_SAVE_FLAGS
> +CFLAGS="${CFLAGS} -mavx"
> +have_avx="no"
> +AC_CACHE_CHECK([if $CC groks AVX inline assembly], [ac_cv_avx_inline], [
> +  AC_COMPILE_IFELSE([AC_LANG_PROGRAM(,[[
> +void *p;
> +asm volatile("vzeroall"::"r"(p));
> +]])
> +  ], [
> +    ac_cv_avx_inline=yes
> +  ], [
> +    ac_cv_avx_inline=no
> +  ])
> +])
> +VLC_RESTORE_FLAGS
> +AS_IF([test "${ac_cv_avx_inline}" != "no"], [
> +  AC_DEFINE(CAN_COMPILE_AVX, 1,
> +            [Define to 1 if AVX inline assembly is available.])
> +  have_3dnow="yes"

Cut&paste typo?

> +])
> +AM_CONDITIONAL([HAVE_AVX], [test "$have_3dnow" = "yes"])
> +
> 
>  AC_ARG_ENABLE(neon,
>    [AS_HELP_STRING([--disable-neon],
> diff --git a/include/vlc_cpu.h b/include/vlc_cpu.h
> index 63cc978..a4dc66b 100644
> --- a/include/vlc_cpu.h
> +++ b/include/vlc_cpu.h
> @@ -37,6 +37,7 @@
>  #  define CPU_CAPABILITY_SSE4_1  (1<<10)
>  #  define CPU_CAPABILITY_SSE4_2  (1<<11)
>  #  define CPU_CAPABILITY_SSE4A   (1<<12)
> +#  define CPU_CAPABILITY_AVX     (1<<13)
> 
>  # if defined (__MMX__)
>  #  define VLC_MMX
> @@ -54,6 +55,15 @@
>  #  define VLC_SSE VLC_SSE_is_not_implemented_on_this_compiler
>  # endif
> 
> +# if defined (__AVX__)
> +#  define VLC_AVX
> +# elif VLC_GCC_VERSION(4, 6)
> +#  define VLC_AVX __attribute__ ((__target__ ("avx")))
> +# else
> +#  define VLC_AVX VLC_AVX_is_not_implemented_on_this_compiler
> +# endif

If you need that, then you should probably include an AVX register in the 
inline assembly test within configure.ac.

> +
> +
>  # else
>  #  define CPU_CAPABILITY_MMX     (0)
>  #  define CPU_CAPABILITY_3DNOW   (0)
> @@ -65,6 +75,7 @@
>  #  define CPU_CAPABILITY_SSE4_1  (0)
>  #  define CPU_CAPABILITY_SSE4_2  (0)
>  #  define CPU_CAPABILITY_SSE4A   (0)
> +#  define CPU_CAPABILITY_AVX     (0)
>  # endif
> 
>  # if defined (__ppc__) || defined (__ppc64__) || defined (__powerpc__)
> diff --git a/src/misc/cpu.c b/src/misc/cpu.c
> index 7c28b25..97826a9 100644
> --- a/src/misc/cpu.c
> +++ b/src/misc/cpu.c
> @@ -125,6 +125,13 @@ VLC_MMX static void ThreeD_Now_test (void)
>      asm volatile ("pfadd %%mm0,%%mm0\n" "femms\n" : : : "mm0");
>  }
>  #endif
> +#if defined (CAN_COMPILE_AVX) && !defined (__AVX__)
> +VLC_AVX static void AVX_test (void)
> +{
> +    asm volatile ("vzeroall\n" );
> +}
> +#endif
> +

Side topic... I think those fork/SIGILL tests are not really good idea. fork() 
can (and seems to) cause problems with libraries using pthread_atfork().

Besides, I don't really understand why we have those tests. A number of 
libraries just check for CPUID, including some libraries used by VLC. I wonder 
how this test can fail? Can the OS block those instructions, or can it block 
the MMX and/or SSE registers?

>  #if defined (CAN_COMPILE_ALTIVEC)
>  static void Altivec_text (void)
> @@ -262,6 +269,13 @@ void vlc_CPU_init (void)
>          i_capabilities |= CPU_CAPABILITY_SSE4_2;
>  # endif
> 
> +# if defined (__AVX__)
> +    i_capabilities |= CPU_CAPABILITY_AVX;
> +# elif defined (CAN_COMPILE_AVX)
> +    if ((i_ecx & (1 << 28)) && vlc_CPU_check ("AVX", AVX_test))
> +        i_capabilities |= CPU_CAPABILITY_AVX;
> +# endif
> +
>      /* test for additional capabilities */
>      cpuid( 0x80000000 );
> 
> @@ -384,6 +398,7 @@ void vlc_CPU_dump (vlc_object_t *obj)
>      PRINT_CAPABILITY(CPU_CAPABILITY_SSE4_1, "SSE4.1");
>      PRINT_CAPABILITY(CPU_CAPABILITY_SSE4_2, "SSE4.2");
>      PRINT_CAPABILITY(CPU_CAPABILITY_SSE4A,  "SSE4A");
> +    PRINT_CAPABILITY(CPU_CAPABILITY_AVX,  "AVX");
> 
>  #elif defined (__powerpc__) || defined (__ppc__) || defined (__ppc64__)
>      PRINT_CAPABILITY(CPU_CAPABILITY_ALTIVEC, "AltiVec");


-- 
Rémi Denis-Courmont
http://www.remlab.net/
http://fi.linkedin.com/in/remidenis



More information about the vlc-devel mailing list