J'ai un Application Android qui utilise le NDK pour exécuter une grande quantité de mathématiques de point flottant. Je viens d'acquérir une nouvelle Galaxy Nexus. À ma grande surprise, mon application fonctionne beaucoup plus lentement que nécessaire. Je soupçonne que c'est parce que la plupart des appareils utilisent l'accélération matérielle et le Galaxy Nexus n'est pas. Si j'effectue une opération qui ne nécessite pas de mathématiques de point flottant, le Galaxy Nexus accomplit comment j'attendrais. P>
Voici les spécifications CPU / GPU et les timings des échantillons de plusieurs périphériques. J'ai normalisé les statistiques à prendre en compte Résolution d'affichage: p> J'ai cette configuration dans mon application.mk code> fichier: p>
APP_ABI := armeabi armeabi-v7a
3 Réponses :
Je pense que le problème est qu'il y a 2 noyaux dans le processeur. Ainsi, vous avez 600 MHz pour un noyau. Donc, si votre méthode mathématique utilise un seul thread, cela peut être une réponse. Bien que je ne comprends pas pourquoi il est 2 fois plus lent (temps comparable peut être expliqué). P>
J'ai vu un téléphone commercialisé comme "2 GHz" quand il s'agissait en fait d'un téléphone à double noyau 1 GHz, mais je vous assure que le Galaxy Nexus dispose de deux processeurs de 1,2 GHz.
Vous soulevez un bon point que je devrais multiplier mon code de calcul. Surtout car il serait trivial de le parallementer.
vous pouvez essayer d'utiliser
app_abi: = armée armoire code>
forcer l'utilisation des instructions V7A uniquement.
Je pouvais imaginer que la nouvelle CPU n'est pas détectée comme des instructions V7A et que le code NO-FPU est donc utilisé à l'exécution en tant que retombe. P>
Cela a fonctionné. Cependant, c'est assez déprimant, car maintenant je n'ai aucun moyen de mettre une application sur le marché que tous les téléphones soutiennent. Je détesterais publier deux applications différentes juste à cause de cela.
Personnellement, je suis envisagé dans la direction de Renderscript pour la compatibilité. Et non seulement pour soutenir différents types de processeurs, mais également pour faciliter la mise en œuvre du support multiprocesseur et une éventuelle utilisation du GPU.
Vous pouvez inclure différentes versions d'une bibliothèque natale dans la même application; N'oubliez pas que les libs sont chargés à l'exécution i> via votre code Java. Peut-être que c'est possible de faire la détection FPU à l'intérieur de votre application, par ex. Comme décrit ici , puis chargez la native Lib correspondante.
Cette question Stackoverflow peut être la cause des mauvaises performances de votre Galaxy Nexus: Galaxy Nexus - Mauvais CPU ABI étant sélectionné pendant l'installation de l'heure d'installation . P>
Cela semble être un bug. J'y ai testé également en créant un petit projet à l'aide de code natif et, en effet, Galaxy Nexus choisit la mauvaise bibliothèque (Armeabi au lieu d'Armeabi-v7a). p>
J'ai signalé ce bogue à http: // code. google.com/p/android/issues/detail?id=25321 , avec l'exemple projet ci-joint sur le bogue. Veuillez intégrer cela pour attirer l'attention sur les ingénieurs Android. P>
Oui, c'est exactement le problème. Joué.
Pourriez-vous quantifier
beaucoup plus lent code>?
@Warrenfaith J'ai mis à jour la question avec des chiffres réels.