Exécution multithread sur CPU: comment cela fonctionne en performance

Quand on parle de processeurs pour PC , il est très courant de parler du nombre de cœurs et des threads de traitement ou d'exécution, qui sont généralement le double du nombre de cœurs car Hyper-Threading technologies dans le cas de Intel et SMT dans le boîtier of AMD ce qu'ils font, c'est que chaque noyau peut exécuter deux tâches simultanées. Cependant, c'est une manière assez simple d'expliquer comment travaux multithreading sur un processeur, et dans cet article, nous allons vous l'expliquer plus en détail afin que vous puissiez comprendre tous ses tenants et aboutissants.

Cela dit, nous savons tous qu'un processeur qui a plus de threads que de cœurs est capable d'exécuter plus de tâches simultanément, et en fait, le système d'exploitation détecte le processeur comme s'il avait en fait autant de cœurs qu'il y avait de threads. Par exemple, un Intel Core i7-8700K a 6 cœurs et 12 threads grâce à la technologie HyperThreading, et Windows 10 le reconnaît comme un processeur 12 cœurs tel quel (bien qu'il soit vrai qu'il les appelle «processeurs logiques») car pour le système d'exploitation, son fonctionnement est totalement transparent.

Exécution multi-thread sur CPU

Qu'est-ce que le traitement multi-thread?

Dans l'architecture informatique, le traitement multi-thread est la capacité de l'unité centrale de traitement (CPU) pour fournir plusieurs threads d'exécution en même temps, pris en charge par le système d'exploitation. Cette approche diffère du multitraitement et ne doit pas être confondue; Dans une application multithread, les threads partagent les ressources d'un ou plusieurs cœurs de processeur, y compris les unités de calcul, le cache et le tampon de recherche de traduction (TLBL).

Multiproceso vs multi hilo

Lorsque les systèmes multitraitement incluent plusieurs unités de traitement complètes sur un ou plusieurs cœurs, le multitraitement vise à augmenter l'utilisation d'un seul cœur en utilisant le parallélisme au niveau des threads ainsi que le parallélisme au niveau des instructions. Étant donné que les deux techniques sont complémentaires, elles sont combinées dans presque toutes les architectures système modernes avec plusieurs processeurs multi-threads et avec des processeurs multi-cœurs capables de fonctionner avec plusieurs threads.

Le paradigme multi-thread est devenu plus populaire à mesure que les efforts pour exploiter le parallélisme au niveau des instructions (c'est-à-dire pouvoir exécuter plusieurs instructions en parallèle) ont stagné à la fin des années 1990. Cela a permis au concept de calcul de performance émergé du domaine plus spécialisé du traitement transactionnel.

Bien qu'il soit très difficile d'accélérer davantage un seul thread ou programme, la plupart des systèmes informatiques effectuent en fait plusieurs tâches entre plusieurs threads ou programmes et par conséquent, les techniques qui améliorent les performances de toutes les tâches se traduisent par des gains de performances. général. En d'autres termes, plus un processeur peut traiter d'instructions en même temps, meilleures sont les performances globales de l'ensemble du système.

Même le traitement multi-thread a des inconvénients

Outre les gains de performances, l'un des avantages du traitement multi-thread est que si un thread a beaucoup d'erreurs de cache, les autres threads peuvent continuer à tirer parti des ressources CPU inutilisées, ce qui peut conduire à une exécution globale plus rapide. car ces ressources auraient été inactives si un seul thread avait été en cours d'exécution. En outre, si un thread ne peut pas utiliser toutes les ressources du processeur (par exemple, parce que les instructions dépendent du résultat de la précédente), l'exécution d'un autre thread peut empêcher ces ressources de devenir inactives.

Rendu du processeur Reverso

Cependant, tout a aussi son côté négatif. Plusieurs threads peuvent interférer les uns avec les autres en partageant des ressources matérielles, telles que le cache ou les tampons de recherche de traduction. Par conséquent, les temps d'exécution à un seul thread ne sont pas améliorés et peuvent se dégrader, même lorsqu'un seul thread est en cours d'exécution, en raison de fréquences plus basses ou d'étages de pipeline supplémentaires nécessaires pour accueillir le matériel de commutation de processus.

L'efficacité globale varie; Intel affirme que sa technologie HyperThreading l'améliore de 30%, alors qu'un programme synthétique qui n'effectue qu'un seul cycle d'opérations en virgule flottante non optimisées et dépendantes reçoit en fait une amélioration de 100% lorsqu'il est exécuté en parallèle. D'un autre côté, les programmes de langage d'assemblage réglés manuellement qui utilisent les extensions MMX ou AltiVec et la recherche préalable de données (comme un encodeur vidéo) ne souffrent pas de fuites de cache ou de ressources inactives, ils ne bénéficient donc pas du tout d'une exécution . multithread et peuvent en fait voir leurs performances dégradées en raison d'un conflit de partage.

D'un point de vue logiciel, la prise en charge matérielle multithread est entièrement visible, ce qui nécessite des modifications supplémentaires à la fois des programmes d'application et du système d'exploitation lui-même. Les techniques matérielles utilisées pour prendre en charge le traitement multithread sont souvent parallèles aux techniques logicielles utilisées pour le multitâche; La planification des threads est également un problème majeur en multithreading.

Types de traitement multi-thread

Comme nous l'avons dit au début, nous avons tous l'idée que le traitement multi-thread est simplement une parallélisation de processus (c'est-à-dire exécuter plusieurs tâches en même temps), mais en réalité les choses sont un peu plus compliquées que cela et il existe différents types traitement multi-thread.

Plusieurs fils «à gros grains»

Meilleurs processeurs-CPU pour streaming

Le type le plus simple de multithreading se produit lorsqu'un thread s'exécute jusqu'à ce qu'il soit bloqué par un événement qui créerait normalement un verrou de latence long. Un tel crash pourrait être un manque de cache qui doit accéder à la mémoire hors puce, ce qui peut prendre des centaines de cycles CPU pour que les données reviennent. Au lieu d'attendre la résolution du plantage, le processeur basculera l'exécution sur un autre thread qui était déjà prêt à s'exécuter, et ce n'est que lorsque les données du thread précédent sont arrivées qu'elles seront replacées dans la liste des threads prêts à fonctionner.

Conceptuellement, cela est similaire au multitâche coopératif utilisé dans les systèmes d'exploitation en temps réel, dans lequel les tâches abandonnent volontairement le temps d'exécution du processeur lorsqu'elles doivent attendre qu'un événement se produise. Ce type de multithreading est appelé «bloc» ou «gros grain».

Multithread entrelacé

Le but de ce type de traitement multithread est de supprimer tous les verrous de dépendance de données du pipeline d'exécution. Puisqu'un thread est relativement indépendant des autres, il y a moins de chance qu'une instruction dans un étage de pipeline ait besoin d'une sortie d'une instruction précédente dans le même canal; Conceptuellement, cela est similaire au multitâche préventif utilisé dans le système d'exploitation, et une analogie serait que l'intervalle de temps donné à chaque thread actif est un cycle CPU.

Ejecución multi hilo

Bien entendu, ce type de traitement multi-thread a un inconvénient majeur et c'est que chaque étage de pipeline doit suivre l'ID de thread de l'instruction qu'il traite, ce qui ralentit ses performances. De plus, étant donné qu'il y a plus de threads en cours d'exécution en même temps dans le pipeline, les partages tels que le cache doivent être plus volumineux pour éviter les erreurs.

Multithreading parallèle

Le type de multithreading le plus avancé s'applique aux processeurs appelés superscalaires. Alors qu'un processeur superscalaire typique émet plusieurs instructions à partir d'un seul thread sur chaque cycle de processeur, dans le traitement multithread simultané (SMT), un processeur superscalaire peut émettre des instructions à partir de plusieurs threads à chaque cycle. Reconnaissant que tout thread a une quantité limitée de parallélisme au niveau des instructions, ces tentatives de multithreading d'exploiter le parallélisme disponible sur plusieurs threads pour réduire le gaspillage associé aux espaces inutilisés.

Pour distinguer les autres types de traitement multithread SMT, le terme «multithread temporaire» est souvent utilisé pour indiquer quand des instructions monothread peuvent être émises en même temps. Les implémentations de ce type incluent DEC, EV8, la technologie HyperThreading d'Intel, IBM Power5, Sun Mycrosystems UltraSPARC T2, Cray XMT et les microarchitectures Bulldozer et Zen d'AMD.