limitazione della CPU in C ++

voti
39

Mi chiedevo se esiste un modo elegante per impostare il carico massimo CPU per un particolare filo fare calcoli intensivi.

In questo momento ho individuato il più in termini di tempo ciclo nel filo (lo fa solo la compressione) e l'uso GetTickCount()e Sleep()con i valori hardcoded. Si fa in modo che il ciclo continua per un certo periodo di tempo e di posti letto per un certo periodo di tempo minimo. Più o meno fa il lavoro cioè garantisce che il filo non userà più del 50% della CPU.
Tuttavia il comportamento dipende dal numero di core della CPU (enorme svantaggio) e semplicemente brutto (svantaggio minore :)).
Qualche idea?

È pubblicato 05/08/2008 alle 08:11
fonte dall'utente
In altre lingue...                            


5 risposte

voti
17

Io non sono a conoscenza di API per fare ottenere scheduler del sistema operativo per fare quello che vuoi (anche se il filo è inattivo priorità, se non ci sono priorità più alta thread pronti, il vostro sarà gestita). Tuttavia, penso che si può improvvisare un piuttosto elegante funzione di limitazione in base a ciò che si sta già facendo. In sostanza (non ho una macchina dev di Windows a portata di mano):

Scegliere una quantità predefinita di tempo il thread dormire ogni iterazione. Quindi, ad ogni iterazione (o su ogni iterazione ennesimo, tale che la funzione di limitazione stessa non diventa un carico della CPU significativo),

  1. Calcolare la quantità di tempo di CPU tuo thread utilizzato in quanto l'ultima volta che la funzione di limitazione è stata chiamata (che chiamerò questo dCPU). È possibile utilizzare i GetThreadTimes () API per ottenere la quantità di tempo il thread è stato in esecuzione.
  2. Calcolare la quantità di tempo reale trascorso dall'ultima volta che la funzione di limitazione è stata chiamata (che chiamerò questo dClock).
  3. dCPU / dClock è l'utilizzo della CPU per cento (di una CPU). Se è superiore a quello che si desidera, aumentare il tempo di sonno, se inferiore, diminuire il tempo di sonno.
  4. Avere il vostro sonno filo per il tempo calcolato.

A seconda di come il vostro cane da guardia calcola l'utilizzo della CPU, si potrebbe desiderare di utilizzare GetProcessAffinityMask () per scoprire quante CPU il sistema ha. dCPU / (dClock * CPU) è la percentuale del tempo totale di CPU disponibile.

Si dovrà ancora scegliere alcuni numeri magici per il tempo di sonno iniziale e la quantità di incremento / decremento, ma penso che questo algoritmo potrebbe essere sintonizzato per mantenere un filo conduttore al abbastanza vicino a una percentuale determinata di CPU.

Risposto il 06/09/2008 a 00:33
fonte dall'utente

voti
4

Su Linux, è possibile modificare la priorità di pianificazione di un filo con una bella ().

Risposto il 05/08/2008 a 09:03
fonte dall'utente

voti
2

Il problema è che non è normale voler lasciare l'inattività della CPU, mentre si ha del lavoro da fare. Normalmente si imposta un'attività in background a IDLE priorità, e lasciare che il sistema operativo di gestire la pianificazione di tutto il tempo di CPU che non viene utilizzato per le attività interattive.

E 'il suono a me come il problema è il processo cane da guardia.

Se la vostra attività in background è CPU-bound, allora si vuole prendere tutto il tempo CPU inutilizzato per il suo compito.

Forse si dovrebbe guardare fissa il programma di cane da guardia?

Risposto il 06/09/2008 a 10:01
fonte dall'utente

voti
2

Non riesco a pensare a un modo cross-platform di ciò che si vuole (o in qualsiasi modo garantito punto), ma come si utilizza GetTickCount forse non siete interessati a più piattaforme :)

Userei comunicazioni tra processi e impostare i processi intensivi livelli piacevole per ottenere ciò che si richiede, ma non sono sicuro che sia appropriato per la situazione.

EDIT: Sono d'accordo con Bernard , che è il motivo per cui credo che un processo piuttosto che un filo potrebbe essere più appropriato ma potrebbe non soddisfare i vostri scopi.

Risposto il 05/08/2008 a 08:23
fonte dall'utente

voti
0

Si può essere in grado di cambiare la priorità di un thread, ma cambiando il massimo utilizzo sarebbe neanche bisogno di polling e hack per limitare il numero di cose si verificano, o utilizzando gli strumenti del sistema operativo in grado di impostare il massimo utilizzo di un processo. Tuttavia, non vedo alcuna circostanza in cui si vorrebbe fare questo.

Risposto il 03/01/2018 a 18:06
fonte dall'utente

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