c++ time parallel-processing openmp

Mida el tiempo de ejecución en C++ código OpenMP



time parallel-processing (4)

Estoy ejecutando un código .cpp (i) en estilo secuencial y (ii) usando declaraciones OpenMP. Estoy tratando de ver la diferencia de tiempo. Para calcular el tiempo, uso esto:

#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.

Así es como mi código se ve de manera 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, obtengo la reducción en el tiempo pero el tiempo mostrado no es preciso en términos de tiempo real. Me parece que la función clock () calcula el tiempo individual de cada hilo y lo suma y muestra.

¿Puede alguien decir la razón de esto o sugerirme alguna otra función de tiempo para medir el tiempo en los programas OpenMP?

Gracias.


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

Esto es exactamente lo que hace clock() : mide el tiempo de CPU utilizado por el proceso, que al menos en Linux y Mac OS X significa el tiempo acumulativo de CPU de todos los hilos que han existido en el proceso desde que se inició.

El tiempo de reloj real (también conocido como reloj de pared) de las aplicaciones OpenMP debe hacerse usando la llamada de temporizador de OpenMP de alta resolución omp_get_wtime() que devuelve un valor double de la cantidad de segundos desde un punto arbitrario en el pasado. Es una función portátil, por ejemplo, existe en los tiempos de ejecución de Unix y Windows OpenMP, a diferencia de gettimeofday() que es solo de Unix.


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

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


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

Podrías usar

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 cronometrar las cosas en cambio


#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