如何在运行时检测 NEON 和 Helium 指令集的可用性

Posted

技术标签:

【中文标题】如何在运行时检测 NEON 和 Helium 指令集的可用性【英文标题】:How do I Detect Availability of NEON and Helium Instruction Sets at Runtime 【发布时间】:2021-07-30 01:34:33 【问题描述】:

我正在开发一个跨平台的并行数学库,并且在实现适用于 x86/amd64 的 SSE、AVX、AVX2 和 AVX-512 (包括运行时检测 ISA 可用性)方面取得了很大进展。

但是,我遇到了一个大问题。没有在 MSVC 上运行时检测 NEON 或 Helium 支持的文档。看来 ARM 或 ARM64 上没有 cpuid 指令。也不清楚是否有一种跨平台的方式可以在 Linux 上实现这一点。

您甚至需要手动检测它还是只使用预处理器定义(例如_M_ARM64)来检查运行时支持?据我了解,预处理器宏仅在编译时进行评估。

我们是否应该假设每个 ARM CPU 都有 NEON?氦呢?

我希望这里有人知道怎么做。提前谢谢你。

【问题讨论】:

***.com/questions/26701262/… 是的,我看过那个页面。我仍然不明白如何在 C/C++ 中实现这一点,或者如何在 Windows 上实现这一点。还是谢谢。 或许你应该标记这个 Windows。 标记前请阅读标记说明。 helium 用于自动化测试工具 该链接中有一个已删除的答案。看起来写得很仔细,我想知道它被删除了。由于我无法证明它是否说明了好坏,我至少复制了一个有关 Windows 的链接:Understanding ARM Assembly Part:处理器还必须具有 VFP(硬件浮点)和 NEON(128-位 SIMD 架构)。 【参考方案1】:

如果使用 MSVC 构建,针对 ARM 或 ARM64 上的现代 Windows(即不是 Windows CE),那么基线功能集确实支持 NEON(32 位和 64 位),因此您无需在所有,你可以无条件地使用它们。 (如果代码库是可移植的,您当然可能希望避免为其他架构编译该代码,例如使用常规预处理器定义。)因此,对于这种情况,检查 _M_ARM_M_ARM64 定义就足够了。

氦气仅适用于 ARM 处理器的 M 配置文件,即用于微控制器等,与 A 配置文件无关(用于“应用程序使用”)。

【讨论】:

【参考方案2】:

NEONVFParmv8-a 上是必需的。

因此无需在运行时检查 aarch64 的可用性。

我会完全放弃 aarch32 支持。

【讨论】:

非常感谢您,这对我来说是个好消息。无论如何,我并不打算支持任何 32 位平台。我应该以某种方式验证处理器是 armv8-a 还是更新版本,还是有人必须破解 64 位操作系统才能在旧芯片上运行,我不应该浪费我的时间? 在 Armv8 之前没有 64 位,因此不可能在任何旧版本上运行 64 位操作系统。

以上是关于如何在运行时检测 NEON 和 Helium 指令集的可用性的主要内容,如果未能解决你的问题,请参考以下文章

在 NEON armv8 程序集中存储指令

我们还需要在运行时使用新的 abi arm64-v8a 检测对霓虹灯的支持吗?

使用 NEON 指令加速级联双二阶 - 它是如何工作的?

包含 NEON 或 VFP3 指令的 ELF?

如何访问 NEON 指令中的完整 128 位?

js杂记