c matlab time mex

La discrepancia del reloj de Tic-toc & C de MATLAB



time mex (1)

He escrito un código C al que llamo formulario MATLAB después de compilarlo usando MEX. Dentro del código C, mido el tiempo de una parte de la computación usando el siguiente código:

clock_t begin, end; double time_elapsed; begin = clock(); /* do stuff... */ end = clock(); time_elapsed = (double) ((double) (end - begin) / (double) CLOCKS_PER_SEC);

El tiempo transcurrido debe ser el tiempo de ejecución en segundos.

Luego time_elapsed el valor time_elapsed a MATLAB (se exporta correctamente; lo he comprobado). Luego, el lado de MATLAB lo llamo C (después de compilarlo usando MEX) y mido su tiempo de ejecución usando tic y toc . Lo que resulta completamente absurdo es que el tiempo que calculo usando tic y toc es 0.0011s (promedio en 500 ejecuciones, desarrollo de st. 1.4e-4) mientras que el tiempo que devuelve el código C es 0.037s ( promedio en 500 carreras, st. dev. 0.0016).

Aquí uno puede notar dos hechos muy extraños:

  1. El tiempo de ejecución para toda la función es menor que el tiempo de ejecución para una parte del código. Por lo tanto, las medidas de MATLAB o C son muy inexactas.
  2. Los tiempos de ejecución medidos en el código C son muy dispersos y exhiben un st muy alto. desviación (coeficiente de variación del 44%, en comparación con solo el 13% para el tic-toc).

¿Qué está pasando con estos temporizadores?


Estás comparando manzanas con naranjas.

Mira la documentación de Matlab:

tic - http://www.mathworks.com/help/matlab/ref/tic.html
toc - http://www.mathworks.com/help/matlab/ref/toc.html

tic y toc le permiten medir el tiempo real transcurrido.

Ahora mira la función del reloj http://linux.die.net/man/3/clock .

En particular,

La función clock () devuelve una aproximación del tiempo de procesador utilizado por el programa.

El valor devuelto es el tiempo de CPU utilizado hasta un clock_t; para obtener la cantidad de segundos utilizados, divida por CLOCKS_PER_SEC. Si el tiempo de procesador utilizado no está disponible o su valor no se puede representar, la función devuelve el valor (clock_t) -1.

Entonces, ¿qué puede explicar su diferencia?

  • El tiempo de CPU (medido por reloj ()) y el tiempo real transcurrido (medido por tic y toc) NO son los mismos. Entonces, ¿esperaría que el tiempo de CPU fuera menor que el tiempo transcurrido? Bien quizás. ¿Qué pasa si dentro de 0.0011s está conduciendo 10 núcleos al 100%? Eso significaría que la medición del reloj () es 10x que se mide con tic y toc. Posible, poco probable.
  • el reloj (.) es extremadamente inexacto y, de acuerdo con la documentación, ¡es una medida aproximada del tiempo de la CPU! Sospecho que está vinculado al tamaño cuántico del programador, pero no busqué el código del kernel de Linux para verificarlo. Tampoco revisé otros SO, pero el blog de este tipo es consistente con esa teoría.

Entonces, ¿qué hacer ... para empezar, comparar manzanas con manzanas? Luego, asegúrese de tener en cuenta la resolución del temporizador.