Answer-ID
  • Întrebări
  • Tag-uri
  • Categorii
Notificări
Recompense
Înregistrare
După înregistrare, veți primi notificări despre răspunsurile și comentariile la întrebările DVS.
Logare
Dacă aveţi deja un cont, autentificaţi-vă pentru a verifica notificările noi.
Aici vor fi recompensele pentru întrebările, răspunsurile și comentariile adăugate sau modificate.
Mai mult
Sursă
Editează
Piotr Tyburski
Piotr Tyburski

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?

43 2008-08-05T07:11:08+00:00 5
Programare
c++
performance
cpu
throttling
Comentarii la întrebare (0)
sparkes
1 ianuarie 1970 в 3:00
1970-01-01T03:00:00+00:00
Mai mult
Sursă
Editează
#1986

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
0
Comentarii (0)
Mark Harrison
1 ianuarie 1970 в 3:00
1970-01-01T03:00:00+00:00
Mai mult
Sursă
Editează
#2006

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

0
0
Comentarii (0)
Matthew Xavier
1 ianuarie 1970 в 3:00
1970-01-01T03:00:00+00:00
Mai mult
Sursă
Editează
#47086

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
0
Comentarii (0)
Douglas Leeder
1 ianuarie 1970 в 3:00
1970-01-01T03:00:00+00:00
Mai mult
Sursă
Editează
#47345

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
0
Comentarii (0)
Aashish Bharadwaj
1 ianuarie 1970 в 3:00
1970-01-01T03:00:00+00:00
Mai mult
Sursă
Editează
#48082839

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
0
Comentarii (0)
Adăugati o întrebare
Categorii
Toate
Tehnologii
Cultură
Viață / Artă
Stiință
Profesii
Afaceri
ID
KO
RU
© Answer-ID 2021
Sursă
https://stackoverflow.com
în cadrul licenței cc by-sa 3.0 cu atribuire