Architectures de processeurs

5.6 Architectures de processeurs

Objectifs d'apprentissage

À la fin de cette section, vous serez en mesure de :

  • Discuter de l'histoire et des avancées des architectures de processeurs traditionnelles et des modèles de calcul
  • Définir l'hétérogénéité et discuter de son effet sur les systèmes informatiques

Les processeurs ont une histoire relativement courte qui commence à la fin des années 1960 ; cependant, il y a eu de grands bonds depuis. Dans cette section, nous apprenons l'évolution des processeurs depuis l'aube de la conception des processeurs jusqu'à aujourd'hui. Les principales mesures de succès des processeurs incluent l'exactitude, la vitesse, la puissance, la fiabilité et la sécurité.

La vitesse a été la principale mesure de succès pendant un certain temps. Mais ensuite, les concepteurs d'ordinateurs ont commencé à se soucier de l'autonomie de la batterie (pour les appareils portables) et de la facture d'électricité (pour les grandes machines), de sorte que la puissance est devenue un enjeu crucial. Comme les ordinateurs ont envahi presque tous les aspects de nos vies, la fiabilité est devenue une nécessité car nous ne voulons pas que les ordinateurs tombent en panne. Avec l'utilisation généralisée d'Internet et le besoin des gens d'être connectés en permanence, la sécurité est également devenue un problème.

Architectures de processeurs homogènes

Les processeurs actuels contiennent plusieurs CPU à l'intérieur de la puce. Si ces CPU sont des copies les uns des autres, la conception est homogène (homogeneous). S'il existe différents types de CPU, certains rapides mais gourmands en énergie, d'autres lents mais économes en énergie, la conception est dite hétérogène (heterogeneous). Un exemple de processeurs hétérogènes est la puce à l'intérieur du dernier MacBook Pro.

Dans sa première version, un processeur n'était qu'une grande boîte noire encombrante qui recevait ses instructions de la mémoire, les exécutait, recevait l'instruction suivante, et ainsi de suite. Qu'est-ce qui n'allait pas avec cette conception simple ? Premièrement, avoir un grand circuit encombrant le rendait lent et gourmand en énergie. Deuxièmement, toutes les instructions ne prenaient pas le même temps ; un calcul en virgule flottante prenait jusqu'à dix fois plus de temps qu'un calcul entier. Mais comme cette conception était une seule boîte fonctionnant avec une seule horloge, le cycle d'horloge devait être aussi long que l'instruction la plus lente. Le processeur s'exécutait à la vitesse de l'instruction la plus lente ; par conséquent, même si la conception était simple, elle souffrait de problèmes de performance et de puissance. Cependant, la physique est venue à la rescousse.

Concepts en pratique

Médias sociaux et superordinateurs

Des milliards de personnes utilisent des sites de médias sociaux tels que Facebook, X (anciennement Twitter), YouTube et Instagram chaque jour et en même temps. Cela signifie que nous avons besoin de superordinateurs capables de servir toutes ces personnes, de stocker et de manipuler d'énormes quantités de données en peu de temps, et de ne pas tomber en panne. Cela ne peut pas être fait avec un simple multicœur ; cela nécessite des millions de multicœurs et des milliers, voire des millions, d'accélérateurs tels que des GPU, des TPU et des FPGA.

Loi de Moore et mise à l'échelle de Dennard

En 1965, Gordon Moore (cofondateur d'Intel) a publié un court article qui prédisait que le nombre de dispositifs à l'intérieur du processeur doublerait tous les 18 mois, ce qu'on appelle la loi de Moore (Moore’s law). Puisque les transistors sont les blocs de construction des portes logiques, et que les portes logiques sont les blocs de construction de pièces telles que les additionneurs, les multiplicateurs et les registres, alors plus de transistors signifieraient plus de fonctionnalités implémentées dans le processeur, conduisant, espérons-le, à de meilleures performances. Plus de transistors à l'intérieur de la puce du processeur signifiait que les transistors deviendraient plus petits, et des transistors plus petits signifieraient des transistors plus rapides. Non seulement cela, mais Robert Dennard d'IBM a découvert qu'à mesure que les transistors devenaient plus petits, la puissance consommée et dissipée était également réduite, un phénomène connu sous le nom de mise à l'échelle de Dennard (Dennard scaling).

Architectures de processeurs traditionnelles

Figure 5.26 montre comment le processeur a évolué de l'implémentation à cycle unique vers des conceptions plus sophistiquées et plus performantes grâce à la loi de Moore et à sa technologie habilitante, la mise à l'échelle de Dennard.

Un diagramme montrant l'évolution d'un processeur au fil du temps.
Figure 5.26 Le processeur a évolué de la (a) conception simple à cycle unique vers le (b) traitement en pipeline, puis vers la (c) conception superscalaire très sophistiquée en moins de 70 ans. (source : Copyright Rice University, OpenStax, sous licence CC BY 4.0)

Si vous réfléchissez à ce que fait réellement cette boîte encombrante de la Figure 5.26(a), vous arrivez à la conclusion suivante : elle fait peu de choses de manière répétitive avec chaque instruction. Elle récupère une instruction de la mémoire, décode cette instruction pour savoir ce qui doit être fait, et émet l'instruction aux unités d'exécution correctes (par exemple, une opération entière à l'unité d'exécution entière et une opération en virgule flottante à l'unité d'exécution en virgule flottante).

Après l'exécution, elle écrit le résultat de l'opération dans une destination spécifiée par l'instruction, ce qui est appelé le commit. Compte tenu de cette description, pourquoi ne pas prendre la pièce de matériel encombrante de la Figure 5.26(a) et la diviser en ces pièces : fetch (récupération), decode (décodage), issue (émission), execute (exécution) et commit (validation) ? Chaque pièce fait le travail nécessaire pour la pièce suivante dans une technique appelée traitement en pipeline (pipelining), chaque pièce étant appelée une phase (Figure 5.26(b)). Qu'y gagnons-nous ?

Premièrement, chaque phase est maintenant beaucoup moins compliquée, moins gourmande en énergie et plus rapide. Deuxièmement, une fois que la phase de récupération a terminé de récupérer la première instruction et la transmet à la phase de décodage, le matériel de la phase de récupération est maintenant libre de récupérer la deuxième instruction. Au moment où la phase de décodage a terminé l'instruction 1 et la transmet à la phase d'émission, la phase de récupération lui transmet l'instruction 2 et commence à récupérer l'instruction 3, ce qui est une forme de parallélisme.

Si nous prenons un instantané du pipeline pendant l'exécution du programme, nous trouvons différentes phases de pipeline travaillant sur différentes instructions. Nous appelons ce type de parallélisme parallélisme temporel (temporal parallelism). L'avantage est que ce parallélisme — ou meilleure performance — est réalisé sans l'intervention du programmeur. Le matériel le fait pour vous.

Avec de plus en plus de transistors disponibles, les concepteurs passent à l'exécution de plusieurs instructions en même temps, ce qui signifie que plusieurs unités d'exécution sont nécessaires. Les autres phases doivent être modifiées pour récupérer/décoder/émettre plusieurs instructions en même temps, ce qui est appelé capacité comme le montre la Figure 5.26(c). Un autre type de parallélisme est la capacité superscalaire (superscalar capability), qui est une unité d'exécution qui permet d'exécuter plusieurs instructions en même temps en utilisant un autre type de parallélisme, le parallélisme spatial (spatial parallelism). Si vous regardez attentivement la Figure 5.26(c), vous réalisez qu'elle combine à la fois le parallélisme temporel (du traitement en pipeline) et le parallélisme spatial (de la capacité superscalaire).

L'étape suivante pour améliorer les performances d'un processeur consiste à récupérer des instructions de plus d'un fil d'exécution, et vous pouvez techniquement exécuter deux programmes ou plus sur le même processeur en même temps. C'est ce qu'on appelle le multithreading simultané (SMT) (simultaneous multithreading (SMT)), qu'Intel appelle technologie Hyper-Threading.

Cette dernière amélioration a été introduite au début des années 2000, mais quelque chose s'est produit vers 2004 qui a poussé les communautés matérielle et logicielle à changer de cap. La mise à l'échelle de Dennard s'est arrêtée et les concepteurs ont continué à augmenter la fréquence des processeurs pour les rendre plus rapides. Cela a conduit à un arrêt complet car l'augmentation de la fréquence entraînait des augmentations drastiques de la consommation d'énergie.

Plusieurs cœurs

Avec l'arrêt de la mise à l'échelle de Dennard et l'incapacité d'augmenter la fréquence du processeur, il était temps d'un changement radical. Sur une seule puce, au lieu de placer un seul processeur, les concepteurs ont décidé de placer plusieurs processeurs appelés cœurs à l'intérieur de la même puce, ce qui a marqué le début de l'ère multicœur. Tous les processeurs que nous utilisons aujourd'hui, de nos montres aux grands superordinateurs, sont des processeurs multicœurs.

La tendance est d'augmenter le nombre de cœurs par puce tout en diminuant leur fréquence. Chaque cœur du multicœur est un SMT pour éviter une augmentation de la consommation d'énergie ainsi qu'une augmentation de la température de la puce. Il y a cependant un hic ; toutes les techniques précédentes (telles que le traitement en pipeline, le superscalaire et le SMT) nous donnaient des performances sans que les programmeurs n'aient à intervenir. Pour utiliser tous les cœurs de la puce avec le multicœur, les programmeurs doivent écrire du code parallèle qui nécessite l'utilisation d'un langage de programmation parallèle. Cela est appelé à devenir la norme.

Architectures de processeurs hétérogènes

Les processeurs multicœurs sont conçus pour être performants en moyenne pour la plupart des applications (applications). Cependant, ils n'offrent pas les meilleures performances pour chaque programme. Les concepteurs ont commencé à introduire des puces qui offrent d'excellentes performances, meilleures que les multicœurs, mais pour un petit sous-ensemble de types de programmes. Des exemples de ces puces sont les unités de traitement graphique (GPU), les réseaux de portes programmables sur site (FPGA) et les unités de traitement de tenseurs (TPU). L'idée est de démarrer le programme sur un multicœur jusqu'à ce qu'il y ait une partie où d'autres puces excellent. Dans ce cas, le multicœur envoie cette partie du code aux autres puces, ce qui donne lieu à la programmation parallèle pour les systèmes hétérogènes (heterogeneous) (c'est-à-dire les systèmes informatiques (computer systems) qui ont des puces avec des capacités différentes). Les ordinateurs portables peuvent désormais avoir un multicœur plus un GPU.

Plusieurs nœuds

Avoir un multicœur plus des puces accélératrices (par exemple, des GPU) sur la même carte est maintenant la norme et est appelé un nœud. Mais qu'en est-il des grandes machines qui fonctionnent dans l'infonuage pour nous offrir des services tels qu'Amazon, Facebook et X (anciennement Twitter) ? Ces grandes machines sont construites en utilisant des milliers, voire des millions, de nœuds et elles nécessitent une méthode de programmation encore plus sophistiquée.