Question

Je me demandais juste si il est une manière élégante de mettre le maximum de charge du PROCESSEUR pour un thread particulier faire de calcul intensif.

Droit maintenant, j'ai situé le plus de temps de la boucle dans le fil (il n'compression) et de l'utilisation GetTickCount() et Sleep() avec des valeurs codées en dur.Il permet de s'assurer que la boucle continue pendant une certaine période de temps et que dort pendant un certain temps.Il est plus ou moins fait le travail, c'est à diregarantit que le thread ne pas utiliser plus de 50% de CPU.
Cependant, le comportement dépend du nombre de cœurs du PROCESSEUR (énorme désavantage) et tout simplement laid (petit inconvénient :)).
Des idées?

Était-ce utile?

La solution

Je ne suis pas au courant de toute l'API de l'OS planificateur de faire ce que vous voulez (même si votre fil est en veille priorité, si il n'y a pas de priorité plus élevée prêt fils, la vôtre s'exécuter).Cependant, je pense que vous pouvez improviser un assez élégant de limitation de la fonction basée sur ce que vous faites déjà.Essentiellement (je n'ai pas de Windows dev machine à portée de main):

Choisissez un montant par défaut de temps le fil de sommeil chaque itération.Ensuite, à chaque itération (ou sur chaque nième itération, telles que la limitation de la fonction ne pas devenir lui-même une importante charge CPU),

  1. Calculer la quantité de temps CPU de votre fil utilisé depuis la dernière fois que votre limitation de la fonction a été appelée (je vais l'appeler ce dCPU).Vous pouvez utiliser l' GetThreadTimes() API pour obtenir la quantité de temps que votre fil est en cours d'exécution.
  2. Calculer la quantité de temps écoulé depuis la dernière fois que votre limitation de la fonction a été appelée (je vais l'appeler ce dClock).
  3. dCPU / dClock est le pourcentage d'utilisation du PROCESSEUR (d'un PROCESSEUR).Si il est supérieur à ce que vous souhaitez, augmenter votre temps de sommeil, si elle est inférieure, de la diminution du temps de sommeil.
  4. Votre fil de sommeil pour le calcul des temps.

Selon la façon dont votre chien de garde calcule utilisation de l'UC, vous pouvez utiliser GetProcessAffinityMask() pour trouver le nombre de Processeurs du système.dCPU / (dClock * Cpu) est le pourcentage du total des temps CPU disponible.

Vous aurez tout de même à en prendre quelques-unes des numéros de magie pour les premiers temps de sommeil et l'incrémenter/décrémenter la quantité, mais je pense que cet algorithme pourrait être à l'écoute de garder un fil conducteur assez près à un pour cent de la CPU.

Autres conseils

Sur linux, vous pouvez modifier la priorité d'ordonnancement d'un thread à nice().

Je ne peux pas penser à une croix-plate-forme de façon à ce que vous voulez (ou tout moyen de garantie arrêt complet), mais que vous utilisez GetTickCount peut-être vous ne sont pas intéressés par la croix-plate-forme :)

J'aimerais utiliser les communications interprocessus et définir les procédés à forte intensité de nice niveaux pour obtenir ce que vous désirez, mais je ne suis pas sûr que c'est approprié pour votre situation.

EDIT:Je suis d'accord avec Bernard c'est pourquoi je pense qu'un processus plutôt qu'un thread peut être plus approprié, mais il peut ne pas convenir à vos besoins.

Le problème est qu'il n'est pas normal de vouloir sortir de l'inactivité du PROCESSEUR alors que vous avez du travail à faire.Normalement, vous définissez une tâche d'arrière-plan à la priorité d'INACTIVITÉ, et de laisser le handle de la planification tout le temps PROCESSEUR n'est pas utilisé par les tâches interactives.

Il me paraît que le problème est le processus de surveillance.

Si votre tâche en arrière-plan est lié au PROCESSEUR, alors vous voulez qu'il prenne tous le solde non utilisé de temps PROCESSEUR pour sa tâche.

Peut-être que vous devriez regarder lors de la fixation de l'organe de surveillance du programme?

Vous pouvez être en mesure de modifier la priorité d'un thread, mais en changeant le maximum de l'utilisation se soit besoin d'interrogation et hacks pour limiter la façon dont beaucoup de choses sont en cours, ou à l'aide d'OS outils qui peut mettre au maximum l'utilisation d'un processus.Cependant, je ne vois pas en toute circonstance où vous voulez le faire.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top