【问题标题】:How to check the existence of NEON on arm?如何检查手臂上NEON的存在?
【发布时间】:2014-12-29 08:14:04
【问题描述】:

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

【问题讨论】:

  • 有大量的协处理器寄存器可用于为您提供有关该内核支持和不支持的内容的详细信息。获取该内核或类似内核的 TRM 以查看这些寄存器所在的位置。
  • 我相信 ARM 处理器是按照标准设计的。这些信息和那些寄存器实际上是有特权的;因此,在 Linux 下,您必须查看 /proc/cpuinfo 以查找 NEON 或 Advanced SIMD 标志。对于特权代码,请查看 ARMv7 架构参考手册,第 B3.12.19 c1 节,协处理器访问控制寄存器 (CPACR);该寄存器的第 31 位是您想要的。
  • CPACR 的第 31 位在设置为 1 时禁用 NEON 指令解码,这似乎不是检测 NEON 引擎的直接方法。
  • @Thomson 立即阅读以下内容; 在以下实现中: 同样,如果支持,该位将重置为零。
  • 虽然评论似乎与@Thomson 的场景无关,但我会继续做我破纪录的事情,并指出解析 /proc/cpuinfo 是从不正确答案。 HWCAPS 是从 Linux 用户态进程确定 CPU 特性的方法。 community.arm.com/groups/android-community/blog/2014/10/10/…

标签: arm neon


【解决方案1】:

我相信unixsmurf's answer 与使用具有特权内核的操作系统一样好。对于通用功能检测,似乎 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 位有不同的标志,但想法是一样的。请参阅sources/docs
  • 在 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 方法。

【讨论】:

  • iOS 5 及更高版本支持的所有 iOS 硬件都有 NEON;你可以简单地假设 NEON 存在,不需要任何检查(但如果你真的想的话,你可以使用 sysctl 动态检查)。
  • 在 Android NDK 上检查 (android_getCpuFamily() == ANDROID_CPU_FAMILY_ARM && (android_getCpuFeatures() & ANDROID_CPU_ARM_FEATURE_NEON) != 0)
  • 谢谢,是的,我更新了......显然现在使用 ARM64 等更复杂了。
  • 认为 getauxval(AT_HWCAP) & HWCAP_NEON 适用于 Aarch64,但不适用于 Aarch32。我相信您还需要检查其他定义。
  • HWCAP_NEON 用于Aarch32HWCAP_ASIMD 用于Aarch64
【解决方案2】:

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

【讨论】:

    【解决方案3】:

    有没有办法检查是否支持 Neon 和 sve? 我看到有人对 HCPTR 寄存器说了一些话,但它似乎与霓虹灯没有任何关系,而且根据文档看起来是 Aarch32 指令 https://developer.arm.com/docs/ddi0595/g/aarch32-system-registers/hcptr

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-07-03
      • 2023-03-17
      • 2018-01-18
      相关资源
      最近更新 更多