Pourquoi un seul thread est-il réparti sur plusieurs processeurs?


24

Je suis simplement curieux de savoir pourquoi le planificateur déplace constamment une application entre les processeurs, plutôt que de la garder sur une. Il semble un peu ridicule d’avoir 4 noyaux à 25% au lieu d’un à 100%.

Est-ce que cela a à voir avec la chaleur, ou est-ce plus efficace en quelque sorte? Est-ce que les autres OS le font différemment?

Des idées ou des liens vers des informations détaillées seraient utiles. (Impossible de trouver beaucoup moi-même.)

Mettre à jour:

Par "étalé", je ne veux pas dire qu'il s'exécute sur plusieurs processeurs à la fois, mais qu'il est déplacé de l'un à l'autre plusieurs fois par seconde, ce qui donne l'impression qu'il est étalé.


3
Même lorsque "rien d'autre ne s'exécute", il y a toujours des threads système en compétition pour le processeur. Par exemple, le système d’exploitation dispose d’une unité d'exécution pour mettre à zéro les pages de mémoire récupérées. Ainsi, lorsque de la mémoire est requise, certaines pages sont prêtes à être utilisées. Lorsque votre thread est à nouveau exécuté, le cpu sur lequel vous étiez peut être utilisé par l'un de ces threads. Que doit faire l'OS? L'attendre ou vous déplacer vers un nouveau cpu? Quoi qu’il en soit, vous vous retrouvez parfois avec un comportement indésirable.
Tony Lee

C'est un goomba. SMB, pas LBP. :)
Macke

Dans ma "réponse", j’ai montré un programme à thread unique se comportant exactement comme vous le décrivez, c’est-à-dire "passant de l’un à l’autre plusieurs fois par seconde, ce qui a pour effet de donner l’effet qu’il semble dispersé".
Evan Rosica

Réponses:


8

je pense wierob a assez bien décrit le problème.
Voici un article plus ancien discuter processor affinity paramètres avec un quad-core QX6800 .
(le lien pointe vers la deuxième page de cet article).

Si vous ne forcez pas l'affinité de processus avec un noyau, perdez-vous de la performance ?

  • Tandis que le Planificateur Windows doit décider de cette affinité pour éviter de se battre avec des caches,
    la conception du processeur lui-même considère également de telles choses.
  • Le quadricœur Intel QX6800 (puisque je le renvoie plus tôt dans cette réponse)
    a un 8Mo L3 cache partagé sur ses 4 cœurs .

Il convient de noter que, même si vous avez peut-être choisi de n'exécuter que ce processus mono-threadé sur le système, le système d'exploitation lui-même exécute plusieurs autres tâches à exécuter. Le planificateur équilibre toute cette activité entre le pool de processeurs (ou les cœurs) disponible.


À l'avenir, avec le Nehalem architecture et NUMA ,
processeurs sur plusieurs sockets sera également en mesure de mieux répondre à l'accès thrash.
Voici une image rapide d'un Page ArsTechnica sur NUMA .

enter image description here

Si Nehalem et i7 vous intéresse, j'en ai plus liens à cette réponse .


Qu'est-ce qui vous fait penser qu '"à l'avenir, avec l'architecture Nehalem et NUMA, les processeurs de plusieurs sockets seront également en mesure de mieux traiter le thrash d'accès." ? À mon avis, NUMA rend la mémoire encore plus locale et liée au processeur, aggravant ainsi les effets de la suppression.
Roland Pihlakas

@RolandPihlakas, cela fait un moment que depuis cette réponse, mais en regardant l'article d'Arstechnica et ces points, je pense que je rendais compte de la capacité des nouvelles plates-formes à avoir une meilleure connectivité mémoire et du logiciel à en tirer avantage plusieurs configurations de socket à ce moment-là, c'est-à-dire avant Nehalem).
nik

6

Le planificateur exécute simplement le prochain thread prêt à être exécuté sur un core / CPU "libre".

Vous pouvez affecter un processus à une CPU spécifique via le gestionnaire de tâches Windows.

Avoir 4 cœurs à 25% signifie que 4 threads sont exécutés simultanément. Considérant que, un noyau à x% signifie qu'un seul thread est exécuté. Donc, le premier est plus efficace dans certains cas.

Mais lors de son exécution, le cache de la CPU est rempli de données accessibles par le thread. Ainsi, si le thread est exécuté sur un autre processeur, il manquera davantage de données manquantes dans le cache, ce qui est coûteux, car les données ne se trouvent pas dans le cache de ce processeur.

Que fait votre fil? Si le thread "dort" pendant un temps très court, le noyau sur lequel il a été exécuté peut être occupé par une autre menace et votre thread est donc exécuté sur le prochain noyau disponible. Que se passe-t-il si vous ne spécifiez qu'un seul cœur à utiliser par votre processus (par exemple, un gestionnaire de tâches)?


3
Pour rappel, le planificateur Windows fait un très bon travail en conservant les threads sur le même cpu / core pendant toute sa durée pour éviter ce problème.
Paxxi

@ Pär: Mon fil semble s'exécuter sur chaque cœur en fait.
Macke

Ouais, c'est probablement le procs du système d'exploitation qui bouge mon fil. Comment accepter deux réponses? :)
Macke

@ PärBjörklund d'après mon expérience, Windows XP au moins ne le fait pas. Je pense que le problème de "cache-rebond" a été résolu dans Vista ou une version ultérieure
Waxhead

1
"Avoir 4 cœurs à 25% signifie que 4 threads sont exécutés simultanément." Non, cela signifie qu'un thread est exécuté, un peu sur un noyau, puis un autre et ainsi de suite. Lorsque le Gestionnaire des tâches indique une utilisation moyenne, il affiche 25% (sur un système à 4 cœurs, sur 50%), pour chaque cœur. Cela signifie que le noyau a été pleinement utilisé un quart de temps et était resté inactif plus tard.
David Balažic

1

Le système d'exploitation migre le thread entre les cœurs de la CPU (rapidement, plusieurs fois par seconde). Il est plus efficace de l’utiliser tout le temps sur le même noyau. Cela peut être appliqué par l'élément de menu contextuel "Définir l'affinité" dans le Gestionnaire des tâches.

Notez que généralement (utilisation domestique typique) la différence est de l'ordre de quelques pourcents.

Le "4 cœurs chacun à 25% d'utilisation" signifie, comme le montre le Gestionnaire des tâches l'utilisation moyenne, que chaque cœur a été utilisé au maximum un quart du temps et a libéré le reste du temps.

La description concerne Windows, mais elle est similaire sur d’autres systèmes d’exploitation.


0

Ce n'est pas. Un thread ne peut fonctionner que sur un seul processeur. Cependant, certains les processus avoir plusieurs threads, qui peuvent être répartis.

Croyez-le ou non, le raisonnement n’a jamais tenu compte de ce à quoi il ressemble. Le système essaie de répartir les threads car il ne dispose d'aucun moyen de savoir quand on va piquer.


1
Voir ma clarification ajoutée. Il s'agit d'un thread fonctionnant à plein régime qui est rapidement déplacé de manière à ce que, avec le temps, chaque cœur (sur le devant) soit occupé à 25%. (Tous les autres processus / threads sont négligeables)
Macke

-1

Si quelqu'un lit encore ceci, j'ai aussi remarqué cela et effectué plusieurs tests pour voir s'il ne s'agissait pas d'un simple coup de chance. Il s'avère que ce n'est pas le cas! Je pense que la diffusion d'un seul thread sur tous les cœurs est plus efficace pour plusieurs raisons:

  1. La propagation d'un fil sur tous les cœurs permet de réduire la consommation d'énergie. La plupart des processeurs abaissent leurs fréquences et, ce qui est plus important, leur tension en fonction de la charge. Ainsi, un Core 2 Quad, par exemple, consommera beaucoup moins d'énergie et produira moins de chaleur en répartissant un fil sur les quatre cœurs plutôt qu'en utilisant un seul la tension augmente sur TOUS les noyaux, car il n’ya qu’un seul régulateur de tension * - c’est plutôt inefficace).
  2. Cela garantit que le thread tourne toujours à vitesse maximale / constante. Si le thread demande soudainement plus de puissance de traitement, un noyau peut être surchargé et son exécution sera retardée. En le répartissant sur les cœurs, toute pointe soudaine sera traitée sans à-coups, sans retards ni retards.

De plus, à cause des deux observations ci-dessus, j'ai fini par croire que Turbo Boost et IDA étaient inefficaces. Ils sont peut-être utiles sur les anciens systèmes d'exploitation, mais Linux et Windows 7 répartissent tout le contenu dans tous les cœurs de manière assez efficace. Ainsi, un Core 2 Quad q9100 à 2,26 GHz sera presque toujours plus rapide qu'un Core 2 Duo X9100 à 3,06 GHz, et je l'ai rarement vu utiliser IDA (essentiellement le prédécesseur du Turbo boost, augmente la fréquence sur un ou deux cœurs uniquement pour les applications à un seul thread).

  • Le Core 2 Quad a deux domaines d’horloge grâce au fait qu’il existe deux matrices physiques, de sorte que deux cœurs peuvent fonctionner à pleine fréquence, tandis que deux sont à la fréquence la plus basse. Cependant, je ne sais pas s'il existe deux régulateurs de tension - j'ai remarqué que la tension est uniforme sur les 4 conducteurs, il ne doit donc exister qu'un seul régulateur pour l'ensemble du boîtier.

3
Cela semble douteux pour plusieurs raisons. Veuillez fournir des références à vos "faits". Premièrement, pourquoi le matériel informatique à 25% sur quatre cœurs consomme moins d’énergie que 100% sur un? (Je peux convenir que la chaleur est répartie plus uniformément, mais ...) De plus, le fil de ma question tourne à fond (100%), donc il ne "demandera pas plus de puissance de traitement", car il le fait déjà. autant que possible.
Macke

Eh bien, ce n'est que de mes propres observations - j'ai été intrigué par IDA et TurboBoost, j'ai décidé de faire quelques tests. C'était il y a assez longtemps, mais je suis arrivé aux conclusions ci-dessus. Le processeur consomme moins d'énergie, car tous les cœurs fonctionnent à une tension plus faible - une réduction de 0,1 V permet d'économiser environ 6 à 10 watts de consommation d'énergie (si un cœur est chargé à 100%, tous les cœurs fonctionnent à une tension plus élevée, qu'ils soient inactifs ou en veille). ou pas). Cela est particulièrement vrai dans Core2Duo avec le mode SLFM. Vous avez raison de dire que le fil d'exécution tourne à plein régime et ne demande plus de tactes au processeur, mais certaines applications le font effectivement.
JakL

"Répandre un fil", ça n'existe pas (non, pas même 5 ans plus tard). Il n'y a qu'un seul thread, exécuté sur un noyau. Et puis plus tard, un autre. Etc. À chaque instant, un noyau tourne à 100% et les autres sont inactifs. Donc, il n'y a pas d'économie. Surtout que vous mentionnez quand tous les cœurs à sont toujours à pleine tension (comme vous l'avez dit, ils partagent la même tension). De plus, comme déjà mentionné, le fait d’être sur le même noyau assure que le thread obtienne toute la puissance de traitement disponible. Comme ce noyau est déjà utilisé à 100%, le système d’exploitation programmera d’autres threads sur d’autres cœurs moins utilisés.
David Balažic
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.