2014-11-02 41 views
11

如何確定在給定的ARM處理器上是否存在NEON引擎?任何狀態/標誌寄存器可以被查詢用於這種目的?如何檢查NEON的存在?

+1

有大量的協處理器寄存器可用於此目的,以便爲您提供關於該內核支持的內容以及什麼不是的詳細信息。獲得該或類似核心的TRM以查看這些寄存器的存在位置。 – 2014-11-02 16:03:26

+2

我相信ARM處理器被設計成s.t.這些信息和這些寄存器實際上是有特權的;因此,在Linux下,您必須查看'/ proc/cpuinfo'來查找NEON或高級SIMD標誌。有關特權代碼,請參見ARMv7體系結構參考手冊,_B3.12.19 c1協處理器訪問控制寄存器(CPACR)_;該寄存器的第31位是你想要的。 – 2014-11-02 16:06:24

+0

當設置爲1時,CPACR的第31位禁用NEON指令解除鎖定,這似乎不是檢測NEON引擎的直接方式。 – Thomson 2014-11-02 16:14:45

回答

10

我相信unixsmurf's answer是一樣好,你會得到如果使用具有特權內核的操作系統。對於通用功能檢測,似乎ARM已經要求從OS獲取此功能,因此您必須使用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位有不同的標誌,但想法是一樣的。請參閱sources/docs
  • 在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方法。

+1

iOS 5及更高版本支持的所有iOS硬件均具有NEON;你可以簡單地假設NEON是存在的,不需要任何檢查(但如果你真的想要的話,你可以使用'sysctl'動態檢查)。 – 2014-11-14 22:43:13

+1

在Android NDK檢查 如果(android_getCpuFamily()== ANDROID_CPU_FAMILY_ARM && (android_getCpuFeatures()ANDROID_CPU_ARM_FEATURE_NEON)!= 0) – VMMF 2016-08-24 02:22:34

+0

謝謝你,是的,我更新....顯然更爲複雜的現在ARM64等 – 2016-08-24 16:35:13