Regulación de CPU en C++
performance throttle (4)
En Linux, puede cambiar la prioridad de programación de un hilo con nice ().
Me preguntaba si existe una forma elegante de establecer la carga máxima de la CPU para un hilo en particular haciendo cálculos intensivos.
En este momento he localizado el ciclo que más tiempo consume en el hilo (solo hace compresión) y uso GetTickCount()
y Sleep()
con valores codificados. Se asegura de que el ciclo continúe durante un cierto período de tiempo y que duerma durante un tiempo mínimo. Más o menos hace el trabajo, es decir, garantiza que el hilo no utilizará más del 50% de la CPU.
Sin embargo, el comportamiento depende del número de núcleos de CPU (gran desventaja) y simplemente feo (desventaja más pequeña :)).
¿Algunas ideas?
No conozco ninguna API que haga que el programador del sistema operativo haga lo que usted desea (incluso si su subproceso tiene prioridad de inactividad, si no hay subprocesos de prioridad más alta, el suyo se ejecutará). Sin embargo, creo que puedes improvisar una función de aceleración bastante elegante en función de lo que ya estás haciendo. Esencialmente (no tengo una máquina de desarrollo de Windows a mano):
Elija una cantidad predeterminada de tiempo que el hilo dormirá en cada iteración. Luego, en cada iteración (o en cada enésima iteración, de modo que la función de aceleración no se convierta en una carga de CPU significativa),
- Calcule la cantidad de tiempo de CPU que utilizó su hilo desde la última vez que llamó a su función de aceleración (llamaré a esta dCPU). Puede usar la API GetThreadTimes () para obtener la cantidad de tiempo que su subproceso se ha estado ejecutando.
- Calcule la cantidad de tiempo real transcurrido desde la última vez que se llamó a su función de aceleración (voy a llamar a este dClock).
- dCPU / dClock es el porcentaje de uso de la CPU (de una CPU). Si es más alto de lo que desea, aumente el tiempo de sueño, si es menor, disminuya el tiempo de sueño.
- Haga que su hilo duerma durante el tiempo calculado.
Dependiendo de cómo su perro guardián calcule el uso de la CPU, es posible que desee utilizar GetProcessAffinityMask () para averiguar cuántas CPU tiene el sistema. dCPU / (dClock * CPUs) es el porcentaje del tiempo total de CPU disponible.
Todavía tendrá que elegir algunos números mágicos para el tiempo de inactividad inicial y la cantidad de incremento / decremento, pero creo que este algoritmo podría ajustarse para mantener un subproceso que se ejecute bastante cerca de un determinado porcentaje de CPU.
El problema es que no es normal querer dejar la CPU inactiva mientras tiene trabajo por hacer. Normalmente establece una tarea en segundo plano a la prioridad IDLE, y deja que el SO maneje la programación de todo el tiempo de CPU que las tareas interactivas no utilizan.
Me parece que el problema es el proceso de vigilancia.
Si su tarea de fondo está unida a la CPU, entonces quiere que tome todo el tiempo de CPU no utilizado para su tarea.
¿Tal vez deberías buscar arreglar el programa de vigilancia?
No puedo pensar en ninguna forma de plataforma cruzada de lo que desea (o en una forma totalmente garantizada punto), pero como está utilizando GetTickCount quizás no esté interesado en la plataforma cruzada :)
Utilizaría las comunicaciones entre procesos y establecería niveles de procesos intensivos para obtener lo que necesita, pero no estoy seguro de que sea apropiado para su situación.
EDITAR: Estoy de acuerdo con Bernard, por lo que creo que un proceso en lugar de un hilo podría ser más apropiado, pero podría no ser adecuado para sus propósitos.