Aceleración de CPU en C++


Me preguntaba si hay una forma elegante de establecer la carga máxima de CPU para un hilo en particular haciendo cálculos intensivos.

Ahora mismo he localizado el bucle que consume más tiempo en el subproceso (solo hace compresión) y uso GetTickCount() y Sleep() con valores codificados. Se asegura de que el bucle continúa durante un cierto período de tiempo y que duerme durante un cierto tiempo mínimo. Más o menos hace el trabajo, es decir, garantiza que el subproceso 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 (menor desventaja :)).
¿Alguna idea?

Author: Mark Harrison, 2008-08-05

5 answers

No tengo conocimiento de ninguna API para hacer que el programador del sistema operativo haga lo que quieras (incluso si tu subproceso es idle-priority, si no hay subprocesos listos de mayor prioridad, el tuyo se ejecutará). Sin embargo, creo que puedes improvisar una función de estrangulamiento bastante elegante basada en lo que ya estás haciendo. Esencialmente (no tengo una máquina de desarrollo de Windows a mano):

Elija una cantidad de tiempo predeterminada en la que el subproceso dormirá cada iteración. Entonces, en cada iteración (o en cada enésima iteración, de modo que el la función de aceleración no se convierte en una carga significativa de la CPU),

  1. Calcule la cantidad de tiempo de CPU que usó su subproceso desde la última vez que se llamó a su función de limitación (llamaré a esta dCPU). Puedes usar la API GetThreadTimes () para obtener la cantidad de tiempo que tu subproceso ha estado ejecutando.
  2. Calcule la cantidad de tiempo real transcurrido desde la última vez que se llamó a su función de limitación (llamaré a este dClock).
  3. dCPU / dClock es el porcentaje de uso de CPU (de una CPU). Si es más alto de lo que desea, aumente su tiempo de sueño, si es más bajo, disminuya el tiempo de sueño.
  4. Ten tu hilo en reposo durante el tiempo calculado.

Dependiendo de cómo su perro guardián calcula el uso de la CPU, es posible que desee usar GetProcessAffinityMask() para averiguar cuántas CPU tiene el sistema. dCPU / (CPU dClock*) es el porcentaje del tiempo total de CPU disponible.

Todavía tendrá que elegir algunos números mágicos para el tiempo de sueño inicial y el cantidad de incremento / decremento, pero creo que este algoritmo podría ajustarse para mantener un subproceso funcionando bastante cerca de un porcentaje determinado de CPU.

 17
Author: Matthew Xavier,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-09-05 23:33:42

En linux, puedes cambiar la prioridad de programación de un hilo con nice().

 4
Author: Mark Harrison,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-08-05 08:03:01

No puedo pensar en ninguna forma multiplataforma de lo que quieres (o cualquier forma garantizada punto y final), pero como está utilizando GetTickCount, tal vez no esté interesado en la multiplataforma:)

Usaría comunicaciones interproceso y establecería los 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 que es por lo que creo que un proceso en lugar de un hilo podría ser más apropiado, pero simplemente podría no se adapta a tus propósitos.

 2
Author: sparkes,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-23 12:17:58

El problema es que no es normal querer dejar la CPU inactiva mientras tienes trabajo que hacer. Normalmente, se establece una tarea en segundo plano como prioridad de INACTIVIDAD y se deja que el sistema operativo gestione la programación de todo el tiempo de CPU que no utilizan las tareas interactivas.

Me parece que el problema es el proceso de vigilancia.

Si su tarea en segundo plano está vinculada a la CPU, entonces desea que tome todo el tiempo de CPU no utilizado para su tarea.

Tal vez usted debe mirar en la fijación del programa de vigilancia?

 2
Author: Douglas Leeder,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-09-06 09:01:41

Es posible que pueda cambiar la prioridad de un subproceso, pero cambiar la utilización máxima requeriría sondeo y hacks para limitar cuántas cosas están ocurriendo, o usar herramientas del sistema operativo que puedan establecer la utilización máxima de un proceso. Sin embargo, no veo ninguna circunstancia en la que quieras hacer esto.

 0
Author: Aashish Bharadwaj,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-01-03 18:06:47