Un ordinateur a 2 cœurs physiques et 4 cœurs logiques (par exemple, un ordinateur avec un processeur i5-3210M).
Lorsqu'un programme A s'exécute, htop indique qu'il utilise 100% d'un noyau et que 3 autres sont presque inactifs. Le débit dans ce cas est X.
Ma question est la suivante: si j'exécute 4 instances de A sur 4 cœurs logiques, le débit total est-il de 4X ou 2X? Et si je ne fais que deux instances?
Le concept de cœurs n'est pas si simple. Cœurs logiques sont le nombre de Cœurs physiques fois le nombre de threads pouvant être exécutés sur chacun des cœurs. C'est ce qu'on appelle HyperThreading. Si j'ai un ordinateur qui a un processeur à 4 cœurs, exécute deux threads par cœurs, alors j'ai 8 processeurs logiques. Vous pouvez voir les principales fonctionnalités de votre ordinateur en exécutant la commande lscp.
Si un processeur a 4 cœurs, mais qu'il peut exécuter 8 threads en parallèle, cela signifie qu'il n'a que 4 cœurs (unités de traitement). Mais il peut fournir un support matériel à 8 threads en parallel. Il est clair que 4 tâches au maximum peuvent être exécutées dans les cœurs. Un travail en cours d'exécution dans le noyau, si par quelque moyen que ce soit bloque mémoire ou opération d'E/S, un autre thread peut utiliser ce noyau libre.
Vous comprenez maintenant que si votre ordinateur a 2 cœurs physiques et peut exécuter 2 threads par cœur, vous en avez 4 processeurs logiques. Vous ne pouvez donc exécuter que 2 instances car vous avez 2 cœurs physiques, ce qui signifie que vous utilisez toutes les fonctionnalités d'un seul cœur physique (2 threads à la fois). Donc, le débit sera de 50%. Mais si à tout moment un thread devient inactif, le noyau peut en charger un sur ce noyau.
Vous pouvez désactiver le HyperThreading dans BIOS (quelque chose comme "technologie Intel ht") et voir la différence entre les capacités normales et HyperThreading: maintenant, le débit sera de 100%.
Même avec beaucoup plus de cœurs que de tâches, ils n’évolueront pas parfaitement. C’est parce qu’un État est presque toujours partagé. Pas nécessairement dans la tâche, mais le noyau, par exemple. Ou ils peuvent accéder à la même ressource, comme le réseau ou un disque ou autre.
SMT (c'est-à-dire, Hyper-Threading) peut s’appuyer sur le fait que différentes tâches utilisent différentes unités d’exécution de la CPU. En tant que tel, le "parallélisme au niveau instruction" peut être obtenu sur CPU superscalar . Pratiquement tous les processeurs x86 modernes sont superscalaires.
En supposant que vous ayez deux tâches consistant uniquement à ajouter des nombres sans autre instruction de la CPU, elles entreront en conflit si elles sont exécutées sur le même cœur physique, ce qui pourrait entraîner une dégradation significative des performances.
Cependant, la plupart du temps, ce n’est pas le cas et une foule de choses se passent. Tant que la même commande n'apparaît pas (sensiblement) au même moment sur les deux flux d'instructions, l'utilisation de l'unité d'exécution de la CPU peut être améliorée.
Si le programme n'a aucun moyen de coordonner des instances séparées, vous n'obtiendrez certainement aucune amélioration.
exemple:
Si j'ai un seul programme threadé qui calcule les nombres premiers de 2 à 10, une seule instance en cours d'exécution calculera si chaque nombre de 2 à 10 est premier et constate que 2,3,5,7 sont premiers.
Si j'ajoute une deuxième instance sans aucune modification du code La première instance calcule si chaque nombre compris entre 2 et 10 est premier et trouve que 2,3,5,7 sont premiers, tandis que la deuxième instance calcule si chaque nombre de 2-10 sont premiers et trouvent que 2,3,5,7 sont premiers.
cela aurait pour résultat que le même travail serait effectué deux fois, sans aucune amélioration.