transferencia - ¿Por qué Matlab se ejecuta más rápido después de que un script se “calienta”?
red nodal transferencia de calor (4)
Además de las razones específicas de Matlab, como la compilación JIT, las CPU modernas tienen cachés grandes, predictores de ramificaciones, etc. El calentamiento de estos es un problema para la evaluación comparativa incluso en lenguaje ensamblador.
Además, lo que es más importante, las CPU modernas usualmente están inactivas a baja velocidad de reloj y solo saltan a la máxima velocidad después de varios milisegundos de carga sostenida.
La función Turbo de Intel se vuelve aún más funky: cuando los límites de energía y térmicos lo permiten, la CPU puede funcionar más rápido que su frecuencia máxima sostenible. Por lo tanto, los primeros ~ 20 segundos a 1 minuto de su índice de referencia pueden ejecutarse más rápido que el resto, si no tiene cuidado de controlar estos factores.
Me he dado cuenta de que la primera vez que ejecuto un script, lleva bastante más tiempo que la segunda y la tercera vez 1 . El "calentamiento" se menciona en esta pregunta sin una explicación.
¿Por qué el código se ejecuta más rápido después de que se "calienta"?
No clear all
llamadas 2 , pero los parámetros de entrada cambian para cada llamada de función. ¿Alguien sabe a que se debe esto?
1. Tengo mi licencia localmente, por lo que no es un problema relacionado con la verificación de la licencia.
2. En realidad, el comportamiento no cambia si clear all
.
Otro problema que no han sido evaluados por Amro y Marc es la asignación (pre) de memoria.
Si su secuencia de comandos no asigna previamente su memoria, la primera ejecución será muy lenta debido a la asignación de memoria. Una vez completada su primera iteración, se asigna toda la memoria, por lo que las invocaciones consecutivas del script serían más eficientes.
Un ejemplo ilustrativo
for ii = 1:1000
vec(ii) = ii; %// vec grows inside loop the first time this code is executed only
end
Se interpreta matlab. Si no calienta el código, perderá mucho tiempo debido a la interpretación en lugar del algoritmo real. Esto puede sesgar los resultados de los tiempos significativamente.
Ejecutar el código al menos una vez permitirá a Matlab compilar realmente los segmentos de código apropiados.
Una razón por la que se ejecutaría más rápido después de la primera vez es que muchas cosas se inicializan una vez y sus resultados se almacenan en caché y se reutilizan la próxima vez. Por ejemplo, en el lado M, las variables se pueden definir como persistent en las funciones que se pueden locked . Esto también puede ocurrir en el side MEX .
Además, muchas dependencias se cargan después de la primera vez y permanecen así en la memoria para ser reutilizadas. Esto incluye funciones M, clases OOP, clases Java, funciones MEX, etc. Esto se aplica tanto a los incorporados como a los definidos por el usuario.
Por ejemplo, ejecute el siguiente command antes y después de ejecutar su script para la primera ejecución, luego compare:
[M,X,C] = inmem(''-completenames'')
Tenga en cuenta que clear all
no necesariamente elimina todo lo anterior, sin mencionar las funciones bloqueadas ...
Finalmente no olvidemos el papel del acelerador. En lugar de interpretar el código M cada vez que se invoca una función, se compila en las instrucciones del código de máquina durante el tiempo de ejecución. La compilación JIT se produce solo para la primera invocación, por lo que, idealmente, la eficiencia de ejecutar el código objeto en los siguientes tiempos superará la sobrecarga de reinterpretar el programa cada vez que se ejecuta.