Combien d'accélération donne un hyper fil? (en théorie)

38

Je me demande quelle est l'accélération théorique des processeurs hyper-threadés. En supposant une parallélisation à 100% et une communication 0, deux CPU donneraient une accélération de 2. Pourquoi pas un CPU hyper-threadé?

Mikhail
la source

Réponses:

59

Comme d’autres l’ont dit, cela dépend entièrement de la tâche.

Pour illustrer cela, examinons un point de repère réel:

entrez la description de l'image ici

Ceci a été pris de mon mémoire de maîtrise (non disponible en ligne pour le moment).

Cela montre l' accélération relative 1 des algorithmes de correspondance de chaînes (chaque couleur est 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 test d'évaluation teste l'accélération avec jusqu'à 16 threads (qui est le nombre maximal de threads simultanés que cette configuration peut exécuter).

Deux des quatre algorithmes (bleu et gris) s'échelonnent de manière plus ou moins linéaire sur toute la plage. C'est-à-dire qu'il bénéficie de l'hyperthreading.

Deux autres algorithmes (en rouge et vert; choix malheureux pour les daltoniens) s'échelonnent linéairement 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, c'est la charge de mémoire; les deux premiers algorithmes nécessitent plus de mémoire pour le calcul et sont contraints par les performances du bus de mémoire principale. Cela signifie que lorsqu'un thread matériel attend de la mémoire, l'autre peut continuer son exécution. un cas d'utilisation privilégié 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 au calcul et n'utilisent que l'arithmétique entière (opérations sur les bits, en fait). Par conséquent, il n’ya pas de potentiel d’exécution parallèle ni d’avantage des pipelines d’instructions parallèles.


1 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, chaque algorithme exécuté sur un thread a un facteur d'accélération relatif de 1.

Konrad Rudolph
la source
Meilleure réponse :-)
Sklivvz
1
Quelles sont les vitesses réelles des algorithmes, rapportées au nombre de cœurs? C'est-à-dire quel est le gain de vitesse pour l'algorithme le plus rapide dans ces tests? Je me demandais juste :).
Crazy2be
@ crazy2be Pour la ligne bleue ( algorithme de Horspool ), le temps d'exécution passe de 4,16 secondes à 0,35 seconde avec 16 threads. Donc, l'accélération est de 11,74. Cependant, c'est avec hyper-threading. Lorsque comparé au nombre de cœurs, cet algorithme accélère de 7.17 sur 8 cœurs.
Konrad Rudolph
5
le seul problème avec cette réponse est que je ne peux le voter qu'une seule fois. C'est une réponse étonnamment objective à une question subjective;)
Journeyman Geek
20

Le problème est que cela dépend de la tâche.

L'hyperthreading est essentiellement basé sur le principe que tous les processeurs modernes ont plus d'un problème d'exécution. Habituellement plus près d'une douzaine maintenant. Divisé en nombre entier, virgule flottante, SSE / MMX / Streaming (comme il est appelé aujourd'hui).

De plus, chaque unité a des vitesses différentes. Par exemple, une unité mathématique entière 3 cycles peut traiter quelque chose, mais une division en virgule flottante de 64 bits peut prendre 7 cycles. (Ce sont des nombres mythiques qui ne sont basés sur rien).

Une exécution hors service aide beaucoup à garder les différentes unités aussi complètes que possible.

Cependant, aucune tâche n’utilisera chaque unité d’exécution à chaque instant. Même la division des discussions ne peut aider complètement.

Ainsi, la théorie devient de faire croire qu’il existe un deuxième processeur, un autre thread pourrait s’exécuter, en utilisant les unités d’exécution disponibles non utilisées, par exemple votre transcodage audio, composé à 98% de matériel SSE / MMX, et les unités int et float étant totalement indépendantes. inactif, sauf pour certains trucs.

Pour moi, cela est plus logique dans un monde à un seul processeur, le fait de simuler un deuxième processeur permet aux threads de franchir plus facilement ce seuil avec un minimum de codage supplémentaire (le cas échéant) pour gérer ce faux processeur.

Dans le monde central 3/4/6/8, avec des processeurs au 6/8/12/16, est-ce que cela vous aide? Dunno. Autant? Dépend des tâches à accomplir.

Donc, pour répondre à vos questions, cela dépend des tâches de votre processus, des unités d’exécution qu’il utilise et, dans votre CPU, des unités d’exécution inactives / sous-utilisées et disponibles pour ce second faux processeur.

On dit que certaines «classes» de matériel informatique en tirent profit (vaguement génériquement). Mais il n'y a pas de règle absolue, et pour certaines classes, cela ralentit les choses.

geoffc
la source
2
Bien que je cherchais quelque chose comme "1.7 accélération du temps", cette réponse est très intéressante car elle ne gifle pas le noir et blanc de ce problème.
Mikhail
@ Mikhail: Le fait est qu'il n'y a pas de facteur simple - cela dépend, comme souvent dans la vie :-).
Sleske
4
L'essence est juste. Un petit reproche cependant: il n'y a pas de raison a priori pour qu'un seul cœur profite davantage de l'hyperthreading que de plusieurs noyaux. Pour la mauvaise tâche, ni profit. Pour la bonne tâche, les deux profitent du même facteur.
Konrad Rudolph
@ Konrad: Je pense que je voulais en venir au fait que la différence entre un cœur et deux cœurs pourrait être plus précieuse que la différence entre 4 et 8 ou 2 et 4. C'est-à-dire qu'un deuxième cœur, une application mal threadée, pourrait aider un peu plus.
geoffc
“Pour une application mal threadée” - c'est le bit important. Mais de manière réaliste, le support de la plupart des applications en matière de threading est faible, vous avez donc un point.
Konrad Rudolph
5

J'ai quelques preuves anecdotiques à ajouter à la réponse de geoffc dans la mesure où j'ai un processeur Core i7 (4 cœurs) avec hyperthreading et un peu joué avec le transcodage vidéo, tâche qui nécessite beaucoup de communication et de synchronisation mais qui en a assez parallélisme que vous pouvez effectivement charger complètement un système.

Mon expérience avec le nombre de processeurs affectés à la tâche utilisant généralement les 4 cœurs "supplémentaires" hyperthreadés équivaut à environ 1 CPU supplémentaire de puissance de traitement. Les 4 cœurs supplémentaires «hyperthreaded» ont ajouté environ la même puissance de traitement utilisable que 3 à 4 cœurs «réels».

Certes, ce n'est pas un test juste, car tous les threads d'encodage seraient probablement en concurrence pour les mêmes ressources dans les CPU, mais pour moi, cela montrait au moins une augmentation mineure de la puissance de traitement globale.

La seule façon réelle de déterminer si cela aide vraiment ou non est d'exécuter simultanément plusieurs tests de type Integer / Floating Point / SSE sur un système sur lequel l'hyperthreading est activé et désactivé, et de voir la quantité de puissance de traitement disponible dans un environnement contrôlé. environnement.

Mokubai
la source
1
Bien un point clair - cela dépend de l'application. Je suis persuadé que les hautes technologies de communication pourraient être accélérées puisque les cœurs 0 et 0-h communiqueraient via le même cache, sans utiliser de mémoire vive (RAM) lente.
Mikhail
1
@ Mikhail, le problème est que si les deux threads nécessitent une grande quantité de puissance de traitement, ils se disputeront les mêmes ressources et seront beaucoup mieux en communication via le cache L3 partagé des CPU (le i7 dispose de cache L1 et L2). par cœur et un cache L3 partagé) ou même de la mémoire système et s’acquittent de leurs tâches séparément. Il s’agit d’un exercice gigantesque de balançoires et de
manèges
3

Cela dépend beaucoup du processeur et de la charge de travail, comme d’autres l’ont dit.

Intel dit :

Les performances mesurées sur le processeur MP Intel® Xeon® avec technologie Hyper-Threading montrent des gains de performances pouvant atteindre 30% sur les tests de performances des 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 tout lu) avec plus de chiffres ici . Un point intéressant à retenir de ce document est que l'hyperthreading peut ralentir le processus pour certaines tâches.

L'architecture Bulldozer d'AMD pourrait être intéressante . Ils décrivent chaque noyau de manière efficace comme 1,5 noyau. Il s’agit en quelque sorte d’hyperthreading extrême ou de multicœurs non standard, en fonction de votre confiance en ses performances probables. Les chiffres de cet article suggèrent une accélération des commentaires comprise entre 0,5x et 1,5x.

Enfin, les performances dépendent également du système d'exploitation. Espérons que le système d’exploitation envoie les processus à de vrais CPU plutôt que les hyperthreads qui se font passer pour des CPU. Sinon, dans un système dual-core, vous pouvez avoir un processeur inactif et un coeur très occupé avec deux threads en cours d'exécution. Il semble que je me souvienne que cela s’est passé sous Windows 2000 bien que, bien entendu, tous les systèmes d’exploitation modernes en soient capables.

Stephen Darlington
la source
1
Le système d'exploitation doit s'assurer que les threads ne se bloquent pas dans l'horloge :)
Mikhail