Tiempo de medición del programa de subprocesos múltiples.

Medí el tiempo con el reloj de función() pero dio malos resultados. Quiero decir que da los mismos resultados para el programa con un subproceso y para el mismo programa que se ejecuta con OpenMP con muchos subprocesos. Pero de hecho, observo con mi reloj que con muchos hilos el programa cuenta más rápido. Así que necesito un temporizador de reloj de pared ...

Mi pregunta es: ¿Cuál es la mejor función para este problema? clock_gettime() o mb gettimeofday ()? o mb algo mas?

Si clock_gettime (), entonces con qué reloj? ¿CLOCK_REALTIME o CLOCK_MONOTONIC?

utilizando mac os x (leopardo de las nieves)

1

2 Respuestas

Si desea una hora de reloj de pared y está disponible clock_gettime() , es una buena opción. Úselo con CLOCK_MONOTONIC si está midiendo intervalos de tiempo, y CLOCK_REALTIME para obtener la hora real del día.

CLOCK_REALTIME gives you the actual time of day, but is affected by adjustments to the system time -- so if the system time is adjusted while your program runs that will mess up measurements of intervals using it.

CLOCK_MONOTONIC doesn't give you the correct time of day, but it does count at the same rate and is immune to changes to the system time -- so it's ideal for measuring intervals, but useless when correct time of day is needed for display or for timestamps.

3
agregado

Creo que clock() cuenta el uso total de la CPU entre todos los subprocesos, también tuve este problema ...

La elección del método de tiempo de reloj de pared es la preferencia personal. Utilizo una función de envoltura en línea para tomar sellos de tiempo (tome la diferencia de 2 sellos de tiempo para programar su procesamiento). He utilizado el punto flotante por conveniencia (las unidades están en segundos, no tiene que preocuparse por el desbordamiento de enteros). Con los subprocesos múltiples, hay tantos eventos asíncronos que, en mi opinión, no tiene sentido cronometrar por debajo de 1 microsegundo. Esto me ha funcionado muy bien hasta ahora :)

Lo que elijas, una envoltura es la forma más fácil de experimentar.

inline double my_clock(void) {
  struct timeval t;
  gettimeofday(&t, NULL);
  return (1.0e-6*t.tv_usec + t.tv_sec);
}

uso:

double start_time, end_time;
start_time = my_clock();
//some multi-threaded processing
end_time = my_clock();
printf("time is %lf\n", end_time-start_time);
1
agregado