Subject: Re: bug#53895: [PATCH 0/5] More CPU detection

From: Ludovic Courtès <[email-masked]>
Date: Wed, 09 Feb 2022 11:35:22 +0100

Hi!

Efraim Flashner <[email-masked]> skribis:

> * guix/cpu.scm (cpu->gcc-architecture): Rewrite detection based on
> detected feature flags.

[...]

>       ;; Transcribed from GCC's 'host_detect_local_cpu' in driver-i386.c.
>       (or (and (= 6 (cpu-family cpu))              ;the "Pentium Pro" family
> -              (letrec-syntax ((model (syntax-rules (=>)
> -                                       ((_) #f)
> -                                       ((_ (candidate => integers ...) rest
> -                                           ...)
> -                                        (or (and (= (cpu-model cpu) integers)
> -                                                 candidate)
> -                                            ...
> -                                            (model rest ...))))))
> -                (model ("bonnel" => #x1c #x26)
> -                       ("silvermont" => #x37 #x4a #x4d #x5a #x5d)
> -                       ("core2" => #x0f #x17 #x1d)
> -                       ("nehalem" => #x1a #x1e #x1f #x2e)
> -                       ("westmere" => #x25 #x2c #x2f)
> -                       ("sandybridge" => #x2a #x2d)
> -                       ("ivybridge" => #x3a #x3e)
> -                       ("haswell" => #x3c #x3f #x45 #x46)
> -                       ("broadwell" => #x3d #x47 #x4f #x56)
> -                       ("skylake" => #x4e #x5e #x8e #x9e)
> -                       ("skylake-avx512" => #x55) ;TODO: cascadelake
> -                       ("knl" => #x57)
> -                       ("cannonlake" => #x66)
> -                       ("knm" => #x85))))
> +              (letrec-syntax ((if-flags (syntax-rules (=>)
> +                                          ((_)
> +                                           #f)
> +                                          ((_ (flags ... => name) rest ...)
> +                                           (if (every (lambda (flag)
> +                                                        (set-contains? (cpu-flags cpu)
> +                                                                       flag))
> +                                                      '(flags ...))
> +                                             name
> +                                             (if-flags rest ...))))))
> +
> +                (if-flags ("avx" "avx512vp2intersect" "tsxldtrk" => "sapphirerapids")
> +                          ("avx" "avx512vp2intersect" => "tigerlake")
> +                          ("avx" "avx512bf16" => "cooperlake")
> +                          ("avx" "wbnoinvd" => "icelake-server")
> +                          ("avx" "avx512bitalg" => "icelake-client")
> +                          ("avx" "avx512vbmi" => "cannonlake")

In current master, the logic is:

  if it’s an intel
  then pick the model ID
  if that didn’t work
  then do feature-based detection

Here you’re removing the first part (using the Intel model ID) and
extending the second part.  Perhaps we could extend the second part but
still keep the first one?

The AMD detection code would have to go before the generic fallback case
though.

WDYT?

Ludo’.