2014-04-30 2 views
0

J'ai un code multithread que je veux exécuter sur les 4 cœurs de mon processeur. C'est à dire. Je crée quatre threads, et je veux que chacun d'eux tourne sur un noyau séparé.Empêcher Windows de modifier l'affinité de processus

Ce qui se passe, c'est qu'il commence à fonctionner sur quatre cœurs, mais de temps en temps passerait à seulement trois cœurs. Les seules choses qui fonctionnent sont le système d'exploitation et mon exe. C'est un peu décevant, car il diminue la performance d'un quart, ce qui est assez important pour moi.

L'affinité de processus que je vois dans le Gestionnaire des tâches permet au processus d'utiliser n'importe quel cœur. J'ai essayé de restreindre les affinités de fil, mais cela n'a pas aidé. J'ai également essayé d'augmenter la priorité du processus, mais cela n'a pas aidé le cas non plus. Donc, la question est, y a-t-il un moyen de forcer Windows à continuer à fonctionner sur les quatre c? Urs? Si ce n'est pas possible, puis-je réduire la fréquence de ces interruptions? Merci!

Répondre

0

Si cela est Windows, essayez SetThreadAffinityMask():

http://msdn.microsoft.com/en-us/library/windows/desktop/ms686247(v=vs.85).aspx

Je suppose que si vous ne définissez un seul bit, puis qui force le thread à exécuter uniquement sur le processeur sélectionné (noyau) .

autres processus/fonctions de fil:

http://msdn.microsoft.com/en-us/library/windows/desktop/ms684847(v=vs.85).aspx

J'utilise un programme vidéo de fenêtres, et il est en mesure de garder tous les coeurs à proximité max lors du rendu vidéo.

+0

Merci pour votre réponse. Cependant, comme je l'ai dit, j'ai essayé de restreindre les affinités de fil, et cela n'a pas fonctionné. Je pense que c'est l'affinité du processus qui change, les affinités de fil respectent toujours l'affinité du processus. –

+0

Est-ce Windows et avez-vous utilisé SetThreadAffinityMask() (vous avez besoin d'un appel de chaque thread) ou avez-vous essayé de le faire avec le gestionnaire de tâches? J'ai utilisé ce programme vidéo Windows plusieurs fois, et je ne l'ai jamais vu ne pas utiliser tous les cœurs lors du rendu, donc il est possible d'empêcher les threads de changer de cœurs. – rcgldr

+0

Oui, c'est Windows et j'ai utilisé SetThreadAffinityMask() et je l'ai appelé une fois pour chacun des threads. –

1

Ce n'est pas un problème d'affinité à moins que je ne me trompe beaucoup. Certes, le système ne restreindra pas votre processus à l'affinité avec un ensemble spécifique de threads. Un autre programme du système devrait le faire, si tel est le cas. Cependant, il est beaucoup plus probable que, simplement, il existe un autre thread prêt à fonctionner que le système planifie de manière circulaire. Vous avez quatre threads toujours prêts à fonctionner. S'il y a un autre thread prêt à fonctionner, il aura son tour. Maintenant, il y a 5 threads partageant 4 processeurs. Lorsque l'autre thread est en cours d'exécution, seulement trois d'entre vous sont en mesure de fonctionner.

Si vous voulez être sûr que ces autres threads ne fonctionnent pas, alors vous devez faire une des opérations suivantes:

  1. Arrêtez de courir l'autre programme qui veut utiliser des ressources CPU. Définissez les priorités de threads relatives de sorte que vos threads s'exécutent toujours de préférence à l'autre thread.

Maintenant, parmi ces options, la première doit être préférée. Si vous hiérarchisez vos threads au-dessus des autres, les autres threads ne peuvent pas s'exécuter du tout. Est-ce vraiment ce que vous voulez arriver?

Dans la question, vous indiquez qu'aucun autre processus n'est en cours d'exécution. Si tel est le cas, et que personne ne se mêle de l'affinité du processeur et que seul un sous-ensemble de vos threads s'exécute, alors la seule conclusion est que tous vos threads ne sont pas prêts à fonctionner et ont du travail à faire. Cela peut arriver si, par exemple, vous rejoignez vos discussions à la fin d'une partie du travail, avant de passer à la suivante.Peut-être que la prochaine étape pour vous est de réduire un peu les choses. Utilisez un outil comme Process Explorer pour diagnostiquer quels threads sont en cours d'exécution.

+0

Merci pour votre réponse. Eh bien, j'aurais probablement dû dire clairement que personnellement je ne me soucie pas beaucoup des autres processus - il y a mon processus et certains éléments du système dont j'ai besoin seulement tant que mon processus est nécessaire. De plus, mes threads sont simples pour les boucles, et ils sont toujours "prêts à fonctionner". Un autre problème est qu'ils finissent occasionnellement et je cours un nouveau lot, donc c'est probablement quand un autre processus a lieu. –

+0

S'ils sont toujours prêts à s'exécuter, le planificateur les exécute. Êtes-vous rejoindre vos discussions à tout moment? –

+0

Eh bien, je peux garantir que tous les 4 de mes threads sont exécutés, mais sur 3 cœurs. Oui, comme je l'ai dit, ils finissent occasionnellement leur travail, et je commence une nouvelle série de 4 discussions. C'est très probablement le cas où c'est le point où il est passé à 3 cœurs. Je vais essayer d'augmenter à nouveau les priorités, mais jusqu'à présent cela n'a fait que renforcer la priorité sur les autres cœurs. –

Questions connexes