Cela étant 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.
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) à 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).
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 multithread 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 stoppé à la fin des années 1990. Cela a permis au concept de calcul de la performance de refaire surface à partir du domaine plus spécialisé de la transaction. En traitement.
Bien qu’il soit très difficile d’accélérer davantage un seul thread ou programme, la plupart des systèmes informatiques sont en fait multitâ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. 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. les ressources auraient été inactives si un seul thread était 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.
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’autre part, les programmes de langage d’assemblage serrés à la main 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 . multi-thread 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 du matériel 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 dans le multi-threading.
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 grain »
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 sur la liste des threads prêts à être exécutés.
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é «en vrac» ou «à gros grains».
Multithreading 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.
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 du 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 à un seul thread 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.