2015-01-02 4 views
6

Devo testare un computer embedded per le condizioni più estreme di dissipazione di calore e corrente generati, e per farlo voglio scrivere un programma che impieghi la risorsa CPU il più possibile di una CPU quad core (un thread per core). Puoi suggerire qualcosa che sarebbe molto affamato di CPU?Il modo più semplice per simulare il carico massimo della CPU?

Devo farlo per Linux su ARMv7 e il linguaggio è C o C++, gli altri esempi che ho trovato sono per Windows o non in C/C++.

sto cercando qualcosa di simile sul mio computer Windows e apparentemente sta funzionando come ci vuole il 12% della potenza totale della CPU (che è un quad core i7 2 thread per core):

float x = 1.5f; 
while (1) 
{ 
    x *= sin(x)/atan(x) * tanh(x) * sqrt(x); 
} 

I don so come renderlo multi-thread.

+0

Si prega di non mescolare i tag c e C++. Scegli uno di loro. –

+1

Su Linux, è possibile eseguire il fork di molti di questi processi. Forse semplicemente come iniziare sullo sfondo del tuo guscio. Ma molte distribuzioni Linux hanno 'cpuburn' –

risposta

4

Il tuo codice è seriale. Hai otto thread disponibili (4 core * 2 thread per core = 8 thread totali) e il tuo codice corrente ne usa uno per 1 thread/8 available = 12.5% della tua CPU. Se devi scrivere il tuo codice (e non utilizzare un codice intensivo preesistente come già suggerito da altri), ti suggerirei di inserire un ciclo sopra il tuo ciclo e di compilare con il flag -fopenmp (supponendo che tu stia usando MinGW, se no , l'opzione esatta può variare) in modo da utilizzare invece tutti i thread disponibili.

+1

Wow! Perché non ho pensato a OpenMP ?!Ha fatto immediatamente uso del 100% del mio i7 quando ho compilato questo codice con/openmp su MSVC2013. Penso che funzionerà anche con Linux ... Proviamo adesso. –

+0

@MarkMiles: In effetti dovrebbe funzionare anche con Linux, a meno che tu non abbia modificato la variabile di ambiente 'OMP_MAX_NUM_THREADS 'ad essere qualcosa di meno del numero massimo di thread disponibili sulla macchina. – wolfPack88

+1

In effetti funziona. Grazie! –

0

Deve essere un programma tutto tuo? Potresti sempre prendere del codice esistente che brucia molti cicli, come un raytracer o un Bitcoin, ed eseguire molti di questi.

+0

Beh, stavo cercando il modo 'più semplice'. Una complessa funzione matematica dovrebbe fare il trucco, ma è importante che funzioni su tutti i core disponibili di una CPU multi-core. –

+0

L'utilizzo di codice facilmente esistente sembra più facile rispetto alla scrittura di un nuovo codice. L'esecuzione di quattro processi è la cosa più semplice che riesco a pensare per dare lavoro a tutti e quattro i core. –

2

Dipende un po 'da cosa intendi per "carico massimo della CPU".

Per quanto riguarda l'utilizzo della CPU, praticamente tutto funzionerà. Tieni a mente che avrai bisogno di un numero di thread (o di quante istanze dell'eseguibile) dato che la tua CPU ha core.

Ciò che è necessario tenere a mente, tuttavia, è che l'utilizzo della CPU non è l'intero e il fine di tutto il consumo energetico in un SoC. Altri aspetti che è necessario tenere a mente sono:

  • Accesso alla memoria. L'applicazione attualmente in uso non tocca affatto la memoria.

  • Altre periferiche on-die, come i controller flash, driver SPI/I2C/UART, ecc

  • Una GPU, se il SoC include uno. (Ciò semplifica facilmente l'uso di energia di tutto ciò che ho menzionato finora!)

  • Dispositivi periferici off-die: flash, memoria, display, caricabatterie, qualsiasi altra cosa nel dispositivo.

+0

È tutto corretto, ma ho menzionato la CPU da sola perché l'applicazione finale di questo SoC impiegherà principalmente la CPU e non tutto il resto. La GPU non funzionerà affatto poiché il sistema operativo è privo di GUI; il disco verrà utilizzato solo per l'avvio; la memoria e altri controller avranno un utilizzo minore. L'applicazione finale farà un grande uso della CPU poiché il programma esegue principalmente operazioni matematiche e scriverà il risultato su un dispositivo seriale USB. –