我正在开发一个跨平台并行数学库,我已经在实现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配置文件(用于"应用程序使用")无关。
NEON
和VFP
在armv8-a
上是强制性的。
因此不需要在运行时检查aarch64
的可用性。
我会完全放弃aarch32
支持。