2010-06-09 21 views
13

Ich habe begonnen, mit dem Android NDK zu spielen. Eines der Dinge, die ich gerade gelernt habe, ist das Erstellen einer application.mk Datei, um das armv7 abi anzugeben.Erhalten von Hardware Gleitpunkt mit Android NDK

Ich baue das san-angeles Beispiel mit den folgenden Parametern.

APP_MODULES  := sanangeles 
APP_PROJECT_PATH := $(call my-dir)/../ 
APP_OPTIM  := release 
APP_ABI   := armeabi-v7a 

Dies scheint jedoch mit genau der gleichen Geschwindigkeit wie vorher (dh schlecht) zu laufen. Bin ich nur GL limitiert und nicht CPU-limitiert oder stimmt hier etwas nicht?

ich bemerkt habe, wenn ich kompilieren, dass ich die folgenden Befehlszeilenoptionen emittiert erhalten:

-march=armv7-a -mfloat-abi=softfp -mfpu=vfp -mthumb 

Die Sache, die mir Sorgen gibt es die „softfp“. Es gibt eine Erwähnung des v7 abi, des VFP-fpu-Zeugs und ich vermute, der "Daumen" bezieht sich auf die "Daumen-2" -Instruktionen (obwohl ich nicht weiß, was genau diese sind). Allerdings betrifft mich "softfp". Sollte es nicht "hardfp" sein?

Wer hat irgendwelche Ideen zu diesen Fragen? Ich denke, ich bin wahrscheinlich bereit, ein paar GL ES 2.0 Code für mein HTC Desire zu implementieren, aber ich möchte sicherstellen, dass ich die bestmögliche Geschwindigkeit daraus bekomme :)

Prost im Voraus!

Antwort

32

Die Optionen, die Sie dem NDK zur Verfügung stellen, wirken sich nur auf die Art und Weise aus, wie Ihr Code kompiliert wird. Es wird die GL-Bibliotheken oder irgendetwas anderes, das Teil der Plattform ist, nicht ändern, die immer in einer geeigneten Weise erzeugt werden. Wenn Sie nur Geometrie auf die GL-Hardware werfen, werden Sie keinen Unterschied sehen.

Wenn Sie sehen möchten, ob Ihre Optionen eine Wirkung haben, laden Sie einen einfachen Benchmark herunter, oder erstellen Sie einen einfachen Benchmark, der eine Reihe von Operationen mit Gleitkommawerten mit doppelter Genauigkeit ausführt und wie lange vorher und nachher ausgeführt wird .

Das Argument -mfloat-abi = softp bestimmt, wie Gleitkommawerte zwischen Funktionen übergeben werden. softfp bedeutet, dass sie immer in Integer-Registern oder auf dem Stack übergeben werden. Wenn Android keinen Softfp angibt, würde die ARMv7-A-Version der Bibliothek erwarten, dass Floats in Hardwareregistern angezeigt werden, und jeglicher für ARMv5TE erstellte Code würde brechen.

"softfp" fügt einigen Funktionen einen kleinen Overhead hinzu, aber die Anweisungen zum Verschieben von Werten in und aus fp-Registern sind bei ARM billig, und die mitgelieferte ABI-Kompatibilität lohnt sich.

Das "-thumb" ermöglicht die Generierung von Thumb/Thumb2-Code. Der Thumb-Code ist tendenziell etwas langsamer, aber etwas kleiner als der äquivalente ARM. Manchmal bedeutet das, dass Sie besser in den CPU-i-Cache passen und schneller laufen. Größe ist immer ein Problem auf diesen Geräten, daher ist Thumb standardmäßig aktiviert.

Im Zweifelsfall zeigt "arm-eabi-objdump -d whatever.o" eine Zerlegung des Codes an.

Aktualisierung:NDK r9b zusätzliche Unterstützung für -mhard-float. Auf diese Weise können Sie NDK-Bibliotheken mit Hard-Float-API-Konventionen für Armea-v7a-Ziele erstellen.

+1

Entschuldigung, ich muss die Tatsache verpasst haben, dass Sie diese Frage beantwortet haben. Gute Antwort :) – Goz