2010-06-09 18 views
13

J'ai commencé à jouer avec l'android NDK. L'une des choses que je viens d'apprendre concerne la création d'un fichier application.mk pour spécifier l'abi armv7.Obtention de virgule flottante matérielle avec android NDK

Je construis l'exemple de san-angeles avec les paramètres suivants.

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

Cependant, cela semble fonctionner exactement à la même vitesse qu'avant (c'est-à-dire mal). Suis-je juste limité et pas limité CPU ou est-ce quelque chose de mal ici?

Je l'ai remarqué quand je compile que je reçois les options de la ligne de commande suivante émis:

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

Ce qui me préoccupe, il y a le « softfp ». Il est fait mention de la v7 abi, les trucs VFP fpu et je suppose que le "pouce" se réfère aux instructions "pouce-2" (Bien que je ne sais pas exactement ce que ce sont). Cependant ce "softfp" ne me concerne pas. Ne devrait-il pas être "hardfp"?

Quelqu'un a-t-il des idées sur ces questions? Je pense que je suis probablement prêt à commencer à implémenter du code GL ES 2.0 pour mon HTC Desire mais je voudrais m'assurer que j'en tire la meilleure vitesse possible :)

Bravo à l'avance!

Répondre

32

Les options que vous fournissez au NDK n'affectent que la manière dont votre code est compilé. Cela ne changera pas les librairies GL ou toute autre partie de la plate-forme, qui sont toujours générées de manière appropriée. Si vous lancez simplement la géométrie sur le matériel GL, vous n'allez pas voir une différence. Si vous voulez voir si vos options ont un effet, téléchargez (ou créez) un benchmark simple qui fait un tas d'opérations avec des valeurs à virgule flottante double précision, et le temps qu'il faut pour exécuter avant et après .

L'argument des -mfloat-abi = détermine comment les valeurs à virgule flottante sont passés entre les fonctions. softfp signifie qu'ils sont toujours passés dans des registres entiers ou sur la pile. Si Android ne spécifiait pas softfp, la version ARMv7-A de la bibliothèque s'attendait à ce que les flottants apparaissent dans les registres matériels, et tout code construit pour ARMv5TE serait cassé. "Softfp" ajoute un peu de surcharge à certaines fonctions, mais les instructions pour déplacer des valeurs dans et hors des registres fp sont bon marché sur ARM, et la compatibilité ABI fournie le rend utile.

Le "-mthumb" permet la génération du code Thumb/Thumb2. Le code du pouce a tendance à être un peu plus lent mais un peu plus petit que l'ARM équivalent; parfois plus petit signifie que vous vous adapterez mieux dans le CPU i-cache et que vous courrez plus vite. La taille est toujours un problème sur ces périphériques, donc Thumb est activé par défaut.

En cas de doute, "bras-eabi-objdump -d whatever.o" vous montrera un démontage de votre code.

Mise à jour:NDK r9b ajouté le support de -mhard-float. Cela vous permet de construire des bibliothèques NDK avec des conventions d'API hard-float pour les cibles armeabi-v7a.

+1

Désolé, je dois avoir raté le fait que vous avez répondu à cette question. Très bonne réponse :) – Goz