2012-06-03 16 views
23

Sto eseguendo un codice .cpp (i) in stile sequenziale e (ii) utilizzando le istruzioni OpenMP. Sto cercando di vedere la differenza di tempo. Per calcolare il tempo, io uso questo:Misurazione del tempo di esecuzione in C++ Codice OpenMP

#include <time.h> 
..... 
main() 
{ 

    clock_t start, finish; 
    start = clock(); 
    . 
    . 
    . 
    finish = clock(); 

    processing time = (double(finish-start)/CLOCKS_PER_SEC); 

} 

Il tempo è abbastanza preciso nel sequenziale (sopra) esecuzione del codice. Ci vogliono circa 8 secondi per eseguirlo. Quando inserisco le istruzioni OpenMP nel codice e successivamente calcola il tempo in cui ottengo una riduzione del tempo, ma il tempo visualizzato è di circa 8-9 secondi sulla console, quando in realtà sono solo 3-4 secondi in tempo reale!

Ecco come il mio codice sembra astrattamente:

#include <time.h> 
..... 
main() 
{ 

    clock_t start, finish; 
    start = clock(); 
    . 
    . 
    #pragma omp parallel for 
    for(...) 
    for(...) 
     for (...) 
    {   
     ...;  
    } 
    . 
    . 
    finish = clock(); 

    processing time = (double(finish-start)/CLOCKS_PER_SEC); 

} 

Quando eseguo il codice di cui sopra, ho la riduzione nel tempo, ma il tempo visualizzato non è accurato in termini di tempo reale. Mi sembra che la funzione clock() stia calcolando l'ora individuale di ciascun thread e la sommando e visualizzandoli.

Qualcuno può spiegarne il motivo o suggerire altre funzioni di cronometraggio da utilizzare per misurare il tempo nei programmi OpenMP?

Grazie.

risposta

15

Ho visto clock() che riporta il tempo della CPU, invece del tempo reale.

Potreste usare

struct timeval start, end; 
gettimeofday(&start, NULL); 

// benchmark code 

gettimeofday(&end, NULL); 

delta = ((end.tv_sec - start.tv_sec) * 1000000u + 
     end.tv_usec - start.tv_usec)/1.e6; 

Per il tempo le cose invece

+5

Spero che tu l'abbia visto, fa parte del comportamento specificato. Si noti inoltre che '(end.tv_sec - start.tv_sec) * 1000000u + end.tv_usec - start.tv_usec' ha molte meno probabilità di traboccare. –

+1

@ BenVoigt Sono umiliato dalla mia splendida dimostrazione di fallibilità. Ho scritto questo perché non merito più questa risposta di quanto ho già ottenuto. Grazie per aver corretto gli errori (sottile/non sottile). – sehe

+0

quale file di intestazione contiene questa funzione 'gettimeofday()'? Tutto quello che ho è un 'mingw_gettimeofday()' in 'time.h' (mingw in windows 64) –

5

Ebbene sì, questo è ciò che dovrebbe fare clock(), che indica il tempo del processore utilizzato dal programma.

Se si desidera trovare il tempo reale trascorso, anziché il tempo della CPU, utilizzare una funzione che restituisce l'ora dell'orologio a parete, ad esempio gettimeofday().

30

Mi sembra che la funzione clock() stia calcolando il tempo individuale di ciascun thread e sommandoli e visualizzandoli.

Questo è esattamente quello clock() fa - si misura il tempo di CPU utilizzata dal processo, che almeno su Linux e Mac OS X significa che il tempo di CPU cumulativo di tutte le discussioni che si sono sempre esistiti nel processo dal è stato avviato

Il cronometro dell'orologio in tempo reale (ad esempio orologio a muro) delle applicazioni OpenMP deve essere eseguito utilizzando la chiamata del timer OpenMP ad alta risoluzione omp_get_wtime() che restituisce un valore double del numero di secondi da un punto arbitrario nel passato. È una funzione portatile, ad es. esiste in entrambi i run-time Unix e Windows OpenMP, a differenza di gettimeofday() che è solo Unix.

+0

"tutti i thread del processo" ... può o non può essere il caso. Secondo la documentazione, possono essere inclusi anche i processi figli mietuti. –

+0

Hmm, né ISO/IEC 9899: 1999 né SUSv3 menzionano processi secondari: "La funzione clock() restituisce la migliore approssimazione dell'implementazione al tempo del processore utilizzato dal processo dall'inizio di un'era definita dall'implementazione relativa solo al processo invocazione." –

+0

Bene, la pagina man di Linux dice che è un punto di incompatibilità con alcuni altri sistemi operativi (non dice quali includono effettivamente i processi figli). –

0
#include "ctime" 

std::time_t start, end; 
long delta = 0; 
start = std::time(NULL); 

// do your code here 

end = std::time(NULL); 
delta = end - start; 

// output delta 
Problemi correlati