2016-04-12 2 views
2

J'ai une question que j'ai essayé de trouver une réponse, mais on m'a donné plus confus de toutes les informations que je trouve - malheureusement, ne pouvait pas obtenir une réponse clairenombre optimal de threads lorsque hyperthreading est désactivé

Ainsi, Disons que j'ai un ordinateur avec hyperthreading éteint.

Quel est le nombre optimal de threads que je devrais utiliser dans un programme que j'ai écrit? Je comprends que si mon programme n'est pas lié à 100% CPU (traite avec IO), donc le nombre optimal de threads sera de plus d'un thread par cœur - car je vais avoir plusieurs threads qui attendent, et avoir plus (pas trop en raison du changement de contexte) sera meilleur pour ce genre de programmes. MAIS, Dans le cas où mon programme est lié à 100% CPU - un thread par cœur est l'optimal? Je suis confus car j'ai plus de threads, ce qui signifie que je peux gagner du temps pour chaque thread - ce qui peut améliorer les performances.

Merci!

+1

Je n'ai pas de réponse claire, mais vous pouvez toujours comparer votre programme. –

+0

Impossible de répondre sans connaître la charge de travail. Plus de threads signifient une tranche * plus petite * et plus de frais généraux si tous sont en cours d'exécution. –

Répondre

0

Avec des charges purement liées au CPU sans hyper-threading, la réponse est toujours de 1 thread par cœur. Avec HT activé, il peut y avoir moins d'un thread par HT-core car les threads se disputent sur le même cache. Mais généralement, même ici, un fil par cœur HT est le meilleur.

Avec les charges de travail d'E/S, c'est beaucoup plus compliqué mais cela ne s'applique pas ici.

depuis avoir plus de fils, ce qui signifie peut-être obtenir un plus grand temps de tranche pour chaque fil

Je ne sais pas que je suis le raisonnement. Le système d'exploitation distribue des tranches de temps aux threads de façon approximative. Les tranches de temps sont comprises entre 4 et 40 ms et leur taille ne change pas en fonction du nombre de threads.

Idéalement, lorsque le nombre de threads est exactement exact, il n'y a pas de commutateurs de contexte à proprement parler. Plus vous ajoutez de threads, plus il y aura de commutateurs de contexte.

+0

OK merci! à propos de la plus grande tranche de temps, c'était un malentendu de mon. Vous dites que si le HT est sur 1 thread par cœur est généralement le meilleur? Je m'attendrais à ce que ce soit 2 réellement (quand 2 threads peuvent fonctionner ensemble). Sinon, si le problème de cache partagé est trop grand, pourquoi utiliser HT du tout? –

+0

Si vous avez des cœurs 4x2, exécutez 8 threads (généralement). Le cache partagé fonctionne correctement, c'est juste qu'il doit maintenant contenir les données de deux threads. Cela peut ne causer aucun problème ou entraîner une dégradation. Je pense que la dégradation est un cas marginal. Le moyen le plus sûr est, bien sûr, d'essayer les deux approches et de comparer. Vous pouvez même exécuter un benchmark automatisé de 5 secondes sur les machines client. – usr