2015-07-09 11 views
6

Sto provando a misurare il tempo di esecuzione di un programma multi-thread. Ho utilizzare questo pezzo di codice nel programma principale per il calcolo del tempo:tempo di esecuzione nell'ambiente di multithreading

clock_t startTime = clock(); 
//do stuff 
clock_t stopTime = clock(); 
float secsElapsed = (float)(stopTime - startTime)/CLOCKS_PER_SEC; 

Ora il problema che ho è: per esempio eseguo il mio programma con 4 fili (ogni thread in esecuzione su un core), il il tempo di esecuzione è 21,39. Controllo il mio monitor di sistema in fase di esecuzione, dove il tempo di esecuzione è di circa 5,3.

Sembra che il tempo di esecuzione effettivo sia moltiplicato per il numero di FILETTATURE.

Qual è il problema ??

+0

Puoi provare a creare un [Minimal, complete e verificabili Esempio] (http://stackoverflow.com/help/mcve) e mostraci? Perché con solo il codice che ci mostri è impossibile dire qualcosa di sicuro. –

risposta

8

È perché si sta monitorando la CPU time che è il tempo accumulato speso dalla CPU eseguendo il codice e non il Wall time che è il tempo del mondo reale trascorso tra il startTime e stopTime.

Infatti clock_t:

restituisce il tempo processore utilizzato dal programma.

Se si fa la matematica: 5.3 * 4 = 21.2 che è quello che si ottiene il che significa che avete buon codice multithreaded con un aumento di velocità di 4.

Quindi per misurare il tempo di parete, è preferibile utilizzare std::chrono::high_resolution_clock per esempio e si dovrebbe tornare 5.3. Puoi anche utilizzare il classico gettimeofday().

Se si utilizza OpenMP per il multithreading si hanno anche omp_get_wtime()

double startTime = omp_get_wtime(); 
// do stuff 
double stopTime = omp_get_wtime(); 
double secsElapsed = stopTime - startTime; // that's all ! 
+0

grazie per la tua utile risposta. :) – stella