Depuis le milieu des années 90, les processeurs de bureau offrent plusieurs cœurs de processeur dans un seul boîtier. Il s’agit d’un processeur multicœur. Alors que les premières conceptions étaient limitées à deux ou quatre cœurs de processeur, les processeurs modernes offrent jusqu’à 64 cœurs physiques sur un seul processeur. Un nombre de cœurs aussi élevé n’est pas standard pour les processeurs de bureau et est généralement réservé aux stations de travail ou aux serveurs haut de gamme. Le nombre de cœurs des processeurs de bureau modernes se situe généralement entre 4 et 16. Mais qu’est-ce qui fait que les processeurs multicœurs dominent les ordinateurs modernes ?
Cœur unique
Historiquement, un processeur à cœur unique était limité à l’exécution d’une seule tâche à la fois. Cette limitation s’accompagne de toute une série de problèmes. Par exemple, sur un ordinateur moderne, un grand nombre de processus d’arrière-plan sont exécutés. Si un processeur ne peut traiter qu’une seule chose à la fois, cela signifie que ces processus d’arrière-plan doivent prendre du temps de traitement au processus de premier plan. En outre, les pertes de mémoire cache signifient que les données doivent être extraites de la mémoire vive, relativement lente. Pendant que les données sont extraites de la RAM, le processeur reste tout simplement inactif, car il ne peut rien faire tant qu’il n’a pas reçu les données. Cela ralentit le processus en cours ainsi que tous les autres processus qui attendent qu’il soit terminé.
Bien que les processeurs modernes à un seul cœur ne soient plus vraiment d’actualité grâce à l’essor des processeurs multicœurs à bas prix, ils seraient en mesure d’utiliser d’autres astuces modernes pour fonctionner plus rapidement. Un pipeline permet d’utiliser simultanément les différentes parties du traitement d’une instruction, ce qui permet d’augmenter considérablement les performances par rapport à l’utilisation d’une seule étape du pipeline par cycle d’horloge. Avec un pipeline large, plusieurs instructions peuvent être traitées dans chaque étage du pipeline par cycle d’horloge. Le traitement Out Of Order permet de planifier les instructions de manière plus efficace en termes de temps. Un prédicteur de branchement serait capable de prédire le résultat d’une instruction de branchement et d’exécuter de manière préemptive la réponse présumée.
Tous ces facteurs fonctionneraient bien et fourniraient certaines performances. Cependant, l’ajout d’un ou de plusieurs cœurs permet tout cela et, d’un seul coup, le traitement de deux fois plus de données à la fois.
Multicore
L’ajout d’un deuxième cœur semble devoir doubler les performances brutes. Malheureusement, les choses sont plus compliquées que cela. La logique d’un programme est souvent monofilaire, ce qui signifie qu’il n’y a qu’une seule chose qu’un programme tente de faire à un moment donné. Ce qui peut arriver, cependant, c’est que d’autres processus puissent utiliser l’autre cœur au même moment. Bien qu’il n’y ait pas de gain de performance inhérent à la plupart des programmes individuels, la mise à disposition d’une ressource de traitement supplémentaire réduit effectivement la concurrence pour une ressource limitée, ce qui permet un gain de performance. Ce gain de performances, simplement dû à la réduction de la concurrence pour le temps CPU, est le plus visible lors du passage d’un CPU à un seul cœur à un CPU à deux cœurs, les rendements diminuent lorsque l’on augmente le nombre de cœurs, bien que plus soit généralement mieux.
Pour profiter pleinement des systèmes multicœurs et obtenir une amélioration sensible des performances, les programmes doivent être programmés pour utiliser plusieurs fils de traitement. La logique multithread est notoirement difficile à réaliser de manière fiable, car elle est souvent difficile à apprendre et comporte de nombreux pièges potentiels. Un exemple de piège est connu sous le nom de condition de course. Dans une condition de course, un processus suppose qu’un autre processus qu’il démarre se déroulera sans problème, puis il essaie de faire quelque chose qui dépend du bon déroulement de cet autre processus. Par exemple, imaginons qu’un processus lance un autre processus pour fermer un document et en ouvrir un autre. Si le processus d’origine ne vérifie pas correctement si le second processus a été achevé, cela peut entraîner des résultats inattendus. S’il y a eu un problème pour fermer le premier document, par exemple, il peut rester ouvert alors que le processus original vient d’y écrire d’autres données.
Dans cette situation de course, la valeur d’une variable est lue une deuxième fois avant que la nouvelle valeur ne lui soit écrite, ce qui conduit à une réponse globale erronée.
Problèmes thermiques
La chaleur est l’un des principaux problèmes auxquels les processeurs multicœurs sont confrontés. Alors qu’un cœur de processeur ne dégage pas beaucoup de chaleur, deux cœurs en dégagent davantage. Dans les processeurs à nombre élevé de cœurs, cette concentration de chaleur peut entraîner une baisse de l’horloge de démarrage, car le processeur gère sa température. Une horloge de poussée plus basse entraînera une baisse des performances dans les applications à un seul fil. Cela peut souvent être observé dans les benchmarks de performance des jeux vidéo. Les jeux vidéo sont souvent très dépendants d’un seul thread. En tant que telles, les performances monofilaires sont souvent critiques pour les jeux. Les processeurs à nombre de cœurs élevé, comme les modèles à 16 cœurs, sont souvent issus des bacs à hautes performances. Malgré cela, on constate régulièrement qu’ils sont surclassés par des CPU « inférieurs » ayant un nombre de cœurs plus faible dans les benchmarks à un seul fil. Ce problème est encore plus évident avec les CPU à très haut nombre de cœurs, comme le Threadripper d’AMD à 64 cœurs, dont la vitesse d’horloge est sensiblement inférieure à celle des CPU de bureau haut de gamme.
Réussites
De nombreuses applications sont capables d’utiliser correctement plusieurs cœurs de CPU. Par exemple, le rendu CPU est une tâche relativement facile à paralléliser. Des améliorations de performances peuvent être constatées jusqu’à 64 cœurs, voire plus, bien qu’aucun CPU n’offre actuellement plus de 64 cœurs. De nombreuses applications ne peuvent tout simplement pas être multithreadées car elles reposent sur une logique séquentielle. Bien que la vitesse de ces applications ne soit pas comparable à celle d’un programme multithread, le fait que les programmes multithread et d’autres programmes monofilaires puissent utiliser d’autres cœurs de processeur libère du temps de processeur, ce qui permet de meilleures performances.
Options architecturales
Dans les processeurs de bureau, chaque cœur de processeur au sein d’un processeur multicœur est généralement identique. Cette homogénéité rend la planification du travail sur les cœurs simple. L’utilisation d’une même conception répétitive permet également de limiter les coûts de développement. Les processeurs mobiles, en revanche, utilisent depuis longtemps des architectures à cœur hétérogène. Dans cette conception, il y a deux ou même trois niveaux de cœur de processeur. Chaque niveau peut exécuter les mêmes processus, mais certains sont conçus pour l’efficacité énergétique et d’autres pour les performances. C’est la recette du succès pour les appareils alimentés par batterie, car de nombreuses tâches peuvent utiliser les cœurs plus lents et plus économes en énergie, ce qui augmente la durée de vie de la batterie, tandis que les processus prioritaires peuvent toujours être exécutés à grande vitesse si nécessaire.
L’architecture des processeurs de bureau s’oriente également vers une conception à cœurs hétérogènes. La gamme de processeurs Core Alder Lake de 12e génération d’Intel est le premier processeur de bureau à adopter cette approche. Dans ce cas, le principal facteur qui motive les petits cœurs n’est pas nécessairement l’efficacité énergétique, mais l’efficacité thermique, bien qu’il s’agisse des deux faces d’une même médaille. Le fait de disposer de plusieurs cœurs puissants permet d’obtenir des performances élevées, tandis que plusieurs cœurs efficaces peuvent gérer les tâches de fond sans trop affecter les cœurs principaux.
Conclusion
Un processeur multicœur est un processeur qui comporte plusieurs cœurs de traitement dans un seul boîtier, souvent, mais pas exclusivement, sur la même puce. Les processeurs multicœurs n’offrent pas d’amélioration directe des performances pour de nombreux programmes. Cependant, en augmentant le nombre de cœurs, les programmes monofilaires n’ont pas besoin de se disputer autant de temps de traitement. Certains programmes peuvent tirer pleinement parti de plusieurs cœurs, en utilisant directement tous ceux qui sont disponibles. Cela permet d’augmenter considérablement les performances, bien qu’en raison des contraintes thermiques et énergétiques, les performances ne soient pas nécessairement doublées par le doublement du nombre de cœurs.