问题 如何检查手臂上是否存在NEON?


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


10097
2017-11-02 15:58


起源

有大量的协处理器寄存器用于此目的,为您提供有关该核心支持的内容和不是什么的详细信息。得到那个或类似核心的TRM,看看这些寄存器的存在位置。 - old_timer
我相信ARM处理器是专为s.t.设计的。这些信息和那些寄存器实际上是特权的;因此,在Linux下,你必须看一下 /proc/cpuinfo 查找NEON或高级SIMD标志。有关特权代码,请参阅“ARMv7体系结构参考手册”一节 B3.12.19 c1,协处理器访问控制寄存器(CPACR);该寄存器的第31位是您想要的。 - Iwillnotexist Idonotexist
当设置为1时,CPACR的位31禁用NEON指令,这似乎不是检测NEON引擎的直接方法。 - Thomson
@Thomson立即阅读; 在一个实现: 同样,如果支持,该位将重置为零。 - Iwillnotexist Idonotexist
虽然评论看起来与@Thomson的场景无关,但我会继续做我破碎的记录事情,并指出解析/ proc / cpuinfo是 决不 正确答案。 HWCAPS是从Linux用户空间进程确定CPU功能的方法。 community.arm.com/groups/android-community/blog/2014/10/10/... - unixsmurf


答案:


我相信 unixsmurf的回答 如果使用具有特权内核的操作系统,那么就像你将获得的一样好。对于通用功能检测,似乎ARM已经要求从操作系统获取此功能,因此您必须使用OS 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__ 确保在编译时一切正常。
  • 无论微软做什么,或者你正在使用其他一些RTOS ......我不知道......

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


11
2017-11-14 00:11



iOS 5及更高版本支持的所有iOS硬件都具有NEON;你可以简单地假设NEON存在,不需要任何检查(但你可以动态检查使用 sysctl 如果你真的想)。 - Stephen Canon
在Android NDK上检查是否(android_getCpuFamily()== ANDROID_CPU_FAMILY_ARM &&(android_getCpuFeatures()&ANDROID_CPU_ARM_FEATURE_NEON)!= 0) - VMMF
谢谢,是的,我更新....现在使用ARM64等显然更复杂 - Peter M
一世 认为  getauxval(AT_HWCAP) & HWCAP_NEON 适用于Aarch64,但不适用于Aarch32。我相信还有其他需要检查的定义。 - jww
HWCAP_NEON 是为了 Aarch32,和 HWCAP_ASIMD 是为了 Aarch64 - watertavi