OPTIMIZACIÓN
QUE ES LA OPTIMIZACIÓN? O PTIMIZACIÓN? •
•
El objetivo de la optimización es mejorar código objeto final, preservando significado del programa. Es decir, decir, realizar un serie de transformaciones al código intermedio para obtener un mejor rendimiento en cuanto a velocidad de ejecución entre otros parámetros. Aquí aplica que entre menos código basura o innecesaria se tenga mas rápido funcionara nuestro programa.
TIPOS DE OPTIMIZACIÓN En función de ámbito de la aplicación: En función de la dependencia de la arquitectura: Locales •
•
Bucles o ciclos
•
Independiente de la maquina
•
Globales
•
Dependiente de la maquina
•
Mirilla o Peephole
OPTIMIZACIÓN DEPENDIENTE DE LA MAQUINA •
•
La optimización independiente de la maquina aprovecha aprovec ha características especificas de cada equipo e quipo o maquina objetivo. Características: Asignación de registros, uso de modos de direccionamiento
Uso instrucciones especiales (IDIOMS)
est rategias de mem. relleno de pipelines, predicción de saltos, aprovechamiento de estrategias cache, etc.
OPTIMIZACIÓN INDEPENDIENTE DE LA MAQUINA •
•
La optimización independiente de la maquina son aplicables en cualquier tipo de maquina objetivo o equipo. Características: Ejecución en tiempo de compilación
Eliminación de redundancias Cambios de orden de ejecución, etc.
Transformaciones ormaciones de código, Análisis de flujo de control, Tratamiento de bucles. Transf Introducción al análisis de flujo de datos y optimización global.
OPTIMIZACIONES EN FUNCIÓN DEL ÁMBITO DE LA APLICACIÓN •
•
En lo que respecta a los temas de la unidad 3 de la materia de lenguajes y autómatas 2 se observaran obser varan con mas detalle las optimizaciones en función del ámbito de la aplicación. También cabe decir que las optimizaciones de mirilla o Peephole y las de bucle o ciclo son optimizaciones de tipo global. Mas adelante se explicara con detalle las características de cada uno de estos tipos de optimización para su mayor comprensión.
OPTIMIZACIÓN DE CÓDIGO •
Para que un código pueda considerarse co nsiderarse optimizado es necesario que sea eficiente o mejorarlos en los siguientes aspectos: Tiempo de ejecución (optimización temporal) Espacio de memoria utilizado (optimización espacial)
•
Hay que tener muy en cuenta que cuando optimizamos nos modificamos la funcionalidad del código simplemente lo hacemos hacem os mas eficiente en cuanto a los dos parámetros anteriores.
GRAFO •
•
Es un conjunto de objetos llamados vértices o nodos unidos por enlaces llamados aristas o arcos, que permiten representar relaciones binarias entre elementos de un conjunto Un arco es un salto hacia un bloque
BLOQUE BÁSICO •
•
•
Podría decirse que es un nodo del grafo de flujo Esto es, una serie de instrucciones o sentencias consecutivas que el flujo de control lo recorre de principio a fin. Bloque básico
Ejemplo:
Bloque básico
EJEMPLOS
BB1:
for (i=1;i<10;++i) { BB1
i=1;
BB2: i<10;
b=b+a[i];
BB3:
c=b*i;
b=b+a[i]; c=b*i; ++i
} BB2
a=3;
BB4: a=3; b=4; goto l1;
b=4; BB3
BB4
goto l1; c=10;
BB5:
l1: d=3;
BB6:
c=10;
e=4 BB = Block Basic o Bloque básico
l1: d=3; e=4;
OPTIMIZACIONES LOCALES •
•
Las optimizaciones locales solo se realizan sobre bloques básicos o módulos del programa y solo se ven reflejadas ahí mismo. Entre las diferentes optimizaciones locales encontramos: algebraicas aicas Simplificaciones algebr Propagación ón de copias y constantes. Propagaci Constant folding
Eliminación de subexpreciones redundantes o comunes. Eliminación de código incansable
SIMPLIFICACIONES ALGEBRAICAS •
Son sentencias que pueden eliminarse o simplificarse.
•
x = x +1
•
x=x*1
•
x=x* 0⇒x=0
•
y = y ** 2
⇒
y=y*y
•
x=x*8
•
x = x * 15
⇒
x = x<< 3
⇒
t = x << 4; 4; x = t - x
PROPAGACIÓN DE COPIAS •
Esta optimización permite al programador utilizar variables como constantes sin introducir ineficiencias hasta la siguiente asignación de dicha variable. a=3+i f=a b=f+c d=a+m m=f+d
a=3+i b=a+c d=a+m m=a+d
b=z+y a=b x=2*a
b=z+y a=b x=2*b
CONSTANT FOLDING (ENSAMBLAMIENTO) •
•
Consiste en remplazar las expresiones por su resultado cuando se pueden evaluar en tiempo de compilación. Las propiedades conmutativas conm utativas y asociativas también pueden usarse. Ejemplo: A=2+3+A+C
3-(5+6)+4-A*10
A=5+A+C
-4-(A*10)
ELIMINACIÓN DE SUBEXPRECIONES ELIMINACIÓN SUBEXP RECIONES REDUNDANTES O COMUNES. •
•
Aquí se usan las subexpreciones que aparecen mas de una vez para calcularlas solo una vez y reutilizar ese resultado. Ejemplo: •
x=y+z
x=y+z
•
w=y+z
w=x
ELIMINACIÓN ELIMINA CIÓN DE CÓDIGO C ÓDIGO INALCANZABLE •
•
Los códigos inalcanzables son códigos de bloques básicos que no son destino de ningún salto y por lo tanto pueden eliminarse. Ejemplo con propagación de copias: x = z + y
•
b=z+y
b=z+y
a=x
a=b
x=2*b
x=2*a
x=2*b
En el ultimo ejemplo observamos que al sustituir x por b y proseguir al final la línea a = b ya no tenia sentido tenerla por que x = 2 * b accederá directamente a b = z + y sin tener que hacer uso de ninguna otra igualación.
OPTIMIZACIONES LOCALES •
Cada optimización hace poco por si misma pero la aplicación de una permite la realización de otras sucesivamente y así hasta que ya no haya mejoras o el tiempo limite se haya alcanzado.
EJEMPLO DE SECUENCIA DE OPTIMIZACIONES a = x ** 2 b=3 c=x d=c*c e=b*2
a c i a r b e g l a n ó i c a z i m i t p O
a=x*x b=3 c=x d=c*c e = b << 1 f=a+d g = e * f
a i p o c e d n ó i c a g a p o r P
a=x*x b=3 c=x d=x*x e = 3<< 1 f=a+d g = e * f
g n i d l o F t n a t s n o C
Eliminar subexprecion común
f=a+d g=e*f Código final
a=x*x b=3 c=x d=x*x e=6 f=a+d g = e * f
a := x * x f := a + a g := 6 * f
e d l e n b ó a i z c n o a n i g a i c m d l i l ó a n E c i
a=x*x b=3 c=x d=a e=6 f=a+a
a i p o c e d n ó i c a g a p
a=x*x b=3 c=x d=a e=6 f=a+d
OPTIMIZACIÓN DE BUCLES O CICLOS •
•
La optimización de bucles es muy importante por las mejoras en tiempo de ejecución que se obtienen. La idea es centrar la optimización en las partes mas usadas y no en todo el programa. Existen diferentes estrategias de optimización dentro de bucles (local o global): Expansión de bucles (loop unrolling)
Reducción de frecuencia (Frequency reduction) Reducción de potencia (strenght reduction)
EXPANSIÓN DE BUCLES •
•
Solo se puede aplicar a los bucles cuyo número de iteraciones se conoce en tiempo de compilación. Ejemplo: A(0) = 0;
For (I=0; I < 4; I++) a(I) = 0;
A(1) = 0; A(2) = 0; A(3) = 0;
REDUCCIÓN DE FRECUENCIA •
•
Detecta las operaciones invariantes de bucle y las calcula una única vez delante del bucle. Ejemplo: i=1 L1:
t1 = sin(a) t2 = i * t1 c = t2; i = i+1 If i < n go to L1
i=1 t1 = sin(a) L1: t2 = i * t1 c = t2; i = i+1 If i < n go to L1
Operación invariante
REDUCCIÓN DE POTENCIA •
•
Consiste en sustituir productos entre variables inductivas e invariantes de bucle por sumas. Ejemplo: for(i=1; i< i<10;++i) a[ a[i]=3*i;
for(i=1,j=3;i<10;++i,j+=3) a[i]=j;
OPTIMIZACIÓN GLOBAL •
Corresponde a la optimización “global”, es decir, de todo el grafo de flujo
de ejecución, con respecto a todo el código. •
•
Esta optimización es muy lenta pero mejora el desempeño desem peño general de todo el programa. Es necesario crear el grafo de flujo de ejecución de todo el código ya que este nos permite una mejor comprensión de las instrucciones y manejo de datos dentro del código.
EJEMPLO OPTIMIZA OPTIM IZACIÓN CIÓN GLOBAL x=3
x=3
y=z*w
y =z *w
y=z *w
q=x+y
q=3+y
q=3+y
Ya que x = 3 corresponde a fuera del bloque básico o nodo del grafo simplemente aplicando teoría de las optimizaciones locales para esta que es global.
OPTIMIZACIÓN GLOBAL •
Dentro de las optimizaciones globales también aplican las siguientes: Identificación de expresiones comunes entre bloques Afecta a la asignación de registros entre bloque básicos.
Optimización de llamadas a procedimientos Cambios del ámbito de referencias Gestión de Registros de Activación Paso de parámetros + asignación de datos locales
Optimización de bucles
OPTIMIZACIÓN DE MIRILLA •
La optimización de mirilla trata de estructurar de manera eficiente el flujo del programa, sobre todo en instrucciones de bifurcación como co mo son las decisiones, ciclos y saltos de rutinas.
•
Mirilla significa secuencia corta de instrucciones objeto. o bjeto.
•
Y la idea es sustituir estas instrucciones por instrucciones mas cortas cor tas o rápidas.
OPTIMIZACIÓN DE MIRILLA •
La optimización de mirilla intenta rehacer el código de manera mas eficiente mediante: Cargas y almacenamientos redundantes. Código inalcanzable. Optimizaciones de flujo y de control Eliminación de instrucciones inútiles. Utilización de expresiones especificas Reacondicionamiento de instrucciones.
CARGAS Y ALMA ALMACENAMIENTOS CENAMIENTOS REDUNDANTES. (1) MOV R0,a (2) MOV a, R0
Se elimina (2) ya que está garantizado que con (1) el valor de a está en el registro registro R0 (siempre (siempre que no haya haya saltos a (2))
CÓDIGO INALCANZABLE •
Se puede eliminar una instrucción sin etiqueta que siga inmediatamente a un salto incondicional
OPTIMIZACIONES DE FLUJO Y DE CONTROL •
Estos son saltos hacia saltos o saltos hacia saltos condicionales.
ELIMINACIÓN ELIMINA CIÓN DE INSTRUCCIONES INÚTILES •
a=a*1
•
b=b+0
UTILIZACIÓN DE EXPRESIONES ESPECIFICAS •
a=a+1
inc a
REACONDICIONAMIENTO REA CONDICIONAMIENTO DE INSTRUCCIONES INSTRU CCIONES Antes
Después
a = b * c * (d + e)
a = (d + e) * b * c LOAD B
LOAD D
t1 = b * c
MUL C
t1:=d + e
ADD E
t2 = d + e
STA T1
t2:=b * c
M UL B
t3 = t1 * t2
LOAD D
t3:=t2*c
MUL C
ADD E
MUL T1 STA A
STA A
COSTOS •
•
Los costos son el factor más importante a tomar en cuenta a la hora de optimizar ya que en ocasiones la mejora obtenida puede verse no reflejada en el programa final pero si ser perjudicial para el equipo e quipo de desarrollo. La optimización de una pequeña mejora tal vez tenga una pequeña ganancia en tiempo o en espacio pero sale muy costosa en tiempo en generarla.
COSTOS DE EJECUCIÓN •
Los costos de ejecución ejec ución son aquellos que vienen implícitos al ejecutar el programa. En algunos programas se tiene un mínimo para ejecutar el programa, por lo que el espacio y la velocidad de los microprocesadores son elementos que se deben optimizar para tener un mercado potencial po tencial más amplio.
CRITERIOS PARA PARA MEJORAR EL CÓDIGO •
•
La mejor manera de optimizar el código es hacer ver a los programadores que optimicen su código desde el inicio, el problema radica en que el costo podría ser muy grande ya que tendría que codificar más y/o hacer su código más legible. Los criterios de optimización siempre están definidos por el compilador. Muchos de estos criterios pueden modificarse con directivas del compilador desde el código o de manera externa. Este proceso lo realizan algunas herramientas del sistema como los ofuscadores para código móvil y código para dispositivos móviles.
HERRAMIENTAS PARA PARA EL ANÁLISIS ANÁLIS IS DEL FLUJO DE DATOS •
•
Existen algunas herramientas que permiten el análisis de los flujos de datos, entre ellas tenemos los depuradores y desambladores. La optimización al igual que la programación p rogramación es un arte y no se ha podido sistematizar del todo.