CPU Drosselung in C ++

stimmen
39

Ich habe mich nur gefragt , ob es eine elegante Art und Weise ist die maximale CPU - Last für einen bestimmten Thread tun intensive Berechnungen einzustellen.

Im Moment habe ich die meiste Zeit in Schleife im Thread befindet (es tut nur Kompression) und verwenden GetTickCount()und Sleep()mit fest codierten Werte. Es stellt sicher , dass die Schleife für einen bestimmten Zeitraum fortsetzt und als Schlafplätze für eine gewisse minimale Zeit. Es ist mehr oder weniger macht den Job also gewährleistet , dass der Faden nicht mehr als 50% des CPU.
Allerdings Verhalten ist abhängig von der Anzahl der CPU - Kerne (großen Nachteil) und einfach hässlich (kleiner Nachteil :)).
Irgendwelche Ideen?

Veröffentlicht am 05/08/2008 um 08:11
quelle vom benutzer
In anderen Sprachen...                            


5 antworten

stimmen
17

Ich bin nicht von jedem API bewusst zu tun, um die Scheduler-OS zu tun bekommen, was Sie wollen (auch wenn der Thread im Leerlauf-Priorität ist, wenn es keine höhere Priorität bereit Threads sind, laufen bei Ihnen). Aber ich denke, Sie haben eine ziemlich elegante Drosselfunktion improvisieren kann auf das, was Sie bereits tun. Im Wesentlichen (ich habe keine Windows Dev-Maschine praktisch):

Wählen Sie eine Standardzeit wird der Faden bei jeder Iteration schlafen. Dann wird auf jeder Iteration (oder auf jeder n-ten Iteration, so dass die Drosselfunktion selbst keine signifikante CPU-Last werden),

  1. Berechnen Sie die Menge der CPU - Zeit Thread seit dem letzten Mal verwendet , um Ihre Drosselfunktion aufgerufen wurde (ich werde diese DCPU nennen). Sie können die Verwendung GetThreadTimes () API , um die Menge an Zeit , um Ihren Thread Ausführung wurde zu bekommen.
  2. Berechnen Sie die Menge an Echtzeit verstrichen ist, seit das letzte Mal Ihre Drosselfunktion aufgerufen wurde (ich werde diese dclock nennen).
  3. DCPU / dclock ist die prozentuale CPU-Auslastung (eine CPU). Wenn sie höher als Sie wollen, erhöhen Sie Ihre Schlafzeit, wenn niedriger, die Ruhezeit verringern.
  4. Haben Sie Ihren Faden Schlaf für die berechnete Zeit.

Je nachdem , wie Watchdog - CPU - Auslastung berechnet, können Sie verwenden GetProcessAffinityMask () , um herauszufinden , wie viele CPUs das System hat. DCPU / (dclock * CPUs) ist der Prozentsatz der gesamten CPU - Zeit zur Verfügung.

Sie werden noch einige magischen Zahlen für die erste Ruhezeit und die Aufwärts- / Abwärts Menge holen müssen, aber ich denke, diesen Algorithmus bei ziemlich nahe einen Thread zu halten läuft auf ein bestimmtes Prozent der CPU abgestimmt werden kann.

Beantwortet am 06/09/2008 um 00:33
quelle vom benutzer

stimmen
4

Unter Linux können Sie die Priorität eines Threads mit schönen ändern ().

Beantwortet am 05/08/2008 um 09:03
quelle vom benutzer

stimmen
2

Das Problem ist, es ist nicht normal zu wollen, um die CPU im Leerlauf zu verlassen, während Sie Arbeit zu tun. Normalerweise stellen Sie eine Hintergrundaufgabe Priorität IDLE, und lassen Sie das Betriebssystem umgehen alle CPU-Zeit der Planung, die nicht durch interaktive Aufgaben verwendet wird.

Es mir klingen wie das Problem der Watchdog-Prozess.

Wenn Ihre Hintergrundaufgabe CPU-bound dann wollen Sie es für seine Aufgabe, alle die ungenutzte CPU-Zeit in Anspruch nehmen.

Vielleicht sollte man sich das Watchdog-Programm bei Fixierung?

Beantwortet am 06/09/2008 um 10:01
quelle vom benutzer

stimmen
2

Ich kann mich keine Cross-Plattform Art und Weise von dem, was Sie wollen (oder jeden garantierten Weg Punkt), aber wie Sie GetTickCount verwenden vielleicht sind Sie nicht daran interessiert, Cross-Plattform :)

Ich würde die Interprozesskommunikation verwenden und die intensiven Prozesse schön Ebene zu bekommen, was Sie benötigen, aber ich bin mir nicht sicher, dass für Ihre Situation geeignet ist.

EDIT: Ich stimme mit Bernard , weshalb ich eher ein Prozess als ein Thread denken könnte besser geeignet sein , aber es könnte nicht Ihre Zwecke anpassen.

Beantwortet am 05/08/2008 um 08:23
quelle vom benutzer

stimmen
0

Sie können in der Lage sein, die Priorität eines Threads zu ändern, aber die maximale Ausnutzung würde entweder zu ändern Polling erfordern und Hacks zu begrenzen, wie viele Dinge auftreten, oder unter Verwendung von OS-Tool, die die maximale Auslastung eines Prozesses einstellen. Aber ich sehe keinen Umstand, wo Sie wollen würden, dies zu tun.

Beantwortet am 03/01/2018 um 18:06
quelle vom benutzer

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