Je me demande quel est l'accélération théorique possible des CPU avec hyper threading. En supposant une parallélisation à 100 % et aucune communication - deux CPU donneraient une accélération de 2. Et qu'en est-il des CPU avec hyper threading ?
Réponses
Trop de publicités?Comme d'autres l'ont dit, cela dépend entièrement de la tâche.
Pour illustrer cela, regardons un benchmark réel :
Ceci a été extrait de ma thèse de maîtrise (actuellement non disponible en ligne).
Cela montre l'_accélération relative_1 des algorithmes de correspondance de chaînes (chaque couleur représente un algorithme différent). Les algorithmes ont été exécutés sur deux processeurs quad-core Intel Xeon X5550 avec hyperthreading. En d'autres termes : il y avait un total de 8 cœurs, chacun pouvant exécuter deux threads matériels (= "hyperthreads"). Par conséquent, le benchmark teste l'accélération avec jusqu'à 16 threads (qui est le nombre maximum de threads concurrents que cette configuration peut exécuter).
Deux des quatre algorithmes (bleu et gris) évoluent de manière plus ou moins linéaire sur toute la plage. Autrement dit, ils bénéficient de l'hyperthreading.
Deux autres algorithmes (en rouge et vert ; choix malheureux pour les daltoniens) évoluent de manière linéaire jusqu'à 8 threads. Après cela, ils stagnent. Cela indique clairement que ces algorithmes ne bénéficient pas de l'hyperthreading.
La raison ? Dans ce cas particulier, il s'agit de la charge mémoire ; les deux premiers algorithmes ont besoin de plus de mémoire pour le calcul, et sont contraints par les performances du bus mémoire principal. Cela signifie que pendant qu'un thread matériel attend la mémoire, l'autre peut continuer l'exécution ; un cas d'utilisation idéal pour les threads matériels.
Les autres algorithmes nécessitent moins de mémoire et n'ont pas besoin d'attendre le bus. Ils sont presque entièrement liés aux calculs et n'utilisent que des opérations entières (opérations sur les bits, en fait). Par conséquent, il n'y a pas de potentiel pour l'exécution parallèle et aucun avantage tiré des pipelines d'instructions parallèles.
1 C'est-à-dire qu'un facteur d'accélération de 4 signifie que l'algorithme s'exécute quatre fois plus rapidement que s'il était exécuté avec un seul thread. Par définition, alors, chaque algorithme exécuté sur un thread a un facteur d'accélération relatif de 1.
Le problème est que cela dépend de la tâche.
L'idée derrière l'hyperthreading est essentiellement que tous les processeurs modernes ont plus d'un problème d'exécution. Généralement plus proche d'une douzaine ou quelque chose comme ça maintenant. Réparti entre Integer, flottant, SSE/MMX/Streaming (peu importe comment cela s'appelle aujourd'hui).
De plus, chaque unité a des vitesses différentes. Par exemple, il pourrait prendre 3 cycles à une unité de mathématiques entières pour traiter quelque chose, mais une division en virgule flottante de 64 bits pourrait prendre 7 cycles. (Ce sont des chiffres mythiques non basés sur quoi que ce soit).
L'exécution hors séquence aide beaucoup à maintenir les diverses unités aussi pleines que possible.
Cependant, toute tâche unique n'utilisera pas chaque unité d'exécution à chaque instant. Même en divisant les threads, cela ne peut pas aider entièrement.
Ainsi, la théorie devient que, en prétendant qu'il y a un deuxième processeur, un autre thread pourrait s'exécuter dessus, utilisant les unités d'exécution disponibles non utilisées par exemple votre transcodage audio, qui est composé à 98% de trucs SSE/MMX, et les unités int et flottantes sont totalement inactives sauf pour quelques trucs.
Pour moi, cela a plus de sens dans un monde à un seul processeur, où la simulation d'un deuxième processeur permet aux threads de franchir plus facilement ce seuil avec peu (voire pas du tout) de codage supplémentaire pour gérer ce faux deuxième processeur.
Dans le monde à 3/4/6/8 cœurs, avoir 6/8/12/16 processeurs, est-ce utile? Je ne sais pas. Autant? Cela dépend des tâches en cours.
Donc pour répondre à vos questions, cela dépendra des tâches de votre processus, des unités d'exécution qu'il utilise, et dans votre processeur, des unités d'exécution qui sont inactives/sous-utilisées et disponibles pour ce deuxième faux processeur.
Certaines 'catégories' de calculs sont dites en bénéficier (de manière vague et générique). Mais il n'y a pas de règle absolue, et pour certaines catégories, cela ralentit les choses.
J'ai quelques preuves anecdotiques à ajouter à la réponse de geoffc en ce sens que j'ai effectivement un processeur Core i7 (4 cœurs) avec hyperthreading et j'ai joué un peu avec la transcodage vidéo, une tâche qui nécessite une certaine communication et synchronisation mais qui a suffisamment de parallélisme pour pouvoir charger efficacement un système.
Mon expérience en jouant avec le nombre de CPU attribués à la tâche, en utilisant généralement les 4 "cœurs supplémentaires" hyperthreadés, équivaut à environ 1 CPU supplémentaire en termes de puissance de traitement. Les 4 "cœurs" hyperthreadés supplémentaires ajoutaient à peu près la même quantité de puissance de traitement utilisable que le passage de 3 à 4 "vrais" cœurs.
Admettant que ce n'est pas strictement un test équitable, car tous les fils de codage seraient probablement en concurrence pour les mêmes ressources dans les CPU, mais pour moi cela a montré au moins un léger boost de la puissance de traitement globale.
La seule façon réelle de montrer si cela aide vraiment serait d'exécuter quelques tests différents de types Entier/Flottant/SIMD en même temps sur un système avec l'hyperthreading activé et désactivé et de voir combien de puissance de traitement est disponible dans un environnement contrôlé.
Cela dépend beaucoup du CPU et de la charge de travail comme d'autres l'ont dit.
La performance mesurée sur le processeur Intel® Xeon® avec la technologie Hyper-Threading montre des gains de performance allant jusqu'à 30% sur les benchmarks d'applications serveur courantes pour cette technologie.
(Cela me semble un peu conservateur.)
Et il y a un autre document plus long (que je n'ai pas encore lu en entier) avec plus de chiffres ici. Un point intéressant de ce document est que l'hyperthreading peut rendre les choses plus lentes pour certaines tâches.
L'architecture Bulldozer d'AMD pourrait être intéressante. Ils décrivent chaque cœur comme effectivement 1,5 cœurs. C'est un hyperthreading extrême ou un multi-core de qualité inférieure selon votre confiance en ses performances probables. Les chiffres dans cet article suggèrent une augmentation de vitesse de commentaire entre 0,5x et 1,5x.
Enfin, la performance dépend également du système d'exploitation. Le système d'exploitation enverra, espérons-le, les processus vers de vrais CPU plutôt que vers les hyperthreads qui ne sont que des imposteurs de CPU. Sinon, dans un système double cœur, vous pouvez avoir un CPU inactif et un cœur très occupé avec deux threads qui s'excitent. Il me semble que cela s'est produit avec Windows 2000 même si, bien sûr, tous les systèmes d'exploitation modernes sont suffisamment capables.