Vă mulțumim pentru susținere

Procesorul CPU în C ++

I was just wondering if there is an elegant way to set the maximum CPU load for a particular thread doing intensive calculations.

Right now I have located the most time consuming loop in the thread (it does only compression) and use GetTickCount() and Sleep() with hardcoded values. It makes sure that the loop continues for a certain period of time and than sleeps for a certain minimal time. It more or less does the job i.e. guarantees that the thread will not use more than 50% of CPU.
However behavior is dependent on the number of CPU cores (huge disadvantage) and simply ugly (smaller disadvantage :)).
Any ideas?

0
adăugat editat
Ce comportament vizibil doriți să atingeți? Asta este, ce vrea acest supraveghetor din firele tale? Ar trebui să nu utilizeze mai mult decât, să zicem, 80% din CPU? Se poate seta prioritatea bazei de proces pentru a opri, eventual, calmarea WD în jos?
adăugat autor wordmonger

5 răspunsuri

Pe linux, puteți schimba prioritatea de programare a unui fir cu nice ().

0
adăugat
Alte platforme au caracteristici similare, a se vedea și: stackoverflow.com/questions/18884510/… Cred că aceasta poate fi o soluție frumoasă a problemei, deși cu semantică diferită - adică nu există o garanție de 50% a consumului CPU
adăugat autor milianw

Nu pot sa ma gandesc la nici o modalitate de cross-platforma a ceea ce vrei (sau orice modalitate garantata de oprire completa), dar pe masura ce folosesti GetTickCount, poate nu esti interesat de cross platform :)

Aș folosi comunicații interprocese și stabilește nivelurile proceselor intense pentru a obține ceea ce ai nevoie, dar nu sunt sigur că este potrivit pentru situația ta.

EDITAȚI | ×: Sunt de acord cu Bernard și de aceea cred că un proces, mai degrabă decât un fir, ar putea fi mai potrivit, dar poate că nu este potrivit scopurile voastre.

0
adăugat

Problema este că nu este normal să doriți să lăsați CPU-ul inactiv în timp ce aveți de lucru. În mod normal, ați setat o sarcină de fundal la prioritatea IDLE și lăsați-o pe sistemul de operare să gestioneze programarea întregului timp CPU care nu este utilizat de sarcini interactive.

Mi se pare ca problema este procesul de supraveghere.

Dacă sarcina dvs. de fundal este legată de CPU, atunci doriți ca aceasta să ia tot timpul neutilizat al procesorului pentru sarcina sa.

Poate ar trebui să te uiți la fixarea programului de supraveghere?

0
adăugat
Este foarte rezonabil să vrei un procesor inactiv. Poate că doriți să faceți unele calcule, dar nu-mi pasă cât de repede se face, atâta timp cât nu se invarta ventilatorul procesorului pe laptop-ul.
adăugat autor Ringding

Nu sunt conștient de niciun API care să facă planificatorul sistemului de operare să facă ceea ce doriți (chiar dacă firul dvs. este prioritar în regim de așteptare, dacă nu există thread-uri cu prioritate mai mare, al tău va fi rulat). Cu toate acestea, cred că puteți improviza o funcție destul de elegantă, pe baza a ceea ce faceți deja. În esență (nu am o mașină Windows dev la îndemână):

Alegeți o sumă prestabilită de timp în care firul va dormi în fiecare iterație. Apoi, la fiecare iterație (sau la fiecare iterație n, astfel încât funcția de reglaj nu devine ea însăși o încărcare semnificativă a procesorului)

  1. Calculați timpul procesorului utilizat de firul dvs. de la ultima dată când ați apelat funcția de reglaj (voi numi acest dCPU). Puteți utiliza API-ul GetThreadTimes () pentru a obține perioada de timp firul a fost executat.
  2. Calculați cantitatea de timp real scurs de la ultima dată când a fost apelată funcția de reglaj (vom numi acest dClock).
  3. dCPU / dClock este procentul utilizării CPU (a unui CPU). Dacă este mai mare decât doriți, măriți timpul de somn, dacă este mai mic, reduceți timpul de somn.
  4. Țineți firul în timpul calculat.

În funcție de modul în care supraveghetorul dvs. utilizează CPU, este posibil să doriți să utilizați GetProcessAffinityMask () pentru a afla câte CPU are sistemul. dCPU / (CPU-uri dClock *) reprezintă procentajul din timpul total al procesorului disponibil.

Veți avea totuși nevoie să alegeți numere magice pentru timpul de somn inițial și suma incrementării / decrementării, dar cred că acest algoritm ar putea fi reglat pentru a menține un fir care rulează aproape la un procent determinat de procesor.

0
adăugat
Dacă scopul dvs. este de a evita risipirea timpului CPU, o euristică mai ieftină este probabil o alegere mai bună. În funcție de câtă problemă este ca firul tău să se sinucidă sub sarcină ridicată de sistem, ai putea doar să controlezi timpul de ceas de perete scurs. Pe x86, acest lucru este foarte ieftin, deoarece funcțiile de timp bazate pe rdtsc nu trebuie nici măcar să intre în modul kernel. Efectuarea mai multor apeluri de sistem chiar și a unor iterații n este mai rău decît a face doar una, cu excepția cazului în care vă permite să creșteți n
adăugat autor Peter Cordes

S-ar putea să schimbați prioritatea unui fir, dar schimbarea utilizării maxime ar necesita fie sondare, fie hack-uri pentru a limita câte lucruri au avut loc sau pentru a folosi instrumentele de sistem care pot stabili utilizarea maximă a unui proces. Cu toate acestea, nu văd nici o circumstanță în care doriți să faceți acest lucru.

0
adăugat