如何确定给定 ARM 处理器上是否存在 NEON 引擎?为此目的可以查询任何状态/标志寄存器吗?
我相信unixsmurf的答案与使用具有特权内核的操作系统一样好。对于通用功能检测,ARM 似乎要求从操作系统获取此信息,因此您必须使用操作系统 API 来获取它。
#include <cpu-features.h>
和 (android_getCpuFamily() == ANDROID_CPU_FAMILY_ARM) && (android_getCpuFeatures() & ANDROID_CPU_ARM_FEATURE_NEON)
。请注意,这是针对 32 位 ARM 的。 ARM 64 位有不同的标志,但想法是相同的。请参阅来源/文档。#include <sys/auxv.h>
和 #include <asm/hwcap.h>
以及 getauxval(AT_HWCAP) & HWCAP_NEON
。__ARM_NEON__
来确保编译时一切都按顺序进行。实际上你会看到很多 Android 实现只是解析 /proc/cpuinfo 来实现 android_getCpuFeatures().... 呵呵。但它似乎仍在得到改进,最新版本使用 getauxval 方法。
一种可靠的方法是检查架构特征陷阱寄存器。例如,在 ARM Cortex A35 上,您可以检查 HCPTR 寄存器的值来查看 NEON 是否已实现(0x000033FF)或未实现(0x0000BFFF)。寄存器名称和指示值取决于平台,请务必检查技术参考手册。
有办法检查是否支持 Neon 和 sve 吗? 我看到有人谈论过 HCPTR 寄存器,但它似乎与 neon 没有任何关系,而且根据文档,它看起来像是 Aarch32 指令 https://developer.arm.com/docs/ddi0595/g/aarch32-system-registers/hcptr
如果
/proc/config.gz
存在,您可以使用以下命令测试内核中的 NEON 支持:
zcat /proc/config.gz | grep NEON
如果 NEON 单元存在,则命令输出:
CONFIG_NEON=y
为了确保处理器支持 NEON 扩展,您可以发出命令:
cat /proc/cpuinfo | grep neon
如果支持NEON扩展,则输出显示neon,例如:
# cat /proc/cpuinfo | grep neon
Features : half thumb fastmult vfp edsp thumbee neon vfpv3 tls vfpv4 idiva idivt vfpd32 lpae evtstrm
Features : half thumb fastmult vfp edsp thumbee neon vfpv3 tls vfpv4 idiva idivt vfpd32 lpae evtstrm