Arm 如何检查手臂上是否存在霓虹灯?

Arm 如何检查手臂上是否存在霓虹灯?,arm,neon,Arm,Neon,如何确定给定ARM处理器上是否存在霓虹灯引擎?任何状态/标志寄存器都可以为此目的进行查询?我相信,如果您使用具有特权内核的操作系统,您将获得的效果差不多。对于通用功能检测,似乎ARM已经要求从操作系统获取此功能,因此您必须使用操作系统API来获取它 在Android NDK上使用#包括(Android_getCpuFamily()==Android_CPU_FAMILY_ARM)和&(Android_getCpuFeatures()&Android_CPU_ARM_FEATURE_NEON)。

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

我相信,如果您使用具有特权内核的操作系统,您将获得的效果差不多。对于通用功能检测,似乎ARM已经要求从操作系统获取此功能,因此您必须使用操作系统API来获取它

  • 在Android NDK上使用
    #包括
    (Android_getCpuFamily()==Android_CPU_FAMILY_ARM)和&(Android_getCpuFeatures()&Android_CPU_ARM_FEATURE_NEON)
    。注意这是针对32位ARM的。ARM 64位具有不同的标志,但其思想是相同的。看
  • 在Linux上,如果可用,使用
    #include
    #include
    getauxval(AT_HWCAP)&HWCAP
  • 在iOS上,我不确定是否存在动态调用,方法似乎是您构建针对NEON的应用程序,然后确保您的应用程序标记为需要NEON,这样它将只安装在支持NEON的设备上。当然,您应该使用预定义的预处理器标志
    \uuuu ARM\u NEON\uuu
    来确保编译时一切正常
  • 无论Microsoft做什么,或者您正在使用其他RTO。。。我不知道

实际上,您将看到许多Android实现,它们只是解析/proc/cpuinfo以实现Android_getCpuFeatures()。。。。呵呵。但它似乎仍在不断改进,最新版本使用了getauxval方法。

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

是否需要检查Neon和sve是否受支持? 我看到有人在谈论HCPTR寄存器,但它似乎与neon没有任何关系,而且根据文档,它看起来是AARC32指令

有大量的协处理器寄存器可用于此目的,为您提供关于该内核支持什么和不支持什么的详细信息。获取该内核或类似内核的TRM,查看这些寄存器的位置。我相信ARM处理器是s.t.设计的。这些信息和这些寄存器实际上是有特权的;因此,在Linux下,您必须查看
/proc/cpuinfo
以查找NEON或Advanced SIMD标志。有关特权代码,请参阅ARMv7体系结构参考手册B3.12.19 c1节,协处理器访问控制寄存器(CPACR);寄存器的第31位是您想要的。CPACR的第31位在设置为1时禁用霓虹灯指令去CDING,这似乎不是检测霓虹灯引擎的直接方法。@Thomson在下面读到;在一个实现上:如果支持,位也会重置为零。虽然注释似乎与@Thomson的场景无关,但我会继续做我的破记录工作,并指出解析/proc/cpuinfo永远不是正确的答案。HWCAP是从Linux用户区进程确定CPU特性的方法。iOS 5及更高版本支持的所有iOS硬件都有霓虹灯;你可以简单地假设NEON存在,不需要任何检查(但如果你真的想,你可以使用
sysctl
动态检查)。在Android NDK上检查if(Android_getcpuffamily()==Android_CPU_FAMILY_ARM&(Android_getCpuFeatures()&Android_CPU_ARM_FEATURE_NEON)!=0)谢谢,是的,我更新了。。。。显然,ARM64等现在更复杂了。我认为
getauxval(AT_HWCAP)&HWCAP_NEON
适用于AARC64,但不适用于AARC32。我相信您还需要检查其他定义。
HWCAP\u NEON
用于,而
HWCAP\u ASIMD
用于