Disons que j'ai un processeur de serveur avec 18 cœurs, avec hyperthreading, ce qui signifie que je peux voir 36 cpus dans htop.
Pour utiliser pleinement le processeur et ne pas avoir d'impact sur les performances d'un seul thread, dois-je viser à ce que les 36 "cœurs" fonctionnent à 100%, et les cœurs HT feront juste moins de travail et rapporteront toujours 100%, ou cela signifierait-il que le les cœurs «pleins» sont déjà interrompus par la tâche sur son «cœur HT» et font donc moins de travail sur un seul thread?
Je suis conscient qu'il y a beaucoup de variables qui affectent les performances HT, je veux juste savoir ce que les compteurs d'unités centrales signifient lorsqu'ils traitent avec HT.
hyperthreading
Tassadar
la source
la source
Réponses:
Si le second noyau virtuel est autorisé à contribuer lorsque le premier serait autrement coincé, il vaut mieux que pas , vous obtenez (au moins) un peu de travail supplémentaire effectué.
La question devient: quand le fait d'avoir deux threads différents en fait-il un pire? La prédiction de branche et les dépendances entre les instructions ne changeront pas. En attente de l'accès à la mémoire maintenant ... les deux threads rivalisent sur l'accès à la mémoire, à la fois en termes d'utilisation du cache et de bande passante.
Si certains processeurs fonctionnent avec HT et d'autres non, cela signifie-t-il également que vous affecterez des threads spécifiques à un type ou à l'autre? Je ne pense pas: vos programmes exécuteront leurs threads sur des cœurs virtuels aléatoires. Alors, comment le fractionnement de la configuration aide-t-il? Étant donné que chaque CPU a son propre cache, le seul effet est dû à la bande passante mémoire et au fardeau de la cohérence du cache.
En général, vous atteignez un point où avoir quelque chose de plus que vous pourriez faire coûte plus cher que de laisser certaines unités d'exécution du processeur devenir inactives. Cela ne dépend pas directement du nombre de threads, mais de ce que font les threads et de l'architecture détaillée de la mémoire et des nuances de performances des différents composants.
Il n'y a pas de réponse simple. Même avec un programme spécifique en tête, la machine peut différer de celles des personnes racontant leurs propres expériences.
Vous devez l'essayer vous-même et mesurer ce qui est le plus rapide, avec ce travail spécifique sur cette machine exacte. Et même alors, cela peut changer avec les mises à jour logicielles et le changement d'utilisation au fil du temps.
Jetez un œil au volume 3 du magnum opus d'Anger . Si vous examinez attentivement un processeur spécifique, vous pouvez trouver des ressources limitées parmi le pipeline profond de nombreuses étapes nécessaires à l'exécution de code. Vous devez trouver un cas où l'excès de financement le fait s'exécuter plus lentement, au lieu de ne pas prendre plus de travail. En général, cela signifierait une sorte de mise en cache; et où la ressource est partagée entre les threads.
Que signifie le compteur CPU: il signale tout le temps qui n'est pas passé à exécuter le thread inactif. Les deux threads logiques affectés à un noyau ne seront pas inactifs même si le travail réel effectué sur l'un d'eux peut être faible. Le temps passé avec le pipeline bloqué pendant quelques cycles jusqu'à ce que les résultats soient prêts, que la mémoire soit récupérée, que les opérations atomiques soient clôturées, etc. et le temps montre toujours en cours d'utilisation. L'attente sur la RAM ne s'affichera pas comme inactive. Seul quelque chose comme les E / S fera le bloc de threads et arrêtera le temps de chargement vers lui. Un mutex de système d'exploitation le fera en général, mais avec l'essor des systèmes multicœurs, ce n'est plus une chose sûre, car un «verrou tournant» ne fera pas revenir le fil sur l'étagère.
Ainsi, un compteur CPU de 100% ne signifie pas que tout se passe bien, si le CPU est souvent bloqué en attente de mémoire. Un nombre inférieur de cœurs logiques affichant 90% pourrait très bien faire plus de travail, car il termine le calcul du nombre et attend maintenant sur le disque.
Ne vous inquiétez donc pas du compteur CPU. Regardez les progrès réels fait, seulement .
la source
Les indicateurs de CPU sont très mauvais pour vous dire combien de performances supplémentaires vous pouvez retirer de vos CPU hyperthreadés. Pour cela, vous devez exécuter vos propres benchmarks à différents taux de sur-abonnement au cœur physique. Certaines charges de travail fonctionnent mieux avec HT complètement désactivé, alors incluez également ce cas dans vos tests. Ce pourrait être un 1: 2 (36 travailleurs parallèles), ou 1: 1,5, voire 1: 2,5! Cela dépend de votre charge de travail.
Plus en détail, HT est implémenté sur le silicium de manière à réduire le temps d'inactivité du processeur lorsqu'un contexte doit être commuté ou qu'une prédiction de branche échoue. Cela permet d'atteindre plus facilement 100% d'utilisation de l'unité d'exécution qu'avec des astuces de système d'exploitation pur. HT a évolué depuis son introduction, et il y a plus de parallélisme sur les puces modernes que celles que nous utilisions il y a 10 ans.
Il existe deux profils d'exécution qui affecteront l'emplacement de votre point de surabonnement optimal:
la source
Vous devriez voir les 36 cœurs fonctionner à 100% - en supposant que le logiciel peut le faire (ce qui n'est pas anodin - la planification peut être délicate avec autant de cœurs, donc les creux inférieurs à 100% sont acceptables).
De toute évidence, lorsque vous "divisez" un minerai avec de l'hyperthreading, la signification de ces 200% n'est pas "2x100% - dans le travail effectué. Mais cela est invisible pour toute mesure prise (qui provient de l'utilisation du processeur et n'a aucun concept de travail effectué). La quantité de travail à effectuer dépend de la nature du travail - quelque part au-dessus de 1,5 x le travail sans hyper-threading est à prévoir la plupart du temps.
la source
La façon dont l'hyperthreading est implémentée varie en fonction de l'uarch CPU spécifique. De Nehalem à Skylake, Intel a considérablement réduit les parties partagées à ratio fixe (c.-à-d.: 50/50) du pipeline, se dirigeant vers des structures partagées de manière dynamique.
Quoi qu'il en soit, en termes généraux, l'activation de HT a conduit à une exécution à un seul thread légèrement plus lente, mais en raison du fonctionnement du planificateur Linux, cela ne se produit que lorsque le nombre ou le thread en cours d'exécution est supérieur au nombre de cœurs physiques. Comme dans de telles situations (lorsque threads> cœurs) vous appréciez généralement le débit total d'une importance maximale, l'hyperthreading reste un gain net.
Comment est-ce possible? Le point clé à comprendre est que le CPU ne présente pas les cœurs physiques et les cœurs virtuels comme des cœurs égaux, il expose plutôt ces derniers de manière à ce que le planificateur Linux puisse éviter de les planifier si d'autres cœurs physiques sont disponibles. En d'autres termes, il utilise d'abord tous les cœurs physiques, puis il commence à utiliser le virtuel.
Cela signifie que, généralement, HyperThreading est une fonctionnalité très précieuse (d'autres processeurs, comme Power8, utilise des techniques SMT encore plus approfondies) et que pour maximiser le débit, vous devez l'activer, en chargeant le processeur avec au moins un thread par cœur virtuel ou physique. Pour un exemple pratique, pour extraire toutes les performances d'un processeur 18 cœurs, vous devez utiliser au moins 36 threads.
Il existe deux exceptions:
la source