Professional Documents
Culture Documents
Optimizacin de Cdigo
Lecciones 5,6,7,8 y 9
- 3.1 -
Optimizacin
Se realiza despus de la generacin de cdigo de todo el programa o de un elemento ejecutable del programa (funcin, procedimiento, etc). Dependiente del contexto
Programa fuente
Optimizacin Objetivo
Obtener cdigo que se ejecuta ms eficientemente segn los criterios
Tiempo de ejecucin (optimizacin temporal) Espacio de memoria utilizado (optimizacin espacial)
Funcionamiento
Revisa el cdigo generado a varios niveles de abstraccin y realiza las optimizaciones aplicables al nivel de abstraccin
Representaciones de cdigo intermedio de ms a menos abstractas
rbol sintctico abstracto
Optimizar subexpresiones redundantes, reduccin de frecuencia, etc.
Tuplas o cuadruplas
Optimizar en uso de los registros o de las variables temporales
Ensamblador/Cdigo mquina
Convertir saltos a saltos cortos Reordenar instrucciones
Compiladores II (28/04/2014 10:36) - 3.3 -
Pasar a
A=c*d; B=A*3;
- 3.4 -
Optimizacin local
Reduccin de potencia Folding Propagacin de constantes
Optimizacin global
anlisis del grafo del flujo de ejecucin
Optimizacin de bucles
Loop unrolling Reduccin de frecuencia Reduccin de potencia
- 3.5 -
Optimizacin Local Las optimizaciones locales se realizan sobre el bloque bsico Optimizaciones locales
Folding Propagacin de constantes Reduccin de potencia Reduccin de subexpresiones comunes
Bloque Bsico
Un bloque bsico es un fragmento de cdigo que tiene una nica entrada y salida, y cuyas instrucciones se ejecutan secuencialmente. Implicaciones:
Si se ejecuta una instruccin del bloque se ejecutan todas en un orden conocido en tiempo de compilacin.
La idea del bloque bsico es encontrar partes del programa cuyo anlisis necesario para la optimizacin sea lo ms simple posible.
- 3.6 -
BB1: i=1; BB2: i<10; BB3: b=b+a[i]; c=b*i; ++i BB4: a=3; b=4; goto l1; BB5: c=10; BB6: l1: d=3; e=4;
- 3.7 -
Separacin correcta
for (i=1;i<10;++i) { b=b+a[i]; c=b*i; } a=3; b=4; goto l1; c=10; l1: d=3; e=4;
Compiladores II (28/04/2014 10:36)
Ensamblamiento (Folding) El ensamblamiento es remplazar las expresiones por su resultado cuando se pueden evaluar en tiempo de compilacin (resultado constante).
Ejemplo: A=2+3+A+C -> A=5+A+C
Propagacin de constantes
Desde que se asigna a una variable un valor constante hasta la siguiente asignacin, se considera a la variable equivalente a la constante. Ejemplo: Propagacin Ensamblamiento
PI=3.14 -> PI=3.14 -> PI=3.14 G2R=PI/180 -> G2R=3.14/180 -> G2R=0.017
Estas optimizaciones permiten que el programador utilice nombres para las constantes sin introducir ineficiencias.
- 3.8 -
- 3.9 -
- 3.10 -
Implementacin del Folding Implementacin durante el anlisis sintctico/semntico o creacin del rbol sintctico.
Se aade el atributo de constante temporal a los smbolos no terminales y a las variables de la tabla de smbolos. Se aade el procesamiento de las constantes a las reglas de anlisis de expresiones.
Implementacin posterior
Buscar partes del rbol donde se puede aplicar la propiedad conmutativa Buscar las constantes y operarlas Reconstruir el rbol
- 3.11 -
+- 3 +- + +- 5 +- 6 4 A 10
Trminos:
3 -5 -6 4 -(A*10)
Resultado: -4-(A*10)
Compiladores II (28/04/2014 10:36) - 3.12 -
Para asignaciones
Eliminar del conjunto de definiciones la definicin de la variable asignada Aadir la definicin de la variable asignada si se le asigna una constante
- 3.13 -
f +- x +- y InstrComp +- ; +- = | +- i | +- 0 +- ; +- = | +| ++- ; +| | | | | | | | | | | | | | +-
Fun f(x,y)=> { i=0; b=5; while (i<x) { print(i*b); i=0; i=i+1; b=5; } x*b }
b 5 while +- < | +- i | +- x +- InstrComp +- ; +- Print | +- * | +| ++- = +- i +- + ++* +- x +- b
i<x
i b
print(i*b); i=i+1;
i 1
- 3.14 -
Implementacin Primero se aplica el ensamblamiento y la propagacin de constantes. Despus se reordena el rbol sintctico hasta obtener la forma normal. Se inicia la eliminacin de las subexpresiones redundantes. Hay que considerar las asignaciones que pueden convertir una subexpresion redundante en no redundante. Ejemplo:
Q=A+B A=Q^2+2 C[1]=A+B+P
J=2*D+3 D=D*2 J=J+D
- 3.16 -
Optimizaciones Dentro de Bucles La optimizacin de bucles es muy importante por las mejoras en tiempo de ejecucin que se obtienen Estrategias de optimizacin dentro de bucles
Expansin de bucles (loop unrolling) Reduccin de frecuencia (frequency reduction) Reduccin de potencia (strength reduction)
- 3.17 -
Expansin de bucles(loop unrolling) La expansin de bucles solo se puede aplicar a los bucles cuyo nmero de iteraciones se conoce en tiempo de compilacin. Ejemplo:
Se puede aplicar a los bucles
for i=1 to 10 do
La expansin de un bucle puede ser muy costosa en espacio. Hay que poner un criterio heurstico para decidir si se aplica la expansin.
Se puede aplicar una expansin parcial en la que sigue existiendo el bucle, pero cada iteracin del nuevo bucle corresponde a varias iteraciones del bucle original.
En un bucle expandido se ha de sustituir el ndice del bucle por el valor constante correspondiente
Compiladores II (28/04/2014 10:36) - 3.18 -
Asociar a cada expresin invariante una variable temporal. Sustituir en el bucle las operaciones invariantes por las correspondientes variables. Aadir delante del bucle la asignacin de la expresin invariante a su variable temporal.
Reduccin de potencia(strength reduction) Se busca sustituir operaciones costosas por otras mas simples. Ejemplo:
sustituir productos por sumas.
a=2*a a=a+a
Problemas ha resolver
Detectar las invariantes de bucle
Ya esta solucionado
- 3.21 -
Variables Inductivas Una variable V es inductiva cuando la nica forma en que se modifica su cdigo es V=V+K, donde K es una invariante de bucle. Se considerar la necesidad de generar una variable inductiva temporal T a partir de encontrar expresiones de la forma V*C, donde C es una invariante de bucle.
Se sustituir V*C por T Se inicializa T despus de la inicializacin de V como T=V*C (solo se ejecuta al entrar en el bucle) Al final de cada iteracin se aade T=T+C*K
- 3.22 -
La optimizacin global a partir del anlisis del grafo del flujo de ejecucin permite
Una propagacin de constantes fuera del bloque bsico. Eliminacin del cdigo no utilizado Una mejor asignacin de los registros.
Ejemplo
int fact(int n) { int r; r=1; i=1; while (i<=n) { r=r*i; ++i; } return r; }
r=1 i=1
bloque bsico
bloque bsico
r=r*i; ++i;
while (i<=n)
bloque bsico
bloque bsico
return r;
- 3.24 -
En el grafo, los vrtices representan los bloques bsicos y las aristas representan los saltos de un bloque bsico a otro.
- 3.25 -
Anlisis del Grafo del Flujo de Ejecucin Hay que considerar como la informacin sobre las variables y expresiones se propaga a travs del grafo. Problemas resueltos durante el anlisis del grafo
expresiones disponibles (al seguir la ejecucin sigue siendo vlido el resultado obtenido) Alcance de las definiciones variables vivas expresiones muy utilizadas
Para la resolucin de los problemas anteriores se utiliza la idea de punto entre instrucciones o bloques bsicos.
r=1 i=1
Puntos
while (i<=n)
- 3.26 -
- 3.27 -
- 3.28 -
- 3.29 -
- 3.30 -
Algoritmos iterativos
Son lentos pero genricos Tipos:
lista de trabajos round robin
- 3.31 -
variables vivas
Reutilizar el espacio de variables. Eliminar variables innecesarias
- 3.32 -
J>0
L:=1
- 3.33 -
J>0
L:=2 L:=1
J:=2 K:=1
- 3.34 -
J>0
L:=2 L:=1
J:=2 K:=1 {J,K} K<J {J,K} A(K+1):=A(K)+A(K+1); I:=J; L:=K*I K:=K+2 {J,K}
Se puede eliminar L e I Las A(K),A(K+1) no se eliminan pues no se han podido considerar en el clculo de variables vivas
Compiladores II (28/04/2014 10:36) - 3.35 -
Eliminar J>0 por no utilizarse y saltar al mismo bloque bsico Eliminar A(1)<0 despus de eliminar J>0
J>0
J:=2 K:=1
{J:=2}
K<2
A(K+1):=A(K)+A(K+1); K:=K+2
- 3.36 -
A(1+1):=A(1)+A(1+1); A(2+1):=A(2)+A(2+1);
A(2):=A(1)+A(2); A(3):=A(2)+A(3);
- 3.37 -
Optimizacin Dependiente de Mquina La optimizacin dependiente mquina pretende aprovechar caractersticas especficas de mquina para acelerar la ejecucin programa
Considerar los ciclos de reloj que gasta cada instruccin de cdigo mquina.
Utilizar desplazamientos de bits para multiplicar y dividir. Para poner un registro a cero utilizar la instruccin XOR reg,reg que accede menos a memoria Utilizar saltos relativos de 8 o 16 bits para acceder menos a memoria.
de las la del
Alinear instrucciones/Datos para que se acceda en un nico ciclo de memoria. Combinar operaciones en una misma instruccin.
Utilizar el direccionamiento con pre- y post-incremento.
- 3.38 -
- 3.39 -
Ejemplo: T=X+Y
Cargar X Sumar Y Guardar T
La optimizacin ser reducir el nmero de operaciones del carga y descarga del acumulador.
- 3.40 -
Ejemplo: X=A+(B*C+D)
Notacin polaca inversa:
XABC*D++=
- 3.41 -
Optimizacin Ideas
Retrasar en todo lo posible las instruccin Guardar Reutilizar el contenido del acumulador Sacar provecho de la conmutatividad de las operaciones
Ejemplo:
Cargar B Mult C Guardar T1 ; B*C Cargar T1 Sumar D Guardar T2 ; B*C+D Cargar A Sumar T2 Guardar T3 ; A+(B*C+D) Cargar T3 Guardar X Eliminar
por reutilizacin del acumulador Eliminar por reutilizacin del acumulador
Cargar B Mult C ; B*C Sumar D ; B*C+D Guardar T2 ; B*C+D Cargar A Sumar T2 ; A+(B*C+D) Guardar X Aplicar la
propiedad conmutativa de la suma
Register Assignment
Es cuando se selecciona el registro para guardar una variable
- 3.43 -
Operando 1 n registros
Operando 2 m registros
- 3.45 -
Cuando se utilizar una Variable Para saber cuando se utilizar una variable se ha de aplicar el clculo de las variables vivas. Uso de los registros Ejemplo: a b c d e R0 R1 R2
c=c*b a=a+b d=d*c b=d e=c b b d d e c c c c c a a b b
- 3.46 -
Optimizar Cargas y Descargas Descargar una variable modificada es ms costoso que una no modificada. Para considerar esta diferencia de coste se utiliza el siguiente grafo
Los vrtices representan los estados de utilizacin de los registros y Las aristas representan las cargas y descargar necesarias para pasar de un estado a otro.
Se busca el camino de menor coste que vaya del estado de los registros al inicio del bloque bsico hasta el estado de estos al final del bloque bsico
- 3.47 -
Una instruccin de cdigo mquina puede ser varias instrucciones de cdigo intermedio
En la misma instruccin se realiza el clculo de la direccin de memoria del elemento de un array
Compiladores II (28/04/2014 10:36) - 3.48 -
- 3.49 -
- 3.50 -
Como Escribir los Programas C Ayudar al compilador para que pueda optimizar el cdigo
Minimizar el uso de variables globales Minimizar el uso de punteros Minimizar el uso de estructuras de control complejas No usar register Usar const No contradecir al sistema de tipos
- 3.51 -
Reducir el Nmero de Saltos Reduce la posibilidad de predicciones errneas Reduce el nmero de entradas en la BTB (Branch Target Buffer) Ejemplo: ebx = (A<B) ? C1 : C2;
cmp A, B ; condition jge L30 ; conditional branch mov ebx, CONST1 jmp L31 ; unconditional branch L30: mov ebx, CONST2 L31:
Pentium
xor ebx, ebx cmp A, B setge bl ;clear ebx ;When ebx = 0 or 1 ;OR the complement condition dec ebx ;ebx=00...00 or 11...11 and ebx, (CONST2-CONST1) ;ebx=0 or (CONST2-CONST1) add ebx, min(CONST1,CONST2)
Pentium II
move ebx,CONST1 cmp A, B cmovege ebx, CONST2
Compiladores II (28/04/2014 10:36) - 3.52 -
Evitar paradas por uso parcial de registros (Avoid partial register stalls).
Register Stall al acceder a EAX
MOV AX, 8 ADD ECX, EAX
- 3.53 -
Alinear cdigo
Loop entry labels should be 16-byte aligned when less than eight bytes away from a 16-byte boundary. Labels that follow a conditional branch should not be aligned. Labels that follow an unconditional branch or function call should be 16-byte aligned when less than eight bytes away from a 16byte boundary.
- 3.54 -
- 3.55 -