Réalité ou fiction: les applications Android utilisent un seul cœur de CPU

bras-Cortex-puce-die

Nous avons eu des processeurs multi-core dans nos PC depuis plus d'une décennie, et aujourd'hui, ils sont considérés comme la norme. Au début, il était dual-core, puis quad-core, et aujourd'hui, des sociétés comme Intel et AMD offrent processeurs de bureau haut de gamme avec 6 ou même 8 cores. Processeurs de smartphones ont une histoire similaire. Énergie processeurs dual-core ARM efficaces de arrivés il ya environ 5 ans, et depuis, nous avons vu la libération de base ARM 4, 6 et 8 processeurs de base. Cependant, il ya une grande différence entre les processeurs Core 6 et 8 de bureau d'Intel et d'AMD et le 6, et 8 core basé sur l'architecture ARM - la plupart des processeurs basés ARM avec plus de 4 cœurs utiliser au moins deux conceptions de base différentes.

Bien qu'il existe quelques exceptions, en général, un processeur ARM à base de noyau 8 utilise un système connu sous le nom hétérogène Multi-Processing (HMP) ce qui signifie que tous les noyaux sont égaux (donc hétérogène). Dans un processeur 64 bits moderne, cela signifierait qu'un cluster de cœurs Cortex-A57 ou A72 Cortex-serait utilisé en conjonction avec un cluster de cœurs Cortex-A53. Le A72 est un noyau de haute performance, tandis que l'A53 a une plus grande efficacité énergétique. Cet arrangement est connu comme big.LITTLE où les grands cœurs de processeur Cortex-A72 () sont combinées avec des cœurs de processeur Little (Cortex-A53). Ceci est très différent pour les processeurs de bureau 6 ou 8 fondamentales que nous voyons d'Intel et AMD, que sur la consommation d'énergie de bureau est pas aussi critique que ce soit sur mobile.

L'essentiel à retenir est que un processeur big.LITTLE OCTA-core dispose de huit cœurs pour l'efficacité de puissance, pas pour la performance.

Lorsque processeurs multi-core arriva le premier au bureau, beaucoup de questions ont été soulevées concernant les avantages d'un processeur dual-core sur un processeur simple core. Était un processeur 1.6GHz dual-core "mieux" que d'un processeur simple core 3.2GHz, et ainsi de suite. Qu'en est-il de Windows? Se pourrait-il utiliser un processeur dual-core à son potentiel maximum. Qu'en est-il des jeux - sont-ils pas mieux sur des processeurs single-core? Ne pas les applications doivent être écrites d'une manière particulière d'utiliser les noyaux supplémentaires? Et ainsi de suite.

Multi-traitement primaire

Ce sont des questions légitimes, et bien sûr les mêmes questions ont été posées sur les processeurs multi-core dans les smartphones. Avant de nous pencher sur la question de processeurs multi-core et Android, prenons un peu de recul et de regarder la technologie multi-core en général.

Les ordinateurs sont un très bon une chose à faire. Vous voulez calculer les 100 millions de nombres premiers? Pas de problème, un ordinateur peut tour de boucle et rond toute la journée croquer ces chiffres. Mais au moment où vous voulez un ordinateur de faire deux choses à la fois, comme le calcul de ces primes lors de l'exécution d'une interface graphique de sorte que vous pouvez également naviguer sur le Web, puis soudain, tout devient un peu plus difficile.

Je ne veux pas aller trop en profondeur ici, mais, fondamentalement, il existe une technique connue sous le nom multitâche préemptif qui permet le temps CPU disponible pour être réparti entre plusieurs tâches. Une «tranche» de temps CPU sera accordée à une tâche (un processus), puis une tranche à l'étape suivante, et ainsi de suite. Au cœur des systèmes d'exploitation comme Linux, Windows, OS X, Android est un peu de la technologie appelée un ordonnanceur. Son travail consiste à travailler sur ce qui devrait processus recevoir la prochaine tranche de temps CPU.

A72 ARM Cortex

Ordonnanceurs peuvent être écrits de différentes façons, sur un serveur le planificateur peut être réglé pour donner la priorité à l'exécution de tâches d'E / S (comme l'écriture sur le disque, ou la lecture à partir du réseau), alors que sur un ordinateur de bureau le planificateur sera plus préoccupés par en gardant l'interface graphique réactif.

Quand il ya plus d'un noyau disponible le planificateur peut donner un seul processus d'une tranche de temps sur CPU0, tandis qu'un autre processus devient une tranche de run-time sur CPU1. De cette façon, un processeur dual-core, avec le planificateur, peut permettre deux choses se produisent à la fois. Si vous ajoutez ensuite plusieurs noyaux, puis plusieurs processus peuvent fonctionner simultanément.

Vous aurez remarqué que le planificateur est bon à découper les ressources CPU entre différentes tâches comme le calcul de nombres premiers, exécutant le bureau, et en utilisant un navigateur Web. Toutefois, un seul processus, comme le calcul de primes ne peut être fractionnée sur plusieurs cœurs. Ou peut-il?

Certaines tâches sont séquentielles par nature. Pour faire un gâteau dont vous avez besoin pour casser des œufs, ajouter un peu de farine, faire le mélange à gâteau, etc, et puis à la fin le mettre dans le four. Vous ne pouvez pas mettre le moule à gâteau dans le four jusqu'à ce que le mélange à gâteau est prêt. Donc, même si vous aviez deux chefs dans une cuisine, vous ne pouvez pas nécessairement de gagner du temps sur une tâche. Il ya des étapes à suivre et l'ordre ne peut être rompu. Vous pouvez multi-tâche, dans ce tout, un chef fait le gâteau l'autre peut préparer une salade, mais les tâches qui ont une séquence prédéfinie ne pouvez pas bénéficier de processeurs dual-core ou même 12 processeurs de base.

Si vous entendez encore des gens dire des choses comme, «mais un smartphone n'a pas besoin de 8 cœurs», alors il suffit de jeter vos mains dans le désespoir.

Cependant, toutes les tâches sont comme ça. De nombreuses opérations qu'un ordinateur exécute peuvent être divisés en tâches indépendantes. A cela, le processus principal peut créer un autre processus et ferme sur une partie du travail à elle faire. Par exemple, si vous utilisez un algorithme pour trouver des nombres premiers, qui ne repose pas sur les résultats précédents (ie pas un Crible d'Ératosthène), alors vous pourrait diviser le travail en deux. Un processus pourrait vérifier les 50 premiers millions de numéros et le second processus pourrait vérifier le second 50 millions. Si vous avez un processeur quad-core, alors vous pouvez scinder le travail en quatre, et ainsi de suite.

Mais pour que cela fonctionne, le programme doit être écrite d'une manière spéciale. En d'autres termes, le programme doit être conçu pour diviser la charge de travail en petits morceaux plutôt que de le faire en une seule fois. Il existe différentes techniques de programmation pour ce faire, et vous pourriez avoir entendu des expressions comme «mono-thread» et «multi-thread». Ces termes signifient généralement des programmes qui sont écrits avec le programme (mono-thread, toutes regroupées) ou avec des tâches individuelles (threads) qui peuvent être programmés indépendamment pour obtenir du temps CPU juste une exécution. En bref, un programme monothread ne bénéficiera pas de courir sur un processeur multi-core, tandis que d'un programme multi-thread va.

android_graphics_pipeline_surfaceflinger

OK, nous y sommes presque, juste une chose avant que nous regardions Android. Selon la façon dont un système d'exploitation a été écrite, certaines actions qu'un programme effectue peuvent être multi-thread par la nature. Souvent, les différents bits d'un OS sont eux-mêmes des tâches indépendantes et lorsque votre programme effectue une E / S ou peut-être quelque chose attire à l'écran que l'action est effectivement réalisée par un autre processus sur le système. En utilisant ce qui est connu comme «appels non bloquants", il est possible d'obtenir un niveau de multi-threading dans un programme sans réellement créer spécifiquement les discussions.

Ceci est un aspect important pour Android. Une des tâches au niveau du système dans l'architecture Android est le SurfaceFlinger. Il est une partie essentielle de la façon dont les applications graphiques envoie à l'affichage. Il est une tâche distincte qui doit être prévu et donné une tranche de temps CPU. Ce que cela signifie est que certaines opérations graphiques besoin d'un autre processus à exécuter avant qu'ils sont complets.

Android



Parce que des processus comme le SurfaceFlinger, avantages Android de processeurs multi-core sans une application spécifique être réellement multi-thread par la conception. Aussi parce qu'il ya beaucoup de choses qui se passent toujours en arrière-plan, comme la synchronisation et les widgets, puis Android comme son ensemble bénéficie de l'aide d'un processeur multi-core. Comme on peut s'y attendre Android a la capacité de créer des applications multi-thread. Pour plus d'informations sur ce sujet, voir le Processus et threads section de la documentation Android. Il ya aussi une certaine exemples multithread de Google, et Qualcomm ont un article intéressant sur apps Android programmation pour les processeurs multi-core.

Cependant la question demeure, sont la majorité des apps Android monothread, et en tant que telle utiliser un seul core CPU? Ceci est une question importante, car si la majorité des applications Android sont mono-thread alors vous pourriez avoir un smartphone avec processeur monstre multi-core, mais en réalité il se produira la même chose que d'un processeur dual-core!

Dans tous mes tests, je ne vois pas d'applications du monde réel qui ont utilisé tous les 8 cores à 100%, et qui est la façon dont il devrait être.

Il semble y avoir une certaine confusion à propos de la différence entre les quad-core et processeurs OCTA-core. Dans le monde de bureau et serveur processeurs OCTA-core sont construits en utilisant la même conception de base répliquée dans la puce. Toutefois, pour la majorité des processeurs OCTA-core basés ARM il ya des noyaux de haute performance et le noyau avec une meilleure efficacité énergétique. L'idée est que les noyaux plus économes en énergie sont utilisés pour des tâches plus ingrates, tandis que les noyaux de haute performance sont utilisés pour le levage de charges lourdes. Cependant, il est également vrai que tous les noyaux peuvent être utilisés simultanément, comme sur un processeur de bureau.

L'essentiel à retenir est que un processeur big.LITTLE OCTA-core dispose de huit cœurs pour l'efficacité de puissance, pas pour la performance.

Essai

Les applications Android sont en mesure de tirer parti des processeurs multi-core et big.LITTLE permet le planificateur de choisir la meilleure combinaison de base pour la charge de travail actuelle.

Il est possible d'obtenir des données à partir d'Android propos combien il l'a utilisé dans le processeur central. Pour ceux qui sont techniquement esprit, l'information peut être trouvée dans le fichier / proc / stat. Je l'ai écrit un outil qui saisit les informations d'utilisation par cœur à partir d'Android tandis qu'une application est en marche. Pour augmenter l'efficacité et réduire l'impact sur les performances de la surveillance, les données sont seulement collecter tout l'application de test est active. L'analyse des données recueillies est fait "off-line."

Grâce à cet outil, qui n'a pas encore de nom, je courais une série de différents types d'applications (jeux, navigation web, etc.) sur un téléphone avec un quad-core Qualcomm Snapdragon processeur 801 et à nouveau sur un téléphone avec un octa- core Qualcomm Snapdragon 615 processeur. Je l'ai rassemblé les données de ces essais de fonctionnement et avec l'aide de Robert Triggs de l'Autorité Android, je l'ai généré quelques graphiques qui montrent comment le processeur est utilisé.

Commençons par un cas d'utilisation facile. Voici un graphique de la façon dont les noyaux dans le Snapdragon 801 sont utilisés lors de la navigation sur le Web en utilisant Chrome:

Chrome - noyaux actifs sur un téléphone quad-core.

Chrome - noyaux actifs sur un téléphone quad-core.

Le graphique montre comment de nombreux noyaux sont utilisés par Android et le navigateur Web. Il ne montre pas combien le noyau est utilisé (qui vient dans un moment), mais il montre si le noyau est utilisé à tous. Si Chrome est mono-thread alors vous vous attendez à voir un ou deux noyaux en usage et peut-être un blip jusqu'à 3 ou 4 cœurs parfois. Cependant, nous ne voyons pas cela. Ce que nous voyons est à l'opposé, quatre cœurs sont utilisés et il plonge parfois à deux. Dans le test de navigation, je ne passais pas de temps à lire les pages que chargés, car cela aurait abouti à aucune utilisation de CPU. Cependant, je attendu jusqu'à ce que la page a été chargé et rendu, puis je suis passé à la page suivante.

Voici un graphique montrant combien chaque noyau a été utilisé. Ceci est un graphe moyenne-out (comme le vrai est un grimoire effrayant de lignes). Cela signifie que les usages des pics sont montrées comme étant moins. Par exemple, le pic sur ce graphique est un peu plus de 90%, mais les données brutes montre que certains des noyaux frappé 100% plusieurs fois pendant l'essai. Toutefois, il nous donne toujours une bonne représentation de ce qui se passait.

Chrome - utilisation de base sur les quad-core téléphone.

Chrome - utilisation de base sur les quad-core téléphone.

Alors que sur un noyau OCTA? Sera-ce montrer le même schéma? Comme vous pouvez le voir sur le graphique ci-dessous, sans qu'il ne le fait pas. Sept noyaux sont constamment utilisées avec la flambée occasionnelle à 8, et quelques fois quand il plonge à 6 et 4 cœurs.

Chrome - noyaux actifs sur un téléphone OCTA-core.

Chrome - noyaux actifs sur un téléphone OCTA-core.

De plus, le graphique d'utilisation de base en moyenne montre que le planificateur se comportait très différemment depuis le Snapdragon 615 est un processeur big.LITTLE.

Chrome - utilisation de base sur l'OCTA-core téléphone.

Chrome - utilisation de base sur l'OCTA-core téléphone.

Vous pouvez voir qu'il ya deux ou trois noyaux qui courent plus que les autres, mais tous les noyaux sont utilisés d'une manière ou une autre. Ce que nous voyons est la façon dont l'architecture big.LITTLE est en mesure d'échanger les discussions d'un noyau à l'autre en fonction de la charge. Rappelez-vous les noyaux supplémentaires sont ici pour l'efficacité énergétique, pas la performance.



Il est un mythe que les applications Android utiliser un seul core.

Cependant, je pense que nous pouvons dire qu'il est un mythe que les applications Android utiliser un seul core. Bien sûr, cela est normal puisque Chrome est conçu pour être multi-thread, sur Android ainsi que sur PC.

Autres applications

Donc, ce fut Chrome, une application qui est conçu pour être multi-thread, ce que d'autres applications? Je couru quelques tests sur les autres applications et brièvement voici ce que je découvris:

  • Gmail - Sur un téléphone quad-core l'utilisation de la base a été également répartie entre 2 et 4 cœurs. Cependant l'utilisation moyenne de base ne sont jamais allés au-dessus de 50%, ce qui est à prévoir que cette est une application relativement léger. Sur un processeur octa-noyau l'utilisation du noyau a rebondi de 4 à 8 noyaux, mais avec une utilisation de base moyenne beaucoup plus faible de moins de 35%.
  • YouTube - Sur un téléphone quad-core seulement 2 noyaux ont été utilisés, et en moyenne à moins de 50% d'utilisation. Sur un téléphone OCTA-core YouTube principalement utilisé 4 cœurs avec la flambée occasionnelle à 6, et déposer à 3. Cependant l'utilisation moyenne de base était de 30%. Fait intéressant, le planificateur fortement favorisé les grands noyaux et les petits noyaux ont été très peu utilisé.
  • Riptide GP2 - Sur un téléphone avec un processeur quad-core Qualcomm ce jeu utilisé deux noyaux plupart du temps avec les deux autres noyaux faire très peu. Cependant sur un téléphone avec un processeur OCTA-core, entre six et sept noyaux où utilisé constamment, mais la plupart du travail a été fait par seulement trois de ces noyaux.
  • Templerun 2 - Ce jeu présente probablement le problème monothread plus que les autres applications que je testées. Sur un téléphone OCTA-core le jeu utilisé entre 4 et 5 noyaux cohérente et a culminé à 7 conducteurs. Cependant vraiment un seul core faisait tout le travail dur. Sur un quad-core Qualcomm Snapdragon 801 téléphone, deux cœurs partagés le travail assez uniformément, et deux noyaux ont fait très peu. Sur un quad-core MediaTek téléphone tous les quatre cœurs ont partagé la charge de travail. Cela met en évidence comment un ordonnanceur différents et des conceptions différentes de base peuvent modifier radicalement la façon dont le CPU est utilisé.

Voici une sélection de graphiques que vous pourrez consulter. Je ai inclus un graphique montrant l'OCTA-core téléphone en veille, comme une référence de base:

Une application intéressante est AnTuTu. Je courus l'application sur le téléphone OCTA-core et voici ce que je voyais:

AnTuTu fonctionnant sur un téléphone OCTA-core.

AnTuTu fonctionnant sur un téléphone OCTA-core.

Comme vous pouvez le voir, la dernière partie de l'essai plafonne complètement tous les cœurs de processeur. Il est clair que l'indice de référence est de créer artificiellement une forte charge de travail, et depuis presque tous les noyaux sont en cours d'exécution à pleine vitesse alors SoC avec plusieurs noyaux va marquer mieux pour cette partie du test. Je ne voyais ce genre de charge de travail sur les applications normales.

Dans un sens, ce sont les points de repère qui sont gonfler artificiellement les avantages de performance de téléphones OCTA-core (plutôt que les avantages de l'efficacité énergétique). Pour un examen plus approfondi de l'analyse comparative du départ Méfiez-vous des repères, comment savoir ce qu'il faut chercher.

Pourquoi les applications de lumière utilisant 8 cœurs?

Si vous regardez un soft comme Gmail, vous remarquerez et phénomène intéressant. Sur un téléphone quad-core l'utilisation de la base a été également répartie entre 2 et 4 cœurs, mais sur un téléphone OCTA-core de l'application utilisée entre 4 et 8 cœurs. Comment se Gmail peut fonctionner sur 2 à 4 cœurs sur un téléphone quad-core, mais a besoin d'au moins quatre cœurs sur un téléphone OCTA-core? Cela n'a pas de sens!

La clé est à nouveau de se rappeler que sur les téléphones big.LITTLE pas tous les noyaux sont égaux. Qu'est-ce que nous sommes réellement voyons comment le planificateur utilise les petits noyaux alors que la charge de travail augmente le grand noyau sont mis en jeu. Pendant un temps, il ya une petite quantité de croisement et puis les petits noyaux aller dormir. Puis, quand la charge de travail diminue le contraire qui se passe. Bien sûr, tout cela se produit très vite, des milliers de fois par seconde. Regardez ce graphique qui montre l'utilisation de la grande vs PETITS noyaux lors de mon essai de Epic Citadel:

Epic Citadel - Big vs utilisation de base peu sur l'OCTA-core téléphone.

Epic Citadel - Big vs utilisation de base peu sur l'OCTA-core téléphone.

Remarquez comment abord les grands noyaux sont utilisés et les petits noyaux sont inactifs. Puis, vers la seconde marque 12, les grands noyaux commencent à être utilisés moins et les petits noyaux de printemps à la vie. Lors de la deuxième marque 20 grands noyaux augmenter leur activité à nouveau et le petit noyaux redescendent à presque zéro utilisation. Vous pouvez voir cela à nouveau à la deuxième marque 30, la deuxième marque 45, et à la deuxième marque 52.

A ces points, le nombre de cœurs utilisés fluctue. Par exemple, dans les 10 premières secondes seulement 3 ou 4 cores sont utilisés (grands noyaux), puis à la deuxième marque 12 les pics d'utilisation de base à 6, puis redescend à 4, et ainsi de suite.

Ceci est big.LITTLE en action. Un processeur big.LITTLE n'a pas été conçu comme les processeurs OCTA-core pour PC. Les noyaux supplémentaires permet au planificateur de choisir le bon noyau pour le bon emploi. Dans tous mes tests, je ne vois pas d'applications du monde réel qui ont utilisé tous les 8 cores à 100%, et qui est la façon dont il devrait être.

Mises en garde et wrap-up

La première chose à souligner est que ces tests ne sont pas comparer la performance des téléphones. Mes tests montre seulement si les applications Android fonctionner sur plusieurs cœurs. Les avantages et les inconvénients de courir sur base multiple, ou courir sur un SoC big.LITTLE, ne sont pas couverts. Ni sont les avantages ou les inconvénients de l'exécution de parties d'une application sur deux noyaux à 25% d'utilisation, plutôt que sur un noyau à 50%, et ainsi de suite.

Deuxièmement, je ne l'ai pas encore eu la chance de faire exécuter ces tests sur une configuration Cortex-A53 / A57 Cortex-ou une configuration Cortex-A53 / A72 Cortex-. Le Qualcomm Snapdragon 615 a un 1.7GHz ARM Cortex A53 pôle quad-core 1.0GHz et un cluster A53 quad-core.

Troisièmement, l'intervalle de balayage de ces statistiques est d'environ un tiers de seconde (soit environ 330 millisecondes). Si un noyau affiche son utilisation est de 25% en ce que 300 millisecondes et rapporte un autre noyau son utilisation est de 25% alors les graphes montrera les deux cœurs fonctionnant simultanément à 25%. Toutefois, il est possible que le premier noyau a couru à 25% d'utilisation de 150 millisecondes, puis le second noyau a couru à 25% d'utilisation de 150 millisecondes. Cela signifie que les noyaux ont été utilisés successivement et non simultanément. Au moment où ma configuration de test ne me permet pas de plus grande résolution.

Mais après avoir dit tout cela. Il est clair que les applications Android sont en mesure de tirer parti des processeurs multi-core et big.LITTLE permet le planificateur de choisir la meilleure combinaison de base pour la charge de travail actuelle. Si vous entendez encore des gens dire des choses comme "un smartphone, mais n'a pas besoin de 8 cœurs» puis juste jeter votre main-up dans le désespoir, car cela signifie qu'ils ne comprennent pas hétérogène Multi-Processing et ils ne comprennent pas que les grandes. PEU est sur l'efficacité de puissance et de performance globale pas.




» » » Réalité ou fiction: les applications Android utilisent un seul cœur de CPU