2012-07-17 5 views
8

Ich habe ein wenig über die CPU-Funktionen gelernt und stolperte über NEON.Wie nutzen Android-Programme NEON SIMD?

Von dem, was ich gelesen habe, sieht es aus wie NEON erfordert spezielle Programmierung, um dies zu verwenden, aber das ist völlig richtig, oder die CPUs, die diese Funktion haben immer noch Wege finden, Medienprozess für einige Anwendungen sogar zu beschleunigen obwohl es keinen spezifischen Code dafür gibt?

+0

Die Befehlssatzerweiterungen müssen durch * etwas * (Treiber/Kernel/C-Bibliothek usw.) angesprochen werden. –

+0

In dem Sinne, dass der Android-Compiler dies bis zu einem gewissen Grad tun wird (da nicht alle CPUs die Funktion haben.)? Ich sehe das wie die MMX-Erweiterungen, die die Intel-CPUs hatten, von denen ich glaube, dass sie ursprünglich vom Programmierer angesprochen werden mussten, dann glaubten Compiler einfach, dass es existierte, dann wurde es antiquiert. – Tam

+1

Es könnte einige Optimierungen geben, die Compiler nutzen können - - aber für diejenigen, die "60% -150% Zahlen" beanspruchen, braucht es immer noch Handcodierung und intrinsisches Wissen über den Gebrauch .. (Nicht, dass Sie ein komplettes Programm in der Montage schreiben würden, sondern die schwerfälligen Teile von CODECs oder 3D-Transformationen usw.) –

Antwort

9

Es gibt eine Reihe von Möglichkeiten, die NEON-Anweisungen zu verwenden. Einige von ihnen sind:

  • Librarires. Es ist eine gute Chance, dass Ihr Memcpy mit NEON handgefertigt wird. Musik-/Videowiedergabe-Bibliotheken in der API verwenden NEON und/oder GPU zur Beschleunigung. Aso, es gibt Third-Pary-Bibliotheken, die es benutzen. FastCV von Qualcomm ist ein gutes Beispiel
  • Compiler-ausgegebene Anweisungen. Einige Compiler mit den richtigen Compileroptionen geben NEON-Anweisungen aus. Die meisten Compiler werden Neon für Float-Operationen verwenden, aber nicht vektorisieren. Sie werden das Gerät als einzelne Dateneinheit verwenden, nur weil es schnell und bequem ist. Es gibt einige Vektorisierungsfähigkeiten in GCC und ARM-Compiler, aber sie sind in Umfang und Ergebnissen wirklich begrenzt.
  • Handcodiertes C mit intrinsischen Eigenschaften http://gcc.gnu.org/onlinedocs/gcc/ARM-NEON-Intrinsics.html Es ist wahrscheinlich der beste Weg, um in der NEON-Welt zu beginnen.
  • Handcodierter Assembler. Dies scheint das Beste zu sein, wenn Sie maximale Leistung erreichen wollen. Es erfordert auch eine Menge Mühe und CS-Kenntnisse.

  • Und, nicht zuletzt, können Sie NEON verwenden, indem Sie nur eine App herunterladen, die es verwendet. Ihr Lieblings-Musik-Player bringt wahrscheinlich für einen guten Zweck die NEON-Einheit in Ihrem Smartphone :)

Fazit: NEON viele Verwendungen hat, aber es wird nur verwendet, wenn der Code speziell NEON Anweisungen enthält. Technisch, wie @pst sagte, muss es Ziel durch ein Stück Code sein.

+0

Danke. Bedeutet Ihre Erwähnung der Musik-/Videowiedergabe, dass Android sie automatisch verwendet (dh kompiliert), wenn wir den SoundPool verwenden? (Ich habe bemerkt, einen großen Unterschied in der Geschwindigkeit des Startens eines Soundeffekts für zwei Telefone, eines mit und ohne Neon in den CPU-Funktionen aufgelistet.) – Tam

+0

Wahrscheinlich bietet Android eine optimierte Version für seine Audio-API, für den Einsatz mit Telefone, die NEON usw. unterstützen, und einfache C++ - Versionen für Benutzer ohne NEON. Ich habe den Android-Quellcode oder Treiber nicht überprüft, aber dies ist ein Standardmodell. – Sam