CPU throttling in C ++

stemmen
39

Ik vroeg me af of er een elegante manier om de maximale processorbelasting ingesteld voor een bepaalde thread doet intensieve berekeningen.

Ik heb nu op de meest tijdrovende lus in de draad (doet alleen compressie) en gebruik GetTickCount()en Sleep()met hardcoded waarden. Het zorgt ervoor dat de lus blijft voor een bepaalde periode van tijd en dan slaapt gedurende een bepaalde minimale tijd. Het min of meer doet het werk dat wil zeggen garandeert dat de draad niet zult gebruiken meer dan 50% van de CPU.
Maar gedrag is afhankelijk van het aantal CPU cores (groot nadeel) en gewoon lelijk (kleinere nadeel :)).
Iemand een idee?

De vraag is gesteld op 05/08/2008 om 08:11
bron van user
In andere talen...                            


5 antwoorden

stemmen
2

Ik kan niet denken aan een cross-platform manier van wat je wilt (of een gegarandeerde manier punt), maar als u gebruik maakt van GetTickCount misschien bent u niet geïnteresseerd in cross-platform :)

Ik zou interprocescommunicatie communicatie te gebruiken en stel de intensieve processen leuke levels om te krijgen wat je nodig hebt, maar ik weet niet zeker of die geschikt is voor uw situatie.

EDIT: Ik ga akkoord met Bernard dat is waarom ik denk dat een proces in plaats van een thread zou beter zijn, maar het kan gewoon niet uw doeleinden aan te passen.

antwoordde op 05/08/2008 om 08:23
bron van user

stemmen
4

Op Linux, kunt u de planning prioriteit van een thread met mooie veranderen ().

antwoordde op 05/08/2008 om 09:03
bron van user

stemmen
17

Ik ben niet bewust van enige API te doen krijgen scheduler het OS om te doen wat je wilt (zelfs als uw draad inactief is prioriteit, als er geen hogere prioriteit gereed threads, zal de jouwe te voeren). Maar ik denk dat je kunt een vrij elegante throttling functie op basis van wat je al doet improviseren. In wezen (ik heb geen Windows-dev machine handig):

Kies een standaardhoeveelheid tijd de draad elke iteratie slaapt. Dan, op elke iteratie (of op elke n-de iteratie, zodat de smorende functie zelf niet tot een significant CPU-belasting),

  1. Bereken de hoeveelheid CPU-tijd uw draad gebruikt sinds de laatste keer dat je smoren functie is aangeroepen (Ik zal dit DCPU noemen). U kunt het gebruiken GetThreadTimes () API om de hoeveelheid tijd die uw draad is het uitvoeren van te krijgen.
  2. Bereken het bedrag van de reële tijd die verstreken is sinds de laatste keer dat je smoren functie is aangeroepen (Ik zal dit dClock noemen).
  3. DCPU / dClock het percentage processorgebruik (één CPU). Als deze hoger is dan je wilt, het verhogen van uw slaap tijd, indien lager, verminderen de slaaptijd.
  4. Laat je thread slaap voor de berekende tijd.

Afhankelijk van hoe uw waakhond berekent CPU-gebruik, zou u wilt gebruiken GetProcessAffinityMask () om uit te vinden hoeveel CPU het systeem. DCPU / (dClock * CPU's) is het percentage van de totale CPU-tijd beschikbaar.

Je moet nog wel een aantal magische getallen te halen voor de eerste slaaptijd en de increment / verlagen bedrag, maar ik denk dat dit algoritme kan worden afgestemd op een rode draad in vrij dicht bij een bepaald percentage van de CPU te houden.

antwoordde op 06/09/2008 om 00:33
bron van user

stemmen
2

Het probleem is dat het niet normaal te willen naar de CPU inactief te laten terwijl je werk te doen. Normaal gesproken heb je een achtergrond taak ingesteld op prioriteit IDLE, en laat het OS te behandelen plannen het allemaal de CPU-tijd die niet wordt gebruikt door interactieve taken.

Het klinkt voor mij als het probleem is de waakhond proces.

Als je achtergrond taak-CPU gebonden, dan moet je het aan al de ongebruikte CPU-tijd te nemen voor zijn taak.

Misschien moet je kijken naar de vaststelling van de watchdog-programma?

antwoordde op 06/09/2008 om 10:01
bron van user

stemmen
0

U kunt in staat zijn om de prioriteit van een thread te veranderen, maar het veranderen van de maximale benutting ofwel zou vereisen polling en hacks te beperken hoeveel dingen plaatsvinden, of met behulp van OS tools die de maximale benutting van een proces kunt instellen. Echter, ik heb geen enkele omstandigheid waar je zou willen om dit te doen zien.

antwoordde op 03/01/2018 om 18:06
bron van user

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