[FFmpeg-devel] [PATCH 03/11] avutil: detect when AVX-512 is available

James Almer jamrial at gmail.com
Fri Nov 10 04:11:05 EET 2017


On 11/9/2017 8:58 AM, James Darnley wrote:
> ---
> I've changed this patch slightly because I discovered that it would cause an
> illegal instruction exception on much older processors (probably all without
> AVX).  I was running xgetbv() almost uncontitionally.  Now it is a little more
> like what is the in x264 patch.
> 
>  libavutil/x86/cpu.c | 12 ++++++++++--
>  1 file changed, 10 insertions(+), 2 deletions(-)
> 
> diff --git a/libavutil/x86/cpu.c b/libavutil/x86/cpu.c
> index f33088c8c7..589fdef7da 100644
> --- a/libavutil/x86/cpu.c
> +++ b/libavutil/x86/cpu.c
> @@ -97,6 +97,7 @@ int ff_get_cpu_flags_x86(void)
>      int max_std_level, max_ext_level, std_caps = 0, ext_caps = 0;
>      int family = 0, model = 0;
>      union { int i[3]; char c[12]; } vendor;
> +    int xcr0_lo = 0, xcr0_hi = 0;
>  
>      if (!cpuid_test())
>          return 0; /* CPUID not supported */
> @@ -132,8 +133,8 @@ int ff_get_cpu_flags_x86(void)
>          /* Check OXSAVE and AVX bits */
>          if ((ecx & 0x18000000) == 0x18000000) {
>              /* Check for OS support */
> -            xgetbv(0, eax, edx);
> -            if ((eax & 0x6) == 0x6) {
> +            xgetbv(0, xcr0_lo, xcr0_hi);
> +            if ((xcr0_lo & 0x6) == 0x6) {
>                  rval |= AV_CPU_FLAG_AVX;
>                  if (ecx & 0x00001000)
>                      rval |= AV_CPU_FLAG_FMA3;
> @@ -154,6 +155,13 @@ int ff_get_cpu_flags_x86(void)
>              if (ebx & 0x00000100)
>                  rval |= AV_CPU_FLAG_BMI2;
>          }
> +#if HAVE_AVX512 /* F, CD, BW, DQ, VL */

Nit: Maybe move this chunk inside the HAVE_AVX2 block, at the end of it,
right above the BMI checks.

> +        if ((xcr0_lo & 0xe6) == 0xe6) {

Nit: The proper check here i think would be

if ((xcr0_lo & 0xe0) == 0xe0) {
    if ((rval & AV_CPU_FLAG_AVX) && (ebx & 0xd0030000) == 0xd0030000)
        rval |= AV_CPU_FLAG_AVX512;
}

But it's functionally the same.

> +            if ((ebx & 0xd0030000) == 0xd0030000)
> +                rval |= AV_CPU_FLAG_AVX512;
> +
> +        }
> +#endif
>      }
>  
>      cpuid(0x80000000, max_ext_level, ebx, ecx, edx);
> 

LGTM either way.


More information about the ffmpeg-devel mailing list