我计划为 x86-64 架构构建不同版本的密集数值程序。方便的是,在 2020 年,定义了 4 个级别的 x86-64 微架构,可以通过“-march”标志传递给编译器。因此,对于 GCC 11(对于 Clang 12 也是如此),我应该能够通过指定使用 AVX、AVX2 和 LZCNT 指令
gcc -march=x86-64-v3
并将其扩展为 AVX512
gcc -march=x86-64-v4
如果我用它创建一个 Debian 包,它可能被称为
mynumerics_22.04_amd64.deb
但是,实际上有两个版本。在机器上运行该x86-64-v4
版本x86-64-v3
会导致 SIGILL(非法指令)。有人向我建议:
mynumerics_22.04_amd64-x3.deb
mynumerics_22.04_amd64-x4.deb
其中 x3 代表 x86-64-v3,x4 代表 x86-64-v4。但我认为这违反了 Debian 'arch' 说明符规则。将其添加到包名称的版本部分会导致:
mynumerics_22.04-x3_amd64.deb
mynumerics_22.04-x4_amd64.deb
但这可以被包管理器解释为 x4 是更高版本。我正在考虑给名字加后缀。因此:
mynumerics-x3_22.04_amd64.deb
mynumerics-x4_22.04_amd64.deb
ARM aarch64 世界中可能会发生类似的微架构问题。根据我的阅读,ARMv8-A 支持“高级 SIMD (Neon)”;ARMv8.2-A 支持“可扩展向量扩展 (SVE)”。这可能会产生,
mynumerics-a8_22.04_arm64.deb
mynumerics-a82_22.04_arm64.deb
有没有更好的方法来处理微架构级别的差异?