如何查看手臂上是否有NEON?

问题描述 投票:0回答:4

如何确定给定 ARM 处理器上是否存在 NEON 引擎?为此目的可以查询任何状态/标志寄存器吗?

arm feature-detection neon
4个回答
15
投票

我相信unixsmurf的答案与使用具有特权内核的操作系统一样好。对于通用功能检测,ARM 似乎要求从操作系统获取此信息,因此您必须使用操作系统 API 来获取它。

  • 在 Android NDK 上使用
    #include <cpu-features.h>
    (android_getCpuFamily() == ANDROID_CPU_FAMILY_ARM) && (android_getCpuFeatures() & ANDROID_CPU_ARM_FEATURE_NEON)
    。请注意,这是针对 32 位 ARM 的。 ARM 64 位有不同的标志,但想法是相同的。请参阅来源/文档
  • 在 Linux 上,如果可用,请使用
    #include <sys/auxv.h>
    #include <asm/hwcap.h>
    以及
    getauxval(AT_HWCAP) & HWCAP_NEON
  • 在 iOS 上,我不确定是否存在动态调用,方法似乎是您构建针对 NEON 的应用程序,然后确保您的应用程序被标记为需要 NEON,因此它只会安装在支持它的设备上。当然,您应该使用预定义的预处理器标志
    __ARM_NEON__
    来确保编译时一切都按顺序进行。
  • 无论 Microsoft 做什么,或者您是否正在使用其他 RTOS...我不知道...

实际上你会看到很多 Android 实现只是解析 /proc/cpuinfo 来实现 android_getCpuFeatures().... 呵呵。但它似乎仍在得到改进,最新版本使用 getauxval 方法。


1
投票

一种可靠的方法是检查架构特征陷阱寄存器。例如,在 ARM Cortex A35 上,您可以检查 HCPTR 寄存器的值来查看 NEON 是否已实现(0x000033FF)或未实现(0x0000BFFF)。寄存器名称和指示值取决于平台,请务必检查技术参考手册。


0
投票

有办法检查是否支持 Neon 和 sve 吗? 我看到有人谈论过 HCPTR 寄存器,但它似乎与 neon 没有任何关系,而且根据文档,它看起来像是 Aarch32 指令 https://developer.arm.com/docs/ddi0595/g/aarch32-system-registers/hcptr


0
投票

如果

/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

参见 学习架构 - Neon 程序员指南

© www.soinside.com 2019 - 2024. All rights reserved.