A savoir sur les Processeurs
-
A.
Optimisation de la mémoire cache
La mémoire cache permet comme il a été détaillé précédemment de remplir un rôle de "tampon" entre le processeur et la mémoire centrale de l’ordinateur. Elle prend aujourd’hui une très grande importance dans les performances d’un ordinateur et occupe parfois plus de la moitié de la surface totale des transistors d’un "die".
Pour gérer cet espace de mémoire de plus en plus vaste, il y a des méthodes de gestion et d’optimisation de plus en plus avancées. En premier lieu et en raison des transistors présents en très grand nombre, le cache est une mémoire qui pose des problèmes de consommation électrique et donc de chauffe. Pour correctement maîtriser ces problèmes, les constructeurs (parfois désignés sous le terme de fondeurs) mettent en place des "politiques" de gestion de cache qui visent à n’alimenter que certaines lignes "utilisées" du cache. Cela permet de mieux maîtriser la consommation et donc l’autonomie ou le dégagement thermique du processeur.Par ailleurs, le cache est l’objet de toutes les attentions depuis que les processeurs modernes multiplient les cœurs d’exécution. Partagés ou séparés, ils posent de nombreux problèmes. Dans le premier cas, il s’agit de prévenir des « interférences » possibles quand les deux cœurs d’exécution utilisent le cache commun. Dans le second cas, les problèmes d’alimentation des caches se posent. En effet, la mémoire cache est très rapide et consomme beaucoup de bande passante (débit mémoire), il faut donc pouvoir alimenter correctement deux caches L2 simultanément tout en évitant l’écueil de copier trop d’informations inutiles destinées à un cœur dans l’espace réservé à l’autre. Pour cela de nombreux complexes ont été développés.
Haut de page - B. Le prefetching et les tables de prédictions Dans le processus de calcul, il est une étape qui est l’objet de nombreuses optimisations. En effet, si rapide soit-il le cache reste une source de temps de latence pour le cœur d’exécution, surtout quand celui-ci se retrouve « en rupture de stock » de données à traiter. Dans ce cas, le cœur d’exécution est en demande d’informations et attend que le cache les lui mette à disposition. L’optimisation de l’efficacité d’un processeur tient principalement en la réduction de ces temps de latence. Pour ce faire, et dans ce cas précis, on utilise un procédé de prefetching, c’est-à-dire de préchargement prédictif des instructions. Comment est-il possible de deviner à l’avance les informations nécessaires ? Il suffit pour cela de tenir une table dite de prédiction de branchements. C’est une table de données qui tient à jour des statistiques sur les données et les situations qui se reproduisent souvent. Ainsi, on parvient à deviner à l’avance quel type d’instruction le processeur est susceptible de demander dans telle situation et d’y prévenir en préchargeant à l’avance les instructions dans le cache. Cette méthode de prédiction permet de couvrir à plus de 90 % les besoins en instructions d’un processeur. Les quelques % restants étant tout l’enjeu de l’optimisation et des recherches tant en architecture qu’en mathématiques. Haut de page
-
C.
Le pipeline et ses conséquences sur l'architecture super scalaire
L’évolution des processeurs a rapidement mené au constat que le « fordisme » (travail à la chaîne) pouvait apporter son lot de bienfaits dans les calculs. Ainsi, un pipeline d’exécution est la chaîne de traitement que suit l’information pour aboutir au résultat du calcul. Chaque étape joue son rôle et plus le découpage des étapes en tâches simples est grand, plus le pipeline est long. Cela permet de réduire grandement le temps que chaque étape prend pour mener à bien la tâche qui lui incombe. En pratique, cela se traduit par une capacité des unités de calcul à tenir des fréquences plus élevées (sans pour autant mener un même calcul en un temps plus court) et donc de cadencer le processeur à des vitesses plus élevées.
Mais un pipeline et des fréquences élevées ne sont pas une solution à tous les problèmes, notamment ceux que l’on rencontre lors d’une interruption de l’exécution des calculs. Cela se pose surtout dans des calculs où l’irrégularité des « branchements » est grande (c’est-à-dire schématiquement des opérations soumises à des conditions changeantes). Les processeurs à pipeline long sont alors obligés de consacrer de nombreux cycles à la réinitialisation des opérations pour reprendre le calcul dans le bon sens.Cet équilibre entre fréquence de fonctionnement élevée (source de performance à longueur constante de pipeline) et nombre « d’étages » du pipeline est difficile à trouver et change suivant les architectures choisies.
Une des conséquences intéressante de ce découpage en étapes de calcul est qu’une fois qu’un « étage de calcul » s’est acquitté de son rôle, le calcul suivant peut être traiter. On remplit donc mieux tous les étages du pipeline et plusieurs opérations peuvent être en cours de traitement à un instant t. Bien entendu, leur état d’avancement n’est pas le même suivant qu’elles se situent au début ou à la fin du pipeline.
De cette astuce pour optimiser le rendement d’une unité de calcul découle une autre optimisation. Lorsque le résultat d’un calcul sert de point de départ à un autre, on comprend rapidement l’intérêt qu’on a de disposer de plusieurs unités de calcul en parallèle pour obtenir plusieurs opérations simultanément. Lorsqu’un processeur utilise cette voie de développement de puissance de calcul, on le qualifie de super scalaire.
Les processeurs super scalaires permettent une grande puissance de calcul à condition de les alimenter correctement en opérations. C’est le rôle des unités de contrôle et de traitement des données dans le désordre (on parle de traitement « ooo » pour Out of Order). Là encore, le juste équilibre est à trouver, car au-delà d’une certaine complexité, on perd plus de temps à s’évertuer à optimiser l’alimentation des unités de calcul qu’à les faire patienter un peu. Haut de page -
D.
Le multicœur et multithread
Dans la quête à l’efficacité, la course au MHz a subi un coup de frein. Les nombreux problèmes de dégagements thermiques et de besoin en souplesse pour le grand public commençaient à peser trop lourd dans la balance. C’est pourquoi le multicœur constitue aujourd’hui un enjeu pour les fondeurs qui voient en lui une source de puissance supplémentaire certes, mais surtout de souplesse.
De quoi s’agit-il ? Partant du constat que l’utilisateur utilise de plus en plus souvent plusieurs logiciels simultanément, une forte parallélisation est avantageuse. C’est de là qu’est apparue l’idée d’inclure plusieurs cœurs de traitement dans un seul processeur. Ces derniers bénéficiant, au choix, de leur propre zone de mémoire cache, ou se la partageant grâce à un système de gestion de cache astucieux. Bien entendu, comme dans un tandem, un processeur disposant de deux cœurs ne va pas deux fois plus vite qu’un processeur disposant d’un seul cœur, mais le gain est appréciable et fournit un plus non négligeable en terme de confort.Pour tirer parti de cette multiplication des cœurs d’exécution (parfois jusqu’à quatre pour les processeurs très haut de gamme), certains éditeurs de logiciels programment leurs applications en "multithread", c’est-à-dire de manière à ce que les opérations soient menées suffisamment parallèlement pour tirer pleinement profit des multiples cœurs mis à leur disposition. Cependant ce type de programmation est complexe et peu adapté à certains types d’application qui laissent peu de place au parallélisme.
Haut de page
-
Page précédente
1. Les organes fonctionnels














