web-dev-qa-db-fra.com

multi-CPU, multi-core et hyper-thread

Quelqu'un pourrait-il me recommander des documents pour illustrer les différences entre multi-CPU, multi-core et hyper-thread? Je suis toujours confus au sujet de ces différences et des avantages/inconvénients de chaque architecture dans différents scénarios.

EDIT: voici ma compréhension actuelle après avoir appris en ligne et appris des commentaires des autres; quelqu'un pourrait-il commenter le commentaire s'il vous plaît?

  1. Je pense que l'hyper-thread est la technologie la plus inférieure parmi eux, mais bon marché. Son idée principale est la duplication des registres pour gagner du temps de changement de contexte;
  2. Le multiprocesseur est meilleur que l'hyper-thread, mais comme différents processeurs sont sur des puces différentes, la communication entre différents processeurs est de plus longue latence que le multicœur, et en utilisant plusieurs puces, il y a plus de dépenses et plus de consommation d'énergie qu'avec le multicœur ;
  3. multi-core intègre tous les CPU sur une seule puce, de sorte que la latence de communication entre les différents CPU est considérablement réduite par rapport au multi-processeur. Puisqu'il utilise une seule puce pour contenir tous les processeurs, il consomme moins d'énergie et est moins cher qu'un système multiprocesseur.

merci d'avance, George

75
George2

Multi-CPU était la première version: vous auriez une ou plusieurs cartes mères avec une ou plusieurs puces CPU sur elles. Le problème principal ici était que les CPU devraient exposer certaines de leurs données internes à l'autre CPU pour ne pas les gêner.

L'étape suivante était l'hyper-threading. Une puce sur la carte mère, mais elle comportait deux parties en interne afin de pouvoir exécuter deux instructions en même temps.

Le développement actuel est multicœur. C'est fondamentalement l'idée originale (plusieurs processeurs complets) mais dans une seule puce. L'avantage: les concepteurs de puces peuvent facilement insérer les fils supplémentaires pour les signaux de synchronisation dans la puce (au lieu d'avoir à les acheminer sur une broche, puis sur la carte mère encombrée et vers le haut dans une deuxième puce).

Les superordinateurs d'aujourd'hui sont multi-cpu, multi-core: ils ont beaucoup de cartes mères avec généralement 2-4 processeurs, chaque CPU est multi-core et chacun a sa propre RAM.

[EDIT] Vous avez tout à fait raison. Juste quelques points mineurs:

  • L'hyper-threading assure le suivi de deux contextes à la fois dans un seul cœur, exposant ainsi plus de parallélisme au cœur du processeur hors service. Cela maintient les unités d'exécution alimentées par le travail, même lorsqu'un thread est bloqué sur un échec de cache, une erreur de prévision de branche ou en attente de résultats d'instructions à latence élevée. C'est un moyen d'obtenir plus de débit total sans répliquer beaucoup de matériel, mais au contraire, cela ralentit chaque thread individuellement. Voir ce Q & A pour plus de détails , et une explication de ce qui n'allait pas avec le libellé précédent de ce paragraphe.

  • Le principal problème avec les multi-CPU est que le code s'exécutant sur eux finira par accéder à la RAM. Il y a N CPU mais un seul bus pour accéder à la RAM. Vous devez donc disposer d'un matériel qui garantit que a) chaque CPU obtient une bonne quantité de RAM, b) qui accède à la même partie du RAM = ne cause pas de problèmes et c) plus important encore, le CPU 2 sera averti lorsque le CPU 1 écrit dans une adresse mémoire que le CPU 2 a dans son cache interne. Si cela ne se produit pas, le CPU 2 utilisera avec plaisir la valeur mise en cache, inconsciente du fait qu'elle est obsolète

    Imaginez simplement que vous avez des tâches dans une liste et que vous souhaitez les répartir sur tous les processeurs disponibles. Le CPU 1 récupérera donc le premier élément de la liste et mettra à jour les pointeurs. Le CPU 2 fera de même. Pour des raisons d'efficacité, les deux processeurs copient non seulement les quelques octets dans le cache, mais toute une "ligne de cache" (quelle qu'elle soit). L'hypothèse est que, lorsque vous lirez l'octet X, vous lirez bientôt également X + 1.

    Maintenant, les deux processeurs ont une copie de la mémoire dans leur cache. Le CPU 1 récupérera alors l'élément suivant de la liste. Sans synchronisation du cache, il n'aura pas remarqué que le CPU 2 a également changé la liste, et il commencera à fonctionner sur le même élément que le CPU 2.

    C'est ce qui rend le multi-CPU si compliqué. Les effets secondaires de cela peuvent conduire à des performances qui sont pires que celles que vous obtiendriez si tout le code ne s'exécutait que sur un seul processeur. La solution était multicœur: vous pouvez facilement ajouter autant de câbles que nécessaire pour synchroniser les caches; vous pouvez même copier des données d'un cache vers un autre (mettre à jour des parties d'une ligne de cache sans avoir à vider et recharger), etc. Ou la logique de cache pourrait s'assurer que tous les processeurs obtiennent la même ligne de cache lorsqu'ils accèdent à la même partie de la vraie RAM, bloquant simplement le processeur 2 pendant quelques nanosecondes jusqu'à ce que le processeur 1 ait effectué ses modifications.

[EDIT2] La principale raison pour laquelle le multicœur est plus simple que le multi-processeur est que sur une carte mère, vous ne pouvez tout simplement pas faire passer tous les fils entre les deux puces dont vous auriez besoin pour rendre la synchronisation efficace. De plus, un signal ne parcourt que 30 cm/ns (vitesse de la lumière; dans un fil, vous en avez généralement beaucoup moins). Et n'oubliez pas que, sur une carte mère multicouche, les signaux commencent à s'influencer mutuellement (diaphonie). Nous aimons penser que 0 est 0V et 1 est 5V mais en réalité, "0" est quelque chose entre -0,5 V (overdrive lors de la chute d'une ligne de 1-> 0) et 0,5 V et "1" est quelque chose au-dessus de 0,8 V.

Si vous avez tout à l'intérieur d'une seule puce, les signaux fonctionnent beaucoup plus rapidement et vous pouvez en avoir autant que vous le souhaitez (enfin, presque :). De plus, la diaphonie du signal est beaucoup plus facile à contrôler.

82
Aaron Digulla

Vous pouvez trouver des articles intéressants sur le double processeur, le multicœur et l'hyper-threading sur site Web d'Intel ou dans un court article de niversité de Yale .

J'espère que vous trouverez ici toutes les informations dont vous avez besoin.

4

En bref: un système multi-CPU ou multi-processeurs a plusieurs processeurs. Un système multicœur est un système multiprocesseur avec plusieurs processeurs sur la même puce. En hyperthreading, plusieurs threads peuvent s'exécuter sur le même processeur (c'est-à-dire que le temps de changement de contexte entre ces plusieurs threads est très petit).

Les multi-processeurs existent depuis 30 ans maintenant mais surtout dans les laboratoires. Multi-core est le nouveau multi-processeur populaire. Les processeurs serveurs implémentent aujourd'hui l'hyperthreading avec les multi-processeurs.

Les articles de wikipedia sur ces sujets sont assez illustratifs.

2
amit