2010-06-09 20 views
13

He comenzado a jugar con el NDK de Android. Una de las cosas que acabo de aprender es sobre la creación de un archivo application.mk para especificar el armv7 abi.Obtener hardware punto flotante con Android NDK

Estoy construyendo el ejemplo de san-angeles con los siguientes parámetros.

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

Sin embargo, esto parece funcionar exactamente a la misma velocidad que antes (es decir, mal). ¿Estoy solo GL limitado y no limitado por CPU o hay algo mal aquí?

he notado cuando compilo que consigo las siguientes opciones de línea de comandos emitidos:

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

Lo que me preocupa no es la "softfp". HAY una mención del v7 abi, el material de FFP de VFP y supongo que el "pulgar" se refiere a las instrucciones del "pulgar 2" (aunque no sé exactamente cuáles son). Sin embargo, ese "softfp" me preocupa. ¿No debería ser "hardfp"?

¿Alguien tiene alguna idea sobre estas preguntas? Creo que probablemente estoy listo para comenzar a implementar algún código GL ES 2.0 para mi HTC Desire, pero me gustaría asegurarme de obtener la mejor velocidad posible :)

¡Saludos por adelantado!

Respuesta

32

Las opciones que suministre al NDK solo afectarán la forma en que se compila su código. No cambiará las librerías GL o cualquier otra cosa que sea parte de la plataforma, que siempre se generan de manera apropiada. Si solo está lanzando geometría en el hardware GL, no verá la diferencia.

Si quiere ver si sus opciones están teniendo un efecto, descargue (o cree) un punto de referencia simple que realiza un montón de operaciones con valores de punto flotante de precisión doble, y tiempo cuánto tarda en ejecutarse antes y después .

El argumento -mfloat-abi = softp determina cómo se pasan los valores de coma flotante entre las funciones. softfp significa que siempre pasan en registros enteros o en la pila. Si Android no especificó softfp, la versión ARMv7-A de la biblioteca esperaría que aparecieran flotantes en los registros de hardware, y cualquier código creado para ARMv5TE se rompería.

"softfp" agrega un poco de sobrecarga a algunas funciones, pero las instrucciones para mover valores dentro y fuera de los registros fp son baratas en ARM, y la compatibilidad ABI provista lo hace que valga la pena.

El "-mthumb" permite la generación de código Thumb/Thumb2. El código de pulgar tiende a ser un poco más lento pero un poco más pequeño que el ARM equivalente; a veces más pequeño significa que se ajustará mejor en la i-caché de la CPU y, de hecho, se ejecutará más rápido. El tamaño siempre es una preocupación en estos dispositivos, por lo que Thumb está habilitado por defecto.

En caso de duda, "arm-eabi-objdump -d whatever.o" le mostrará un desmontaje de su código.

Actualización:NDK r9b añadido soporte para -mhard-float. Esto le permite construir librerías NDK con convenciones de hard-float API para objetivos armeabi-v7a.

+1

Lo siento, debo haber perdido el hecho de que respondió esta pregunta. Gran respuesta :) – Goz