1

我计划为 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

有没有更好的方法来处理微架构级别的差异?

4

0 回答 0