2009-07-09 14 views
1

Cette question est générique. Supposons que je crée une application simple en Java ou VC++ qui crée deux threads et je lance l'application dans un système multicœur. Sans aucune directive spécifique sur le cœur à exécuter, l'application distribuera-t-elle elle-même les threads sur différents cœurs?Application multithread dans un processeur multicœur

Merci.

Répondre

8

L'application ne distribuera pas les threads, mais l'OS le fera. C'est son travail. :)

Il est intéressant de noter que les threads peuvent basculer assez fréquemment entre les cœurs au cours d'un seul processus en cours en raison d'autres charges et interruptions pouvant atteindre un cpu core.

Si vous décidez que vous avez besoin de spécifier le noyau sur lequel un thread particulier peut s'exécuter, le système d'exploitation fournira généralement un mécanisme définissant l '"affinité" du thread à une unité centrale spécifique. Cela peut être utile dans des scénarios d'optimisation avancés pour conserver un cache de thread particulier chaud, par ex. Ce n'est généralement pas nécessaire, cependant.

3

Le système d'exploitation affecte des processus et des unités d'exécution à différents cœurs. Cela ne veut pas dire que vous ne pouvez pas influencer la décision, certains systèmes d'exploitation vous permettent un certain contrôle sur la décision. Les processus peuvent également se déplacer entre les cœurs si nécessaire pour assurer une bonne utilisation des cœurs.

1

Vous pouvez le faire sous Windows avec SetThreadIdealProcessor et calls API associés:

http://msdn.microsoft.com/en-us/library/ms684251(VS.85).aspx

Si vos fils sont chacun réclament une beaucoup de ressources alors vous attendez le système d'exploitation pour les distribuer à travers les noyaux disponibles.

Je serais un peu méfiant de jouer avec l'affinité de fil comme vous êtes en train de deviner le planificateur du système d'exploitation. Par exemple, vous risquez de rendre votre application moins réactive mais de planifier les threads de manière à concurrencer le thread d'interface utilisateur principal de votre application.

J'aborde généralement les choses dans l'ordre suivant à l'aide d'un profileur et quelques points de repère d'application fixes afin que je puisse comparer les différentes approches

  1. L'algorithme
  2. L'algorithme - Sérieusement! Avant de penser à autre chose s'inquiéter de l'algorithme.
  3. Commutateurs du compilateur: avez-vous activé toutes les optimisations pour votre version de version?
  4. Astuces du compilateur - Assurez-vous que votre code donne au compilateur autant d'informations que possible afin qu'il puisse optimiser. Par exemple utilisez-vous des pointeurs ou un autre mécanisme que le compilateur ne peut pas deviner.
  5. Caching, affinité de fil, etc.

Ade