web-dev-qa-db-fra.com

Différences multithreading et multicœurs

J'ai quelques petites questions.

Premièrement, y a-t-il une différence entre le multithreading et le multicœur? S'agit-il de deux choses complètement différentes ou le multithreading utilise-t-il plus d'un cœur s'il en a besoin?

Deuxièmement, la plupart des cœurs ont deux threads, mais lors du profilage de mon application, j'ai remarqué de nombreux threads différents allant du thread 128 au thread 3460. Qu'est-ce qui dicte le nombre de threads de votre ordinateur?

Merci

33
DavidColson

Premièrement, y a-t-il une différence entre le multithreading et le multicœur?

Oui.

Le multithreading et le multicœur sont différents éléments de terminologie qui s'appliquent à différents domaines de l'informatique.

  • Le multicœur fait référence à un ordinateur ou à un processeur qui a plus d'un cœur de processeur logique et qui peut exécuter physiquement plusieurs instructions en même temps. Le "nombre de cœurs" d'un ordinateur est le nombre total de cœurs que possède l'ordinateur: les ordinateurs peuvent avoir plusieurs processeurs, chacun pouvant avoir plusieurs cœurs; le nombre de cœurs est le nombre total de cœurs sur tous les processeurs.

  • Le multithreading fait référence à un programme qui peut tirer parti d'un ordinateur multicœur en s'exécutant sur plusieurs cœurs en même temps. En général, deux fois plus de cœurs équivalent à deux fois plus de puissance de calcul (pour les programmes qui prennent en charge le multithreading), bien que certains problèmes soient limités par des facteurs autres que l'utilisation du processeur; ces problèmes ne connaîtront pas des gains aussi spectaculaires grâce au multithreading.

    Il est important de noter que les performances ne sont pas la seule raison pour laquelle les programmes utilisent de nombreux threads. Plus sur cela plus tard.

S'agit-il de deux choses complètement différentes ou le multithreading utilise-t-il plus d'un cœur s'il en a besoin?

Ils sont liés mais séparés.

Les programmes qui prennent en charge le multithreading peuvent utiliser plusieurs cœurs si plusieurs sont disponibles.

La plupart des cœurs ont deux threads mais lors du profilage de mon application, j'ai remarqué de nombreux threads différents allant du thread 128 au thread 3460.

Le système d'exploitation attribue des numéros de threads afin qu'il puisse les suivre.

La plupart des programmes que vous exécuterez n'auront pas besoin de 3400 threads exécutés en même temps. En outre, un thread en cours d'exécution consommera tout un noyau. La seule raison pour laquelle votre processeur ne fonctionne pas à 100% tout le temps est que le système d'exploitation sait comment suspendre le processeur, ce qui le fait essentiellement arrêter tout et attendre que quelque chose se produise (comme un IO (un événement ou une horloge). Un seul thread peut s'exécuter sur un cœur à la fois. Différents threads exécutés sont en fait uniquement des threads sautant sur le processeur et s'exécutant pendant de courtes périodes de temps, puis étant désactivés avec d'autres threads qui doivent également s'exécuter.

Qu'est-ce qui dicte le nombre de threads de votre ordinateur?

Le nombre total de threads dans tous vos processus. De plus, la plupart des systèmes d'exploitation imposent une limite stricte, un nombre maximum de threads existants qui ne peuvent pas être dépassés.

Un processus est un programme (vous le savez probablement). Le multithreading est le processus consistant à avoir plus d'un thread par processus (de nombreux processus ne créeront pas plus d'un thread car ils n'y sont pas obligés). Windows n'a pas de limite stricte sur le nombre de threads que vous pouvez créer (du moins, pas depuis XP. Je ne dirai rien sur w98 et les versions précédentes), mais bien sûr, le nombre de threads que vous pouvez créer est limité par la quantité de mémoire vous avez.

Vous avez dit que certains programmes utilisent plusieurs threads pour des raisons autres que les performances.

Parfois, il est agréable de pouvoir effectuer plusieurs tâches, même si ce n'est pas simultanément.

Parfois, les programmes doivent faire des choses spécifiques à des moments précis. Un exemple couramment cité est un programme avec une fenêtre visible. Ce programme peut effectuer une analyse intensive des nombres d'arrière-plan, mais il serait avantageux qu'il puisse toujours répondre aux événements des utilisateurs, comme cliquer sur des boutons et le redimensionner. Cela peut être accompli avec un traitement asynchrone, qui nécessitera que votre seul thread vérifie à plusieurs reprises le travail de l'interface graphique à effectuer à intervalles, suspend ce qu'il fait et gère l'interface graphique pendant un certain temps. Beaucoup de choses le font de cette façon.

Un autre moyen, peut-être meilleur, de le gérer est d'utiliser un fil. Votre programme n'a pas à se soucier de basculer entre la compression des nombres et la gestion de l'interface graphique, le système d'exploitation gérera cela pour vous. Même si vous n'avez qu'un seul cœur, vous pouvez toujours exécuter plusieurs threads et votre système d'exploitation fera de son mieux pour s'assurer que tous les threads en cours d'exécution dans tous les processus en cours d'exécution obtiennent leur juste part du temps processeur.

59
Wug

Le nombre de cœurs et le nombre de threads sont découplés. Vous pouvez avoir de nombreux threads exécutés sur un seul cœur et vous pouvez avoir des situations où un seul thread s'exécute malgré la présence de plus de cœurs (bien que je ne puisse pas penser à un scénario réel où cela se produirait). Disons que le multicœur est une caractéristique matérielle, alors que le nombre de threads est quelque chose dans le domaine de l'OS et des processus qui s'exécutent dessus.

Bien sûr, avec un seul cœur, vous ne pouvez pas avoir plus d'un thread en cours d'exécution simultanément. Le système d'exploitation doit constamment basculer entre les threads.

7
juanchopanza

La plupart des cœurs ont deux fils

Ici, je pense que vous confondez le terme surchargé "thread". Comme l'ont souligné à juste titre d'autres réponses, un fil se réfère généralement à un concept de "logiciel". Mais parfois, il est également utilisé comme un concept "matériel". Lorsqu'un "noyau" a deux "threads" (comme dans de nombreuses nouvelles puces Intel), cela signifie que le noyau peut exécuter deux threads parallèles, comme s'il y avait deux cœurs. C'est ce que l'on appelle généralement l'hyperthreading. Voir:

http://en.wikipedia.org/wiki/Hyper-threading

Donc, si vous avez N threads (je veux dire les threads logiciels, ceux créés dans votre application, ou tout simplement en exécutant différentes applications en même temps) et M processeurs (étant des cœurs ou les threads matériels expliqués ci-dessus), ce qui suit se produit:

  • N <= M: le système d'exploitation doit alors affecter à chaque thread un processeur différent. Ensuite, les threads d'application s'exécutent réellement en parallèle.
  • N> M: alors certains threads doivent partager un processeur.
5
Mahdi

Enfiler sur un seul cœur signifie généralement que vous pouvez créer x nombre de threads et que chacun d'eux disposera d'un temps défini pour s'exécuter (quantum de thread). Lorsque les threads sont commutés, cela est connu sous le nom de changement de contexte, tout cela prend un certain temps, il faut donc faire quelques analyses comparatives pour trouver un nombre idéal de threads à avoir par cœur.

Si la majorité du travail est lié à l'unité centrale de traitement, il est inutile de générer des centaines de threads, car il est peu probable que cela améliore les performances (en fait, cela peut être pire, souvenez-vous que le changement de contexte n'est pas gratuit). Cependant, cela peut être utile pour le travail lié aux E/S, car pendant que le système est occupé à effectuer ce travail, un autre thread peut recevoir du temps processeur.

Avoir des cœurs physiques supplémentaires signifie que deux choses peuvent vraiment fonctionner en parallèle au niveau matériel.

4
Science_Fiction