Skip to content

archdetect: detect Granite Rapids via CPU model when flags match Sapphire Rapids - #299

Draft
hmeiland wants to merge 2 commits into
EESSI:mainfrom
hmeiland:archdetect-granite-rapids
Draft

archdetect: detect Granite Rapids via CPU model when flags match Sapphire Rapids#299
hmeiland wants to merge 2 commits into
EESSI:mainfrom
hmeiland:archdetect-granite-rapids

Conversation

@hmeiland

@hmeiland hmeiland commented Sep 3, 2026

Copy link
Copy Markdown

Summary

init/eessi_archdetect.sh selects a CPU microarchitecture purely from the feature flags in /proc/cpuinfo. Intel Granite Rapids (Xeon 6) exposes the same visible flags as Sapphire/Emerald Rapids — its additions (e.g. amx_fp16, amx_complex) are intentionally hidden by the Linux kernel — so the flag match lands on x86_64/intel/sapphirerapids.

This PR adds a small, targeted refinement: once the flag match yields sapphirerapids, disambiguate using the CPU model number (the only reliable Granite Rapids signal on Linux) and prepend x86_64/intel/graniterapids to the match chain on:

Model Hex Part
173 0xAD Granite Rapids-SP / -AP
174 0xAE Granite Rapids-D

Why it's non-breaking

cpupath -a returns a priority-ordered fallback chain, and downstream software-subdir resolution picks the first entry that actually exists in the repo. Until a graniterapids software subdir is published, Granite Rapids transparently falls back to sapphirerapids (next in the chain). Sapphire Rapids (model 143) and Emerald Rapids (model 207) are unaffected — they don't match 173/174 and continue to resolve to sapphirerapids.

Testing

  • New fixture tests/archdetect/x86_64/intel/graniterapids/Azure-Ubuntu24-6973P-C.{cpuinfo,output,all.output}, captured from a real Azure Standard_D2s_v7 (Intel Xeon 6973P-C, family 6 / model 173).
  • Verified on real Granite Rapids silicon:
    • eessi_archdetect.sh cpupathx86_64/intel/graniterapids
    • eessi_archdetect.sh -a cpupathx86_64/intel/graniterapids:x86_64/intel/sapphirerapids:x86_64/intel/icelake:x86_64/intel/cascadelake:x86_64/intel/skylake_avx512:x86_64/intel/haswell:x86_64/generic
  • Full local run of every tests/archdetect fixture: all pass, no regressions (Sapphire Rapids still → sapphirerapids).

VERSION bumped 1.2.01.3.0.

Notes

Granite Rapids has no dedicated software subdir in EESSI yet; this change makes archdetect ready to pick it up the moment one is added, and meanwhile keeps GNR on the correct sapphirerapids fallback. The model list generalises cleanly to future parts (e.g. a Diamond Rapids entry) should the same flag-aliasing recur.

…hire Rapids

eessi_archdetect.sh selects a microarchitecture purely from CPU feature flags.
Intel Granite Rapids (Xeon 6) exposes the same visible /proc/cpuinfo flags as
Sapphire/Emerald Rapids - its new features such as amx_fp16 are hidden by the
kernel - so the flag match lands on x86_64/intel/sapphirerapids.

Refine that match using the CPU model number, the only reliable Granite Rapids
discriminator on Linux: once the flag match yields sapphirerapids, check the
model and prepend x86_64/intel/graniterapids on family 6 / model 173 (0xAD,
GNR-SP/AP) or 174 (0xAE, GNR-D).

Non-breaking: cpupath -a returns a priority-ordered fallback chain and
downstream subdir resolution selects the first path that exists, so Granite
Rapids transparently falls back to sapphirerapids until a graniterapids build
is shipped. Sapphire Rapids (model 143) and Emerald Rapids (model 207) are
unaffected.

Add a test fixture captured from a real Azure Standard_D2s_v7 (Intel Xeon
6973P-C, family 6 model 173). Verified on real Granite Rapids silicon and
against the full archdetect fixture suite.

Bump VERSION to 1.3.0.
Comment thread init/eessi_archdetect.sh Outdated
local cpu_family=$(get_cpuinfo "cpu[ _]family")
local cpu_model=$(get_cpuinfo "model")
log "DEBUG" "cpupath: refining Sapphire Rapids match (family='$cpu_family', model='$cpu_model')"
# Intel family 6 models: 173 (0xAD) = Granite Rapids-SP/AP, 174 (0xAE) = Granite Rapids-D

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Do you happen to know an authoritative source for the mapping from model number to CPU family?
Would be nice to include that as a comment, for future reference...

Maybe https://github.com/torvalds/linux/blob/master/arch/x86/include/asm/intel-family.h ?

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Good call - yes, arch/x86/include/asm/intel-family.h is the authoritative source (it's what the kernel itself uses for model-based dispatch). The relevant entries:

INTEL_GRANITERAPIDS_X = IFM(6, 0xAD)  -> family 6, model 173 (GNR-SP/AP)
INTEL_GRANITERAPIDS_D = IFM(6, 0xAE)  -> family 6, model 174 (GNR-D)

(for contrast: INTEL_SAPPHIRERAPIDS_X = 0x8F/143, INTEL_EMERALDRAPIDS_X = 0xCF/207)

I've added a comment citing that file and the IFM() macros in 987faec. Thanks for the pointer!

… numbers

Address review feedback from @boegel: document the model-number -> microarch
mapping (family 6, models 0xAD/0xAE) with its source - the kernel's
arch/x86/include/asm/intel-family.h (INTEL_GRANITERAPIDS_X/_D via IFM()).
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants