2012-06-03 35 views
23

Estoy ejecutando un código .cpp (i) en estilo secuencial y (ii) utilizando sentencias OpenMP. Estoy tratando de ver la diferencia de tiempo. Para calcular el tiempo, uso esto:Mida el tiempo de ejecución en C++ código OpenMP

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

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

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

} 

El tiempo es bastante preciso en la ejecución secuencial (arriba) del código. Toma alrededor de 8 segundos ejecutar esto. Cuando inserto las declaraciones de OpenMP en el código y después de eso calculo el tiempo que recibo una reducción en el tiempo, pero el tiempo que se muestra es de aproximadamente 8-9 segundos en la consola, cuando en realidad solo son 3-4 segundos en tiempo real.

Aquí es cómo mi código es abstracta:

#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); 

} 

Cuando ejecuto el código anterior, consigo la reducción en el tiempo, pero el tiempo que se muestra no es precisa en cuanto a tiempo real. Me parece que la función clock() calcula el tiempo individual de cada hilo y lo suma y muestra.

¿Alguien puede decir la razón de esto o sugerirme cualquier otra función de tiempo para medir el tiempo en los programas OpenMP?

Gracias.

Respuesta

15

He visto clock() informando el tiempo de CPU, en lugar de en tiempo real.

Usted podría utilizar

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; 

Para el tiempo las cosas en vez

+5

Espero que hayas visto eso, es parte del comportamiento especificado. Tenga en cuenta también que '(end.tv_sec - start.tv_sec) * 1000000u + end.tv_usec - start.tv_usec' tiene muchas menos probabilidades de desbordarse. –

+1

@BenVoigt Me siento honrado por mi espléndida muestra de falibilidad. Le dije esto porque no merezco más crédito por esta respuesta de la que ya obtuve. Gracias por corregir los errores (sutiles/no sutiles). – sehe

+0

¿qué archivo de encabezado contiene esta función 'gettimeofday()'? Todo lo que tengo es un 'mingw_gettimeofday()' en 'time.h' (mingw en Windows 64) –

5

Bueno, sí, eso es lo que se supone que debe hacer clock(), indicando cuánto tiempo de procesador usó el programa.

Si desea encontrar tiempo transcurrido en tiempo real, en lugar de tiempo de CPU, utilice una función que devuelva la hora del reloj de pared, como gettimeofday().

30

Me parece que la función clock() calcula el tiempo individual de cada hilo y lo suma y muestra.

Ésta es exactamente lo clock() hace - que mide el tiempo de CPU utilizado por el proceso, que al menos en Linux y Mac OS X significa el tiempo de CPU acumulado de todas las discusiones que jamás han existido en el proceso, ya fue comenzado.

Real-reloj (también conocido como reloj de pared) ritmo de las aplicaciones OpenMP se debe hacer uso de la alta resolución OpenMP llamada temporizador omp_get_wtime() que devuelve un valor double del número de segundos desde un punto arbitrario en el pasado. Es una función portátil, p. existe en los tiempos de ejecución de Unix y Windows OpenMP, a diferencia de gettimeofday(), que es solo de Unix.

+0

"todos los temas en el proceso ..." puede o no ser el caso. De acuerdo con la documentación, también se pueden incluir procesos secundarios cosechados. –

+0

Hmm, ni ISO/IEC 9899: 1999 ni SUSv3 mencionan procesos secundarios: "La función clock() devolverá la mejor aproximación de la implementación al tiempo de procesador utilizado por el proceso desde el comienzo de una era definida como implementación relacionada solo con el proceso invocación." –

+0

Bueno, la página del manual de Linux dice que es un punto de incompatibilidad con algunos otros sistemas operativos (no dice cuáles realmente incluyen procesos secundarios). –

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 
Cuestiones relacionadas