la limitation de la CPU en C ++

voix
39

Je me demandais s'il y a une façon élégante de régler la charge CPU maximum pour un thread particulier à faire des calculs intensifs.

En ce moment je trouve le plus de temps en boucle dans le fil consommation (il ne fait que la compression) et utiliser GetTickCount()et Sleep()avec des valeurs codées en dur. Il veille à ce que la boucle se poursuit pendant une certaine période de temps et de sommeils pour un certain minimum de temps. Plus ou moins fait le travail garantit -à- dire que le fil ne sera pas utiliser plus de 50% du CPU.
Cependant le comportement dépend du nombre de cœurs de processeur (désavantage énorme) et tout simplement laid (plus petit inconvénient :)).
Des idées?

Créé 05/08/2008 à 08:11
source utilisateur
Dans d'autres langues...                            


5 réponses

voix
17

Je ne suis pas au courant d'aucune API pour faire obtenir le scheduler de système d'exploitation pour faire ce que vous voulez (même si votre fil est priorité au ralenti, s'il n'y a pas des fils prêts plus prioritaires, le vôtre sera exécuté). Cependant, je pense que vous pouvez improviser une fonction assez élégante d'étranglement en fonction de ce que vous faites déjà. Essentiellement (je n'ai pas une machine de dev de Windows à portée de main):

Choisissez un montant par défaut de temps le fil dormira chaque itération. Ensuite, à chaque itération (ou à chaque itération nième, de telle sorte que la fonction d'étranglement ne devienne pas en soi une charge CPU importante),

  1. Calculer la quantité de temps CPU votre fil utilisé depuis la dernière fois que votre fonction a été appelée étranglement (je vais appeler cette DCPU). Vous pouvez utiliser les GetThreadTimes () API pour obtenir la quantité de temps votre fil est en cours d' exécution.
  2. Calculer la quantité de temps réel écoulé depuis la dernière fois que votre fonction a été appelée étranglement (je vais appeler cette dclock).
  3. DCPU / dclock est l'utilisation du processeur pour cent (sur une CPU). S'il est plus élevé que vous voulez, augmenter votre temps de sommeil, si elle est inférieure, diminuer le temps de sommeil.
  4. Demandez à votre sommeil de fil pour le temps calculé.

Selon la façon dont votre chien de garde calcule l' utilisation du processeur, vous pouvez utiliser GetProcessAffinityMask () pour savoir le nombre de processeurs du système a. DCPU / (dclock * UC) est le pourcentage du temps CPU total disponible.

Vous devrez toujours choisir des numéros magiques pour le temps de sommeil initial et le montant incrément / décrément, mais je pense que cet algorithme pourrait être accordé pour garder un fil conducteur à assez près d'un pour cent déterminé de CPU.

Créé 06/09/2008 à 00:33
source utilisateur

voix
4

Sur linux, vous pouvez modifier la priorité d'ordonnancement d'un thread avec une belle ().

Créé 05/08/2008 à 09:03
source utilisateur

voix
2

Le problème est qu'il est pas normal de vouloir quitter le ralenti CPU alors que vous avez du travail à faire. Normalement, vous définissez une tâche d'arrière-plan IDLE priorité, et que le système d'exploitation gérer la planification tout le temps CPU qui ne sont pas utilisées par des tâches interactives.

Il sonne pour moi comme le problème est le processus de surveillance.

Si votre tâche de fond est alors lié au processeur que vous voulez prendre tout le temps CPU utilisé pour sa tâche.

Peut-être vous devriez regarder fixer le programme de surveillance?

Créé 06/09/2008 à 10:01
source utilisateur

voix
2

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

J'utilise la communication interprocess et définir les processus intensifs de beaux niveaux pour obtenir ce dont vous avez besoin mais je ne suis pas sûr que ce soit approprié à votre situation.

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

Créé 05/08/2008 à 08:23
source utilisateur

voix
0

Vous pourrez peut-être changer la priorité d'un fil, mais en changeant le scrutin et hacks une utilisation maximale serait soit besoin de limiter le nombre de choses se produisent, ou l'utilisation d'outils OS qui peuvent définir l'utilisation maximale d'un processus. Cependant, je ne vois aucune circonstance où vous voulez faire.

Créé 03/01/2018 à 18:06
source utilisateur

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more