Erkennen-ARM-NEON-Verfügbarkeit in der Präprozessor?
Entsprechend der ARM ARM, __ARM_NEON__
definiert ist, wenn die Neon-SIMD-Befehle sind verfügbar. Ich bin mit Mühe GCC zur Verfügung stellen.
Neon auf dieser BananaPi Pro dev board, auf dem Debian 8.2:
$ cat /proc/cpuinfo | grep neon
Features : swp half thumb fastmult vfp edsp neon vfpv3 tls vfpv4 idiva idivt
Ich bin mit GCC 4.9:
$ gcc --version
gcc (Debian 4.9.2-10) 4.9.2
Versuchen GCC und -march=native
:
$ g++ -march=native -dM -E - </dev/null | grep -i neon
#define __ARM_NEON_FP 4
OK, versuchen Sie, was Google-Anwendungen für Android, wenn die Gebäude für die Neon:
$ g++ -march=armv7-a -mfpu=vfpv3-d16 -mfloat-abi=softfp -dM -E - </dev/null | grep -i neon
#define __ARM_NEON_FP 4
Vielleicht ein ARMv7-a mit einem hard-float:
$ g++ -march=armv7-a -mfloat-abi=hard -dM -E - </dev/null | grep -i neon
#define __ARM_NEON_FP 4
Meine Fragen sind:
- warum bin ich nicht zu sehen
__ARM_NEON__
? - wie erkenne ich, Neon-Verfügbarkeit in der Präprozessor?
Und vielleicht:
- was GCC-Schalter sollte ich verwenden, um zu ermöglichen, Neon-SIMD-Befehle?
Verwandte, auf eine LeMaker HiKey, die AARCH64/ARM64 läuft mit Linaro GCC 4.9.2, hier ist die Ausgabe vom Präprozessor:
$ cpp -dM </dev/null | grep -i neon
#define __ARM_NEON 1
Laut, zu ARM, dieses board ist der Erweiterte SIMD-Befehle obwohl:
$ cat /proc/cpuinfo
Processor : AArch64 Processor rev 3 (aarch64)
...
Features : fp asimd evtstrm aes pmull sha1 sha2 crc32
-mfpu=neon
oder vielleicht-mfpu=neon-vfpv4
.- Danke @EOF. Ich muss überprüfen Sie die Android-build-flags, um zu sehen, warum es nicht sein verwendet für AOSP toolchains (oder vielleicht ist es, und meine Notizen sind unvollständig/defekt).
Du musst angemeldet sein, um einen Kommentar abzugeben.
Gibt es eine Reihe von Fragen, hier versteckt, ich werde versuchen, Sie zu extrahieren in der Reihe...
Ist compiler-Dokumentation für die [alte version] der ARM-Compiler anstatt den ARM Architceture Referenz-Handbuch. Ein besseres makro zum überprüfen auf das Vorhandensein der Erweiterten SIMD-Anweisungen wäre
__ARM_NEON
definiert in der ARM-C-Spracherweiterungen.Als Sie kann gefunden haben. GCC für ARM-target trennt sich
-march
(Für die Architektur Version für die GCC sollte code generieren),-mfpu
(Für die floating-point - /Advanced SIMD-Einheit) und-mfloat-abi
(wie floating-point-Argumente übergeben werden sollen, und für die Anwesenheit oder Abwesenheit einer floating-point-unit). Schließlich gibt es-mtune
(der fragt, GCC, um zu versuchen zu optimieren, für einen bestimmten Prozessor)-mcpu
(die fungiert als eine Kombination von-mtune
und-march
).Indem er für
-march=native
Sie sich Fragen, GCC, code zu erzeugen, geeignet für die erkannten Architektur des Prozessors, auf dem Sie ausgeführt werden. Dies hat keine Auswirkungen auf die-mfpu
Einstellung, und damit nicht unbedingt aktivieren der Erweiterten SIMD instruction generation.Beachten Sie, dass die oben gilt nur für einen compiler targeting AArch32. Die AArch64 GCC nicht unterstützt
-mfpu
und erkennen die Präsenz von Advanced SIMD-Unterstützung durch-march=native
.Diese build-flags sind nicht ausreichend, um aktivieren Sie die Unterstützung für Erweiterte SIMD-Befehle, Ihre Angaben können unvollständig sein. Der
-mfpu
flags unterstützt von GCC 4.9.2 würde ich erwarten, dass jede von:neon
,neon-fp16
,neon-vfpv4
,neon-fp-armv8
,crypto-neon-fp-armv8
Ihnen geben, was Sie wollen.
Sieht aus wie du bist auf einem AArch64-kernel, der stellt Unterstützung für die Advanced SIMD durch die
asimd
Funktion - wie in Ihrem Beispiel-Ausgabe.__ARM_NEON
. Älteren gcc (wie 5.4) definiert__ARM_NEON
und__ARM_NEON__
. gcc5.4 und gcc6.3 definieren Sie__ARM_FEATURE_SIMD32 1
. godbolt.org/g/LmPjDq Ist es das, was man überprüfen sollte?-mfloat-abi=hard
an die Befehlszeile. Sie vielleicht wollen, melden Sie diese Konfiguration Differenz als ein Fehler mit dem Eigentümer des Dienstes.__ARM_FEATURE_SIMD32
bezieht sich auf einen anderen Teil des instruction-set - diese arbeiten auf eine gepackte 8-bit-Werte in der 32-bit-Register, so ist nicht ein Ersatz für__ARM_NEON
.