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



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

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

你甚至需要手动检测它还是你可以使用预处理器定义(如_M_ARM64)来检查运行时支持?这是我的理解,预处理器宏只在编译时求值。

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

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

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

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

NEONVFParmv8-a上是强制性的。

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

我会完全放弃aarch32支持。

相关内容

  • 没有找到相关文章

最新更新