2014-11-02 8 views
11

Come determinare se il motore NEON esiste sul processore ARM dato? Qualunque stato/registro flag può essere interrogato per tale scopo?Come verificare l'esistenza di NEON a braccio?

+1

ci sono un sacco di registri coprocessore che sono lì per quello scopo per darti i dettagli cruenti su cosa è supportato in quel core e cosa non lo è. ottenere il TRM per quello o un nucleo simile per vedere dove vivono questi registri. –

+2

Credo che i processori ARM siano progettati per l'uso queste informazioni e quei registri sono in realtà privilegiati; Sotto Linux, quindi, devi guardare '/ proc/cpuinfo' per cercare il flag NEON o Advanced SIMD. Per il codice privilegiato, consultare il Manuale di riferimento Architettura ARMv7, Sezione _B3.12.19 c1, Registro di controllo accessi coprocessore (CPACR) _; Il bit 31 di quel registro è quello che vuoi. –

+0

Il bit 31 di CPACR disattiva le istruzioni NEON quando si imposta su 1, il che non sembra un modo diretto per rilevare il motore NEON. – Thomson

risposta

10

Credo che lo unixsmurf's answer sia circa buono come si otterrà se si utilizza un sistema operativo con kernel privilegiato. Per il rilevamento di funzioni generiche, sembra che ARM abbia richiesto di ottenere questo dal sistema operativo, e quindi è necessario utilizzare un'API del sistema operativo per ottenerlo.

  • Su Android NDK utilizzare #include <cpu-features.h> con (android_getCpuFamily() == ANDROID_CPU_FAMILY_ARM) && (android_getCpuFeatures() & ANDROID_CPU_ARM_FEATURE_NEON). Nota questo è per ARM a 32 bit. ARM 64 bit ha bandiere diverse ma l'idea è la stessa. Vedi lo sources/docs.
  • Su Linux, se disponibile, utilizzare #include <sys/auxv.h> e #include <asm/hwcap.h> con getauxval(AT_HWCAP) & HWCAP_NEON.
  • In iOS, non sono sicuro che ci sia una chiamata dinamica, la metodologia sembra essere quella di costruire l'app per il targeting NEON, quindi assicurati che l'app sia contrassegnata per richiedere NEON in modo che venga installata solo sui dispositivi che la supportano . Ovviamente dovresti usare il flag preprocessore predefinito __ARM_NEON__ per assicurarti che tutto sia in ordine al momento della compilazione.
  • Su qualunque Microsoft fa o se si utilizza alcuni altri RTOS ... non so ...

realtà vedrete un sacco di implementazioni di Android che ha appena parse/proc/cpuinfo in per implementare android_getCpuFeatures() .... Heh. Ma sembra che stia migliorando e le versioni più recenti usano il metodo getauxval.

+1

Tutti gli hardware iOS supportati da iOS 5 e successivi hanno NEON; si può semplicemente supporre che NEON sia presente, non è necessario alcun controllo (ma si potrebbe verificare dinamicamente usando 'sysctl' se lo si desidera realmente). –

+1

Su Android NDK verificare se (android_getCpuFamily() == ANDROID_CPU_FAMILY_ARM && (android_getCpuFeatures() e ANDROID_CPU_ARM_FEATURE_NEON)! = 0) – VMMF

+0

Grazie, sì, ho aggiornato .... ovviamente più complicato ora con ARM64 ecc –