combien de cœurs dois-je utiliser pour les calculs? #cores ou #cores -1?

12

J'ai un gros calcul à faire. Bien que je puisse utiliser tous les cœurs, j'ai pensé qu'il y avait une raison de ne pas utiliser 1 cœur et de ne pas l'utiliser. (calcul cpu seulement pas d'E / S). Ou est-ce que je sous-estime le système d'exploitation qu'il ne saurait pas gérer et effectuer un changement de contexte approprié même si j'utilise tous les cœurs?

Jas
la source
8
L'utilisation de tous les cœurs est un bon début, et une superstition sur le système d'exploitation se comportant mieux avec "-1 cœurs" est probablement juste - de la superstition, mais vous devez en fait le profiler, comment il se comporte pour votre calcul, votre matériel, votre système d'exploitation.
Doc Brown
Dans de nombreux cas, l'utilisation de # cores + 1 est très logique. Si vous utilisez simplement #cores, tout blocage inattendu (tel qu'un défaut de page) force inutilement un noyau à être inactif.
David Schwartz

Réponses:

28

Les principaux systèmes d'exploitation sont suffisamment matures pour savoir comment gérer les processus qui utilisent tous les cœurs disponibles. D'autres processus peuvent (et seront souvent) affectés, mais le calcul ne ralentira pas car vous avez utilisé tous les cœurs disponibles.

Le choix du nombre de cœurs dépend davantage de votre intention de faire autre chose pendant le calcul.

Si, sur une machine de bureau, vous voulez pouvoir utiliser votre navigateur Web ou regarder une vidéo pendant le calcul, vous feriez mieux de garder un cœur libre pour cela. De la même manière, si le serveur fait deux choses (comme faire des calculs et, en même temps, traiter et rapporter ses métriques), garder un noyau libre pour la tâche secondaire pourrait être une bonne idée.

En revanche, si votre priorité est de rendre le calcul le plus rapide possible, vous devez utiliser tous les cœurs.

Arseni Mourzenko
la source
7
Les planificateurs de système d'exploitation modernes sont en fait assez bons pour garder les programmes interactifs interactifs lorsqu'il y a une utilisation élevée du processeur, tant que les programmes interactifs n'utilisent pas non plus beaucoup de processeur (ce qui, accordé, peut être un problème avec les applications Web gonflées modernes)
James_pic
Remarque: même sur les serveurs, si vous voulez pouvoir ssh et obtenir une réponse rapide, laisser le noyau 0 seul peut être utile.
Matthieu M.
11

Ça dépend.

Si la machine est dédiée à ce calcul, vous devez utiliser tous les cœurs - les ressources informatiques inutilisées n'accélèrent pas les choses .

Si vous utilisez un planificateur en temps réel, un planificateur non préemptif ou une affinité de processeur, vous devriez être un peu plus prudent, car il est facile de mettre accidentellement à plat d'autres processus à partir de toutes les ressources informatiques. Cependant, vous devrez modifier manuellement ces paramètres pour que quelque chose se passe mal, donc par défaut, il n'y a pas de problème ici sur la plupart des systèmes d'exploitation.

Si la machine n'est pas dédiée au calcul, donner 100% au calcul peut ne pas être idéal. Par exemple, si vous utilisez un navigateur Web pendant l'exécution du calcul. Parce que la charge de votre machine dépassera parfois 100%, elle se sentira lente. Les tâches axées sur le débit comme le calcul ne seront pas vraiment ralenties, mais les tâches sensibles à la latence comme les interfaces graphiques ne réagiront pas aussi rapidement. Il est alors judicieux de ne démarrer que les threads / processus NPROC-1 pour le calcul. Alternativement, l'utilisation explicite d'une priorité plus faible pour le calcul que pour les tâches normales pourrait résoudre ce problème, auquel cas le calcul devrait utiliser des processus NPROC pour ne pas gaspiller de ressources.

amon
la source
3
"Si vous utilisez un navigateur Web pendant que le calcul est en cours d'exécution […], il sera lent. Les tâches orientées débit comme le calcul ne seront pas vraiment ralenties, mais les tâches sensibles à la latence comme les interfaces graphiques ne réagiront pas aussi rapidement. [ …] L'utilisation explicite d'une priorité plus faible pour le calcul que pour les tâches normales pourrait résoudre ce problème "- Et c'est pourquoi la valeur de priorité du processus sur Unix est appelée" gentillesse "et est configurée à l'aide d'un utilitaire nommé nice.
Jörg W Mittag
2
«les ressources informatiques inutilisées n'accélèrent pas les choses» techniquement, pourraient-ils. L'utilisation de moins de cœurs peut permettre une fréquence d'horloge plus élevée et réduire la synchronisation, ce qui peut ou non accélérer les choses.
Davidmh
2
En plus des notes @Davidmh, généralement côté CPU, L1 $ et L2 $ sont partagés dans une certaine mesure entre les threads et L3 $ est partagé entre tous les sockets, donc l'utilisation de plus de threads pourrait entraîner une augmentation des $ miss ralentissant les processus. Surtout si le processus est lié à la mémoire plutôt qu'au processeur.
Maciej Piechotka
SI vous définissez correctement les niveaux de priorité des threads / processus, vous pouvez atténuer l'impact du travail en arrière-plan sur les processus interactifs. J'exécute des applications informatiques distribuées sur ma machine personnelle depuis plus d'une décennie; et avec les tâches de calcul du processeur exécutées à faible priorité, ma capacité à utiliser des navigateurs et d'autres applications de bureau normales est intacte. Le partage de ressources sur le GPU n'est pas aussi avancé, et j'ai rencontré des problèmes occasionnels avec la vidéo HTML5 accélérée par le GPU (peu importe les jeux) lors de l'exécution du calcul GPU en arrière-plan. Les jeux multi-thread peuvent être problématiques même avec un GFX léger; gagnez les famines threads 2+
Dan is Fiddling by Firelight
1

Je suis quelque peu circonspect à l'idée d'être d'accord avec @motoDrizzt, ci-dessous, en raison de ses votes négatifs :), mais c'est effectivement mon expérience réelle - plus c'est mieux, même au-delà du nombre réel de cœurs (mais pas des milliers). Par exemple, jetez un œil à http://www.forkosh.com/images/avoronoi.gif où chaque plan 2D de ce 3D-voronoi_diagram peut être généré indépendamment. Et le programme prend un attribut nfork = n query_string pour effectuer les calculs pour n plans "simultanément".

Avec un processeur à quatre cœurs, le temps (de l'utilisateur) pour terminer le diagramme diminue de façon assez linéaire avec nfork, jusqu'à environ nfork = 8 (quatre cœurs hyperthreadés). Mais au-delà de 8, le temps diminue encore, bien que plus lentement. Et au-delà d'environ 16, environ, aucune autre amélioration notable. Je n'ai pas analysé ce comportement du tout, mais l'attribue naïvement aux processus de jonglage os (linux slackware 14.2x64 dans ce cas) pour réduire encore plus le temps d'inactivité global.

John Forkosh
la source
0

Le meilleur choix dépend du système. Donc, ce que vous voulez faire, c'est d'exécuter les deux versions sur un système réel, puis de vérifier la réponse du système. Pouvez-vous toujours utiliser un navigateur, un éditeur de texte, d'autres choses sur votre système? Et les performances sont-elles meilleures lorsque vous utilisez n threads et non n-1? Que se passe-t-il si vous exécutez l'application avec une autre application qui essaie d'utiliser tous les processeurs?

Et puis vous devez envisager l'hyperthreading. Avec quatre cœurs plus l'hyperthreading, vous pouvez utiliser 8 cœurs ou 7 cœurs. Encore une fois, essayez la réactivité du système et le temps de terminer.

Et enfin, envisagez de diviser votre travail en plus de blocs que de threads. La raison en est que différents threads termineront le travail à des moments différents, et que vous souhaitez ensuite laisser du travail aux threads les plus rapides. Sinon, vous devrez attendre que le dernier thread soit terminé.

PS. "L'hyperthreading ne peut pas aider avec le code intensif FPU car il n'y a qu'un seul FPU". Absolument faux. Il est incroyablement difficile, même avec du code intensif FPU, d'utiliser pleinement le FPU en raison des latences. L'hyperthreading est utile car il existe deux fois plus d'opérations indépendantes disponibles pour la planification.

gnasher729
la source
-4

Je ne sais pas comment écrire ceci d'une manière qui ne sonne pas "mauvaise", alors prenez-le comme une remarque amicale, d'accord?

Étant donné qu'un PC moyen possède déjà généralement des milliers ou plus de threads, qu'est-ce qui vous fait penser que l'utilisation de 8 vs 7 fera une différence? :-)

Utilisez autant de threads que possible. Et si vous n'avez pas à vous soucier de la réponse du système d'exploitation et que vos threads fonctionnent assez longtemps (plus d'une seconde), vous pouvez même expérimenter en utilisant deux fois le nombre de cœurs.

motoDrizzt
la source
3
Mais la plupart de ces milliers de threads n'utilisent pas 100% de CPU, n'est-ce pas?
Andreas Rejbrand
1
L'utilisation de deux fois le nombre de cœurs n'améliore généralement pas les temps de calcul. En fait, utiliser plus que le nombre de cœurs physiques n'est généralement pas bénéfique, même si vous avez plus de cœurs logiques (via HyperThreading, etc.; bien que cela puisse dépendre de la tâche exacte que vous effectuez). Source: expérience du passé, en utilisant le traitement parallèle MATLAB.
Sanchises
1
@Sanchises En effet, l'hyperthreading exploite l'entrelacement d'instructions quasi-parallèle - il est efficace pour les codes branchés et lourds en mémoire. Les calculs matriciels sont très intensifs en FPU et il n'y a qu'un seul FPU par cœur physique, donc l'hyperthreading ne peut pas vous aider.
J ...