performance - Limitation du processeur en C ++

Translate

Je me demandais simplement s'il existe un moyen élégant de définir la charge maximale du processeur pour un thread particulier effectuant des calculs intensifs.

Pour le moment, j'ai localisé la boucle la plus longue dans le thread (elle ne fait que la compression) et j'utiliseGetTickCount()etSleep()avec des valeurs codées en dur. Il s'assure que la boucle continue pendant une certaine période de temps et qu'elle dort pendant un certain temps minimal. Il fait plus ou moins le travail, c'est-à-dire garantit que le thread n'utilisera pas plus de 50% du processeur.
Cependant, le comportement dépend du nombre de cœurs de CPU (inconvénient énorme) et tout simplement laid (inconvénient plus petit :)).
Des idées?

This question and all comments follow the "Attribution Required."

Toutes les réponses

Translate

Je ne connais aucune API pour faire en sorte que le planificateur du système d'exploitation fasse ce que vous voulez (même si votre thread est à priorité inactive, s'il n'y a pas de threads prêts de priorité plus élevée, le vôtre fonctionnera). Cependant, je pense que vous pouvez improviser une fonction d'étranglement assez élégante basée sur ce que vous faites déjà. Essentiellement (je n'ai pas de machine de développement Windows à portée de main):

Choisissez une durée par défaut pendant laquelle le thread dormira à chaque itération. Ensuite, à chaque itération (ou à chaque nième itération, de sorte que la fonction de limitation ne devienne pas elle-même une charge CPU significative),

  1. Calculez la quantité de temps CPU que votre thread a utilisée depuis le dernier appel de votre fonction de limitation (j'appellerai ce dCPU). Vous pouvez utiliser leGetThreadTimes ()API pour obtenir la durée d'exécution de votre thread.
  2. Calculez la quantité de temps réel écoulé depuis le dernier appel de votre fonction de limitation (j'appellerai cette dClock).
  3. dCPU / dClock est le pourcentage d'utilisation du processeur (d'un processeur). S'il est plus élevé que vous le souhaitez, augmentez votre temps de sommeil, s'il est inférieur, diminuez le temps de sommeil.
  4. Faites dormir votre thread pendant le temps calculé.

En fonction de la façon dont votre chien de garde calcule l'utilisation du processeur, vous pouvez utiliserGetProcessAffinityMask ()pour connaître le nombre de processeurs du système. dCPU / (dClock * CPUs) est le pourcentage du temps CPU total disponible.

Vous devrez toujours choisir des nombres magiques pour le temps de sommeil initial et la quantité d'incrémentation / décrémentation, mais je pense que cet algorithme pourrait être réglé pour maintenir un thread en cours d'exécution assez proche d'un pourcentage déterminé de CPU.

La source
Translate

Sous Linux, vous pouvez changer la priorité de planification d'un thread avec nice ().

La source
Translate

Je ne peux penser à aucun moyen multiplateforme de ce que vous voulez (ou à un point garanti), mais comme vous utilisez GetTickCount, peut-être que vous n'êtes pas intéressé par la multiplateforme :)

J'utiliserais des communications interprocessus et définirais les processus intensifs de bons 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 avecBernardc'est pourquoi je pense qu'un processus plutôt qu'un fil pourrait être plus approprié, mais il pourrait ne pas convenir à vos objectifs.

La source
Translate

Le problème est qu'il n'est pas normal de vouloir laisser le processeur inactif pendant que vous avez du travail à faire. Normalement, vous définissez une tâche d'arrière-plan sur la priorité IDLE et laissez le système d'exploitation gérer la planification de tout le temps processeur qui n'est pas utilisé par les tâches interactives.

Il me semble que le problème est le processus de surveillance.

Si votre tâche d'arrière-plan est liée au processeur, vous souhaitez qu'elle prenne tout le temps processeur inutilisé pour sa tâche.

Peut-être devriez-vous envisager de réparer le programme de surveillance?

La source
Translate

Vous pourrez peut-être modifier la priorité d'un thread, mais la modification de l'utilisation maximale nécessiterait soit des interrogations et des hacks pour limiter le nombre de choses qui se produisent, soit l'utilisation d'outils du système d'exploitation qui peuvent définir l'utilisation maximale d'un processus. Cependant, je ne vois aucune circonstance où vous voudriez faire cela.

La source