2010-11-16 6 views
2

J'ai une question ... J'ai besoin de construire une application multi-thread et ma question est: si j'ai un processeur 2cpu, est automatiquement que mes 2 threads sont séparément un par processeur? et si j'ai 4 threads et mon pc ont 4cpu, sont encore 1 par processeur? et si j'ai 4 processeur et 2 cpus, comment est divisé ??C++ division de fil dans le microprocesseur

merci à l'avance

Répondre

7

Ce n'est pas vraiment une question qui peut répondre à moins que vous spécifiez le système d'exploitation au minimum.

C++ lui-même ne connaît rien des threads, ils sont un service fourni par le système d'exploitation à l'environnement d'exécution, et dépendent de ce système pour son implémentation.

D'une manière générale, je suis à peu près certain que Linux planifie les threads de façon indépendante, de sorte que plusieurs threads puissent être répartis sur différents processeurs et/ou cœurs. Je pense que Windows ferait la même chose. Certains OS 'vous permettront de spécifier l'affinité des threads, la possibilité pour les threads (et parfois les groupes de threads) de coller avec un seul CPU mais, encore une fois, c'est un problème de système d'exploitation plutôt qu'un C++. Pour Windows (selon votre commentaire), vous pouvez lire this introduction. Windows fournit une fonction SetProcessAffinityMask() pour contrôler l'affinité de tous les threads dans un processus donné ou SetThreadAffinityMask() pour contrôler les threads indépendamment. Mais, habituellement, vous trouverez qu'il est préférable de laisser ces derniers seuls et de laisser le système d'exploitation trier - à moins que vous ayez un besoin spécifique pour un comportement différent, le système d'exploitation prendra presque certainement les bonnes décisions.

+0

désolé, j'utilise le C++ visuel et je crée le programme pour Windows – ghiboz

+0

+1 Je seconde la suggestion de laisser le masque d'affinité de processus seul tant que vous n'en avez pas vraiment besoin. (Lors de la lecture de temps de haute précision, il est malheureusement nécessaire) – daramarak

4

La façon dont les threads sont alloués aux processeurs est spécifique au système d'exploitation sur lequel votre application s'exécute. Généralement, la plupart des systèmes d'exploitation ne garantissent pas la répartition de vos threads entre les processeurs, même si certains ont des API de bas niveau pour vous permettre de spécifier l'affinité des threads.

+0

merci sean ... et pour Windows savez-vous les API ?? – ghiboz

+0

Je pense que c'est SetThreadAffinityMask – Sean

+1

@ghiboz: S'il vous plaît noter que c'est _quite_ inhabituel d'appeler 'SetThreadAffinityMask'. Habituellement, Windows peut faire mieux que vous, car il peut facilement prendre en compte tous les threads de tous les processus. – MSalters

2

Si vos threads sont liés à la CPU, ils ont tendance à être planifiés sur toutes les CPU disponibles.

Si vos threads sont liés à l'E/S, alors si vous n'avez qu'un thread par CPU, la plupart des processeurs resteront inactifs. C'est pourquoi - en essayant de maximiser la performance - il est important de mesurer ce qui se passe et de trouver un ratio codé de threads par CPU, ou utiliser le mécanisme de pool de threads des systèmes d'exploitation qui a suffisamment d'informations pour garder autant de threads actif car il y a des cœurs de CPU. Vous ne voulez généralement pas avoir PLUS de threads actifs que les processeurs (c'est-à-dire les threads qui ne sont pas bloqués en attente d'E/S), car l'échange de threads actifs sur un CPU entraîne un faible coût.