Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Optimizacin de Cdigo
Introduccin, criterios Tipos: independiente/dependiente, local/global Optimizacin independiente de la mquina
Transformaciones del cdigo Anlisis de flujo de control Tratamiento de bucles Introduccin al anlisis de flujo de datos y optimizacin global
Optimizacin de Cdigo
Fase cara y difcil Hay que establecer criterios para que no sea ms costosa que la propia ejecucin (aunque puede justificarse si se va a ejecutar el mismo programa muchas veces) Criterios para las transformaciones
Las transformaciones deben preservar el significado de los programas Una transformacin debe acelerar los programas en una cantidad mensurable Una transformacin debe valer la pena
3
Optimizacin de Cdigo
Obtener cdigo que se ejecuta mas eficientemente segn los criterios de:
Tiempo de ejecucin (optimizacin temporal) Espacio de memoria utilizado (optimizacin espacial)
Optimizacin de cdigo
Despus de la generacin de cdigo de todo el programa o de un elemento ejecutable de este (funcin, procedimiento, etc.) Dependiente del contexto
Regla 90/10
En general el 90% del tiempo de ejecucin de un programa es consumido por el 10% del cdigo La optimizacin debe ser aplicada sobre ese 10%. Estimacin conservadora del comportamiento del programa
5
Funcionamiento
Cmo?
Revisa el cdigo generado a varios niveles de abstraccin y aplica transformaciones segn nivel de abstraccin Representaciones de cdigo intermedio de ms a menos abstractas rbol sintctico abstracto
Optimizar subexpresiones redundantes, eliminar cdigo inalcanzable, reduccin de coste, etc.
Tuplas o cuadruplas
Optimizar el uso de registros o de las variables temporales
Ensamblador/Cdigo mquina
Convertir saltos a saltos cortos Reordenar instrucciones de cdigo mquina Utilizar instrucciones especficas
Regla de oro
Mantener el cdigo correcto, despus si es realmente necesario entonces optimizarlo
Tipos de optimizacin
Momento de la compilacin
Independiente de mquina Dependiente de mquina
Transformaciones en cdigo intermedio: Reduccin de coste, expresiones comunes, propagacin de constantes, Asignacin de registros Ordenacin/seleccin de instrucciones
2. Global
Fases de la optimizacin
Cadena de caracteres Cadena de tokens rbol sintctico rbol de sintaxis abstracta con anotaciones
Cambiar Algoritmos Mejorar bucles Hacer perfiles de rendimiento Scanner Parser Anlisis Semntico Generacin de Cdigo intermedio Eliminacin Local de Redundancias Eliminacin Global de Redundancias Mejora de bucles Generacin de Cdigo final Ordenacin de Intrucciones Prelimiar Seleccin de registros Ordenacin de instrucciones final y/o seleccin Optimizacin de mirilla 9
Front End
Independiente
Grafo de flujo de control con pseudoinstruciones en bloques bsicos Grafo del flujo de control modificado Grafo del flujo de control modificado Grafo del flujo de control modificado Lenguaje casi ensamblador
Back End
Dependiente
Lenguaje ensamblador modificado Lenguaje ensamblador modificado Lenguaje ensamblador modificado Lenguaje ensamblador final
Optimizacin Independiente
Transformaciones sobre el cdigo intermedio
Simplificaciones algebraicas Eliminar cdigo inalcanzable Folding Reduccin de subexpresiones comunes Propagacin de copias y constantes
x := 1 i := 1
Bloque Bsico
Nodo de un grafo de flujo Secuencia de sentencias consecutivas. El flujo de control lo recorre de principio a fin
L: x := x * x i := i + 1 if i < 10 goto L
11
L: t := 2 * x w := t + x if w > 0 goto L
(3) nunca puede ser ejecutada sin haberse ejecutado (2) antes
(3) podra cambiarse a w := 3 * x Podra elminarse (2)?
12
Bloque Bsico
Ejemplo:
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; 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;
INCORRECTO
CORRECTO
13
Simplificacin Algebraica
Algunas sentencias pueden eliminarse
x := x + 0 x := x * 1
14
Ej.:
if (DEBUG) { printf() }
15
16
17
Ejemplo de Ensamblamiento
Expresin: rbol:
+ 3 5 + 6 -4 A * 10
18
3-(5+6)+4-A*10
*
10
Resultado: -4-(A*10)
Mtodo:
Detectar las subexpresiones iguales y que las compartan diversas ramas del rbol Trabajar con un grafo acclico dirigido (DAG)
19
read x fa := 1
t2, x
x
1 0
Construccin:
Tabla de constantes y variables Funcion diccionario: nodo(id) Funcin diccionario: nodo(op, id1, id2) Listas de etiquetas de cada nodo
20
2.
si nodo(y) est vaco, crear hoja y asignar y a nodo(y). Lo mismo para nodo(z) N=buscar nodo(op,y,z). Si no hay, crearlo nuevo si nodo (y) est vaco, crear hoja y asignar y a nodo(y) N=nodo(y)
si s es x = y
1.
2.
t3 > t2, x
x 1 0
21
t2, x
x
1 0
t1, t2 +
x 1 t1=x+1 t2=t1 x=t1*t1 t3=x
Cuestiones de reconstruccin
Informacin adicional: variables utilizadas en el bloque cuantas referencias de cada valor sentencias cuya asignacin puede usarse fuera del bloque
22
Primero las constantes, despus variables ordenadas alfabticamente, las variables indexadas y las subexpresiones
X = C+3+A+5 Y = 2+A+4+C
X = 3+5+A+C Y = 2+4+A+C
23
A[i]=10 Se asocia 10 a A[i] aun no sabiendo el valor de i. En el caso de hacer una asignacin a cualquier elemento de A se deshace la asociacin.
24
Extensiones
Problema
Extender la propagacin fuera de bloques bsicos Hay que realizar un anlisis del flujo de datos (optimizacin global) y es complejo Ejemplo:
i=0; loop: i=i+1 if (i<10) goto loop;
25
G2R=PI/180
PI=3.14
PI=3.14 G2R=3.14/180
PI=3.14 G2R=0.017
Ejemplo:
a := 5 x := 2 * a y := x + 6 t := x * y
a := 5 x := 10 y := 16 t := x << 4
26
27
Entonces
La sentencia w := valor est muerta y puede eliminarse: no es parte del resultado del programa
28
29
30
31
32
33
34
35
36
37
38
39
40
41
f := a + a g := 6 * f
Resultado final
42
Se puede aplicar tanto al cdigo intermedio como al cdigo objeto En general, se plantea con un conjunto de reglas de reemplazamiento i1, , in j1, , jm Cada mejora puede brindar oportunidades para mejoras adicionales
43
Cdigo inalcanzable
Se puede eliminar una instruccin sin etiqueta que siga inmediatamente a un salto incondicional
inc a
45
= = = =
0; 0; 0; 0;
La expansin de un bucle puede ser muy costosa en espacio Hay que poner un criterio heurstico para decidir si se aplica la expansin
47
rbol de dominacin
No ms de 1 dominador inmediato por nodo
3
50
sin(a) es una operacin invariante del bucle que puede pasar de sin(a) calcularse de n veces a una:
i:=1 t1:=sin(a) L1: t2:=i*t1 c:=t2; i:=i+1 if i<n goto L1
51
52
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
Extensin
Cuando no se entra en el bucle se calculan sus operaciones invariantes. La solucin es evaluar antes la condicin de salida del bucle
53
convertir en
for(i=1,j=3;i<10;++i,j+=3) a[i]=j;
Problemas a resolver
Detectar las invariantes de bucle (ya esta solucionado) Detectar las variables inductivas y relacionadas
i:=i+k i es variable de induccin bsica (k invariante) j:=c*i+d j est en la familia de i (c,d invariantes)
54
56
Optimizacin Global
Grafo del flujo de ejecucin
Antes de realizar una optimizacin global es necesario crear el grafo de flujo de ejecucin El grafo de flujo de ejecucin representa todos los caminos posibles de ejecucin del programa La informacin contenida en el grafo es til para
el programador el optimizador
57
Optimizacin Global
La optimizacin global a partir del anlisis del flujo de datos permite:
Una propagacin de constantes fuera del bloque bsico. Eliminacin del cdigo no utilizado Una mejor asignacin de los registros.
58
Optimizacin Global
Parte de la construccin del grafo de flujo de ejecucin Ejemplo
int fact(int n) { int r;
r=1; i=1; while (i<=n) { r=r*i; ++i; } return r;
r=1 i=1 while (i<=n) bloque bsico bloque bsico
bloque bsico
return r;
59
Variables vivas
60
X := 3 Y := Z * W Q := X + Y
X := 3 Y := Z * W Q := 3 + Y Y := Z * W Q := 3 + Y
61
Correcto
Incorrecto
62
valor
# c *
interpretacin
Sentencia no alcanzable x = constante c Desconocido si x es constante
65
X=3 X=3
Y := Z + W X := 4
B>0
X=4
A := 2 * X
X=* X=*
X=3
66
Uso de la Informacin
Una vez calculada la informacin global de constantes para x, optimizacin:
En cada punto donde x tenga la etiqueta c, se puede reemplazar por la constante
67
Funciones de Transferencia
Suponiendo que la sentencia s tiene como predecesoras p1,,pn
Reglas de entrada: Cin(x,s). Combinan informacin de entrada de varios arcos del grafo de flujo de control
X=? X=?
s
X=*
X=? X=*
69
s
X=#
Cout(x, s) = # if Cin(x, s) = #
73
x := c
X=c
Cout(x, x := c) = c if c is a constant
74
x := f()
X=*
Cout(x, x := f()) = *
75
y := . . .
X=a
Cout(x, y := ) = Cin(x, y := ) if x y
76
Un Algoritmo
1. Para cada sentencia s de entrada al programa, Cin(x, s)
:= * 2. En el resto: Cin(x, s) := Cout(x, s) := # 3. Repetir
Hasta que todos los puntos satisfagan las reglas o no cambia A causa de los ciclos, valores iniciales en todos los puntos El valor inicial # inicializa a no alcanzable cada punto (condicin de partida) Garantizar fin: limitar nmero mximo de cambios
77
Ejemplo 1
X := 3
X=# 3
Y := Z + W
B>0
X=# 3
A := 2 * X A<B
X=# 3
X=# 3 X=# 3
Ejemplo 2
X := 3 B>0 Y := Z + W Y := 0
A := 2 * X X := 4 A<B
79
Ejemplo 2
X := 3
X=# 3
Y := Z + W
B>0
X=# 3
A := 2 * X X := 4 if A < B
X=# 4 *
Despus de propagar constantes, X := 3 , la variable X est muerta (si es el grafo de control de flujo)
81
Variables vivas
La variable x est viva en la sentencia s si
Hay una sentencia s que usa x Hay camino de s a s sin asignaciones a x
Esta propiedad puede expresarse como informacin transferida entre sentencias adyacentes
Ms simple que propagacin de constantes: true or false
82
X = true
X=?
X=?
X = true
X=?
83
:= x +
X=?
x := e
X=?
Lin(x, x := e) = false si e no es x
85
s
X=a
86
Algoritmo
1. Asignar L() := false inicialmente 2. Repetir hasta que todas las variables s satisfacen reglas
1-4
Tomar s donde no se cumplen 1-4 y aplicar la regla apropiada
Terminacin:
Limitar cambios de valor de false a true, pero no a la inversa (un cambio) Al finalizar, es inmediato eliminar el cdigo muerto
87
Ejemplo
X := 3
L(X) = false L(X) = false true L(X) = false true L(X) = false true Y := 0 L(X) = false true
B>0
L(X) = false true L(X) = false L(X) = false true L(X) = false true
88
Sentencia muerta
X := 4 A<B
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
89
Usar una instruccin ms eficiente que reemplace una secuencia de instrucciones. Ejemplo:
Add (R3), 1, (R3)
Un Pentium es capaz de ejecutar en paralelo un clculo con enteros con otro de flotantes Evitar que la siguiente instruccin dependa del resultado de la anterior para que no se produzca un fallo en el pipe-line Incluso puede ser interesante aadir NOPs para evitar los fallos de
pipe-line
Seleccin de instrucciones
Seleccin de instrucciones:
Usar una instruccin ms eficiente que reemplace una secuencia de instrucciones Ejemplo:
Mov Add Mov R2, (R3) R2, #1, R2 (R3), R2
Reordenar las instrucciones para maximizar la ejecucin paralela de instrucciones Alinear los datos
91
Ejemplos Alineacin
Alinear datos
Align 8-bit data on any boundary. Align 16-bit data to be contained within an aligned 4-byte word. Align 32-bit data on any boundary which is a multiple of four. Align 64-bit data on any boundary which is a multiple of eight. Align 80-bit data on a 128-bit boundary (that is, any boundary which is a multiple of 16 bytes).
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.
92
Asignacin de Registros
Mquinas con un solo registro (acumulador)
Cdigo mquina tpico
Todas las operaciones trabajan sobre el acumulador Cargar X Guardar X Operar X Ejemplo: T=X+Y Cargar X Sumar Y Guardar T
La optimizacin ser reducir el nmero de operaciones del carga y descarga del acumulador
93
Register Assignment
Cuando se selecciona el registro para guardar una variable
94
Carga/Descarga de Registros
Minimizar el nmero de operaciones de carga y descarga
Que registro se ha de descargar a memoria?
No guardar en memoria los operandos izquierdos de operaciones no conmutativas (ej. / -) siempre que haya otra posibilidad Guardar en memoria el valor que ms se tardar en utilizar en el programa
Se usan descriptores
Descriptores de registros: qu variables almacenan Descriptores de variables: en qu sitios se encuentran
resultado: obtenreg(x,y,z)
97
Obtencin de registros
obtenreg(x:=y op z):
1. usar el registro de y si est en un registro que no tiene otra variable, y adems y no est viva ni tiene uso posterior. Si no: 2. usar un registro vaco si hay. Si no: 3. usar un registro ocupado (spill) si op requiere que x est en un registro o si x tiene uso posterior. Actualizar el descriptor de registro. Si no: 4. usar la posicin de memoria de x
98
t1=a-b
Cdigo
Descriptores Reg
R0 con t1 R1 con t2 R1 con t3 R1 con t4
Cdigo
MOV a, R0 SUB b, R0 MOV c, R1 ADD d, R1 MOV R1, R2 MULT R0, R2 MOV R2, R3 ADD e, R3 MOV R3, f //SALVAR R1-R4
Descriptores Reg
R0 con t1 R1 con t2 R2 con t3 R3 con t4
99
t1=a-b
Las variables temporales no se distinguen
cos te =
bloques B en L
100