Skip to content

Case 83: CPU-dispatch ISA family dropped

Field Value
Verdict 🟡 COMPATIBLE_WITH_RISK
Category Risk
Platforms Linux, macOS, Windows
Flags
Detected ChangeKinds cpu_dispatch_isa_dropped
Source files browse on GitHub

Category: Dispatch ABI | Verdict: COMPATIBLE_WITH_RISK

What breaks

Performance-oriented libraries (oneDAL's libonedal_core.so, OpenBLAS, many ML runtimes) ship multiple ISA-specialized symbols per algorithm:

mylib::kmeans_compute            ← runtime dispatcher (selects best ISA)
mylib::kmeans_compute_avx512
mylib::kmeans_compute_avx2
mylib::kmeans_compute_sse42
mylib::kmeans_compute_scalar

In v2 the project drops AVX-512 support to shrink the binary. All *_avx512_* symbols vanish across all algorithms. The dispatcher itself still works — consumers who never pinned to a specific ISA are unaffected. Consumers who linked directly against kmeans_compute_avx512 (common in test scaffolding, micro-benchmarks, or external integrations that bypass the dispatcher for reproducibility) get unresolved symbols at load time.

Why a separate ChangeKind (not just N×func_removed)

If reported as 50 independent func_removed findings, the deployment-level event ("we dropped an ISA family") is buried. Suppression becomes painful (one rule per algorithm × ISA), the SARIF report is dominated by repeats, and the verdict severity is wrong: each individual removal looks like a hard break, but the dispatcher-using majority is unaffected.

A single CPU_DISPATCH_ISA_DROPPED finding classified as COMPATIBLE_WITH_RISK (RISK_KINDS) names the event once, lists the affected algorithms, and lets policy decide whether the deployment target still has callers pinned to that ISA.

How abicheck detects it

The new detector clusters removed symbols by ISA infix tokens (avx512, avx2, avx, sse42, sse41, sse2, sse, neon, sve, scalar, generic). When ≥ K removed symbols share one ISA token AND a sibling ISA token still exists for the same algorithm stem in the new snapshot, a single grouped CPU_DISPATCH_ISA_DROPPED finding is emitted. The per-symbol func_removed findings are suppressed as children to avoid double-counting.

Real-world reference

oneDAL: cpp/daal/src/services/service_environment.cpp and the per-kernel dispatch tables. ISA-specialized symbols have suffixes like _avx512_, _avx2_, _sse42_, _sse2_, _ref_.


Source files

See also: Examples overview · All COMPATIBLE_WITH_RISK cases · Category: Risk.