2011-03-29 3 views
1

J'ai 1500 threads .. Je veux qu'ils fonctionnent sur 12 processeurs ... Pour ce faire, j'appelle SetThreadAffinityMask(GetCurrentThread(),1<<(threadnum%numprocessors)); où numprocessors = 12. Est-ce que c'est l'utilisation correcte du masque? Il doit être évolutif, c'est-à-dire si je veux qu'il fonctionne avec seulement 11 processeurs, puis SetThreadAffinityMask(GetCurrentThread(),1<<(threadnum%numprocessors)); où numprocessors = 11.SethreadAffinityMask() Utilisation correcte?

Répondre

2

Syntaxiquement SetThreadAffinityMask (GetCurrentThread(), 1 < < (GetThreadId()% numprocessors)) il est correct, mais ce n'est pas une bonne idée d'utiliser l'affinité juste parce que vous avez beaucoup de fils et processeurs. il peut interférer avec le planificateur et dégrader les performances. Vous pouvez l'utiliser pour certains threads afin de minimiser les échecs de cache. Une absence de cache se produit lorsqu'un thread est déplacé d'un processeur à un autre.

5

c'est correct. Mais pour des raisons de performance et d'efficacité, je vous suggère de changer votre modèle de thread de manière à ce que le nombre de threads soit égal au nombre de core d'exécution du CPU, alors ces threads fonctionnent sur vos 1500 tâches/work items distribués par votre "Gestionnaire des tâches".

si vous ne voulez pas créer votre propre « gestionnaire de tâches », vous pouvez utiliser des fenêtres ThreadPool API, que vous assignez une tâche à un « pool de threads » géré par O/S