You are on page 1of 11

Tema 11.

Optimizacin de Cdigo o o
Francisco Jos Ribadas Pena e PROCESADORES DE LENGUAJES 4o Informtica a ribadas@uvigo.es 18 de mayo de 2011

c FJRP 2002 ccia pl

11.1 Introduccin o
Objetivo: Mejorar cd. objeto nal, preservando signicado del prograo ma
o velocidad de ejecucin tamao del programa n Factores a optimizar necesidades de memoria

Se sigue una aproximacin conservadora o No se aplican todas las posibles optimizaciones, solo las seguras Clasicacin de las optimizaciones o 1. En funcin de la dependencia de la aquitectura o Dependientes de la mquina: Aprovechan caracter a sticas espec cas de la mquina objetivo a asignacin de registros, uso de modos de direccionamiento o uso instrucciones especiales (IDIOMS) relleno de pipelines, prediccin de saltos, aprovechamiento o estrategias de mem. cach, etc.. e Independientes de la mquina: Aplicables en cualquier tipo de a mquina objetivo a ejecucin en tiempo de compilacin o o eliminacin de redundancias o cambios de rden de ejecucin, etc.. o o 2. En funcin del mbito de aplicacin o a o Optimizaciones locales: Aplicadas dentro de un Bloque Bsico a Slo estudian las instrucciones del B.B. actual o Optimizaciones globales: Aplicadas a ms de un B.B. a Consideran contenido y ujo de datos entre todos o parte de los B.B. Necesidad de recoger info. sobre los B.B. y sus interrelaciones Algoritmos de anlis global de ujo de datos a
o sobre cdigo fuente (programador/preprocesador) durante generacin cod. objeto o Posibilidades de optimizacin: o sobre Cdigo Intermedio o

11.2 Optimizaciones Locales


1. Ejecucin en tiempo de compilacin o o Precalcular expresiones constantes (con constantes o variables cuyo valor no cambia)
i=2+3 j=4 f = j + 2.5 a=b+c d=a-d e=b+c f=a-d

i=5 j=4 f = 6.5 a=b+c d=a-d e=a f=a-d

2. Reutilizacin de expresiones comunes o

3. Propagacin de copias o Ante instrucciones f = a, sustituir todos los usos de f por a


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

4. Eliminacin redundancias en acceso matrices o Localizar expresiones comunes en clculo direcciones de matrices a
Cod. fuente: A: array [1..4, 1..6, 1..8] of integer A[i,j,5] := A[i,j,6] + A[i,j,4] Sin optimizacin: o direc(A[i,j,5]) = direc(A[1,1,1]) + (i-1)*6*8 + (j-1)*8 + (5-1) direc(A[i,j,6]) = direc(A[1,1,1]) + (i-1)*6*8 + (j-1)*8 + (6-1) direc(A[i,j,4]) = direc(A[1,1,1]) + (i-1)*6*8 + (j-1)*8 + (4-1) Con optimizacin: o k := direc(A[1,1,1]) + (i-1)*6*8 + (j-1)*8 + (5-1) direc(A[i,j,5]) = k + 4 direc(A[i,j,6]) = k + 5 direc(A[i,j,4]) = k + 3

5. Tranformaciones algebraicas: Aplicar propiedades matemticas para simplicar expresiones a a) Eliminacin secuencias nulas o
x+0 1*x x/1 ...

x x x

b) Reduccin de potencia o Reemplazar una operacin por otra equivalente menos costosa o
x2 2*x 4*x, 8*x,... x/2 ...

x*x x + x (suma); x<<1 (despl. izq.) x<<2, x<<3,... x>>2

c) Reacondicionamiento de operadores Cambiar orden de evaluacin apliando propiedades conmut., o asociativa y distributiva
A := B*C*(D + E) MOV B,R0 MUL C,R0 MOV R0, t1 MOV D,R0 ADD E, R0 MUL t1,R0 MOV R0,A

A := (D + E)*B*C

MOV D,R0 ADD E,R0 MUL B,R0 MUL C,R0 MOV R0,A

5 instrucciones 0 temporales

11.2.1 Optimizacin de tipo Mirilla (Peephole o optimization)


Aplicable en cdigo intermedio o cdigo objeto. o o Constituye una nueva fase aislada. Idea Bsica a Se recorre el cdigo buscando combinaciones de instrucciones que o puedan ser reemplazadas por otras equivalentes ms ecientes. a Se utiliza una ventana de n instrucciones y un conjunto de patrones de transformacin (patrn, secuencias reemplazam.) o o Si las instrucciones de la ventana encajan con algn patrn se u o reemplazan por lo secuencia de reemplazmiento asociada. Las nuevas instrucciones son reconsideradas para las futuras optimizaciones Ejemplos: Eliminacin de cargas innecesarias o
MOV Ri, X MOV X, Rj

MOV Ri, Rj

Reduccin de potencia o Eliminacin de cadenas de saltos o


if C goto L1 goto L2

L1:

if C goto L2

L1: FIN:

if C goto L1 goto FIN ... ...

L1: FIN:

if not C goto FIN ... ...

11.3 Optimizaciones Globales


Optimizaciones entre Bloques Bsicos a Optimizaciones t picas: Identicacin de expresiones comunes entre bloques o afecta a la asignacin de registros entre B.B. o Optimizacin de llamadas a procedimientos o Optimizacion de bucles 11.3.1 Optimizacin Llamadas a Procedimientos o Llamadas a procedimientos son muy costosas cambios del mbito de referencias a gestin de Registros de Activacin o o paso de parmetros + asignacion de datos locales a Mejoras 1. Optimizar manejo de Reg. Activacin o minimizar copia de parmetros y no registros a salvar a uso almacenamiento esttico si no hay llamadas recursivas a 2. Expansin en l o nea.

Expansin en linea o Idea: Eliminar llamadas a proc., copiando el cuerpo del proc. en el lugar donde es llamado Evita sobrecarga asociada con llamadas a proc. Permite optimizaciones adicionales el cdigo llamado pasa a ser parte del cdigo que lo llama o o Limitaciones Aumenta uso de memoria util en proc. pequeos y llamados n desde pocos lugares si se llama en un unico lugar (es frecuente), no supone coste de espacio
adicional

No aplicable en proc. recursivos Ejemplos Directiva inline en C++ (en Java el compilador hace la expansin o de forma automtica) a En C puede simularse con macros #define

11.3.2 Optimizacin de Bucles o


Idea: Centrar optimizacin en partes ms usadas, no en todo el programa o a Optimizar bucles internos factorizacin de expresiones invariantes o Mejoras reduccin de intensidad y eliminacin de variables de induccin o o o 11.3.2.1 Factorizacin de expresiones invariantes o Expr. invariantes de bucle: expr. cuyo valor es constante durante toda la ejecucin del bucle o incuyen constantes y/o variables no modicadas en el cuerpo del bucle Idea: Mover expr. invariantes desde el cuerpo hasta la cabeza del bucle al sacarlas del bucle, pueden quedar dentro de otro bucle externo repetir
proceso

Ejemplos:
tmp1 = limite*2 - 1; while (i <= tmp1) { ... } A: array [1..900, 1..900, 1.900] of integer while (i <= (limite*2 - 1)) do { ... } for i:=1 to 900 do for j:=1 to 900 do for i:=1 to 900 do tmp1:= i*j; for j:=1 to 900 do tmp2:= dir(A[i][j]); for k:=1 to 900 do for k:= 1 to 900 do A[i][j][k]:= i*j*k; tmp2[k]:= tmp1*k; end for end for end for end for end for end for for i:= 1 to 900 do tmp3:= dir(A[i]); for j:= 1 to 900 do tmp1:= i*j; tmp2:= dir(tmp3[j]); for k:= 1 to 900 do tmp2[k]:= tmp1*k; end for end for end for

i, j y A[i][j] son constantes en el bucle de k

A[i] es constante en el bucle de j

En C.I. aparecern mas invariantes al incluir el clculo de desplazaa a mientos en arrays basados en el tamao de los datos (int 4, oat n 8,...)

11.3.2.2 Reduccin potencia y elimin. variables de o induccin o


a Variable de induccin (en un bucle): variable cuyo valor sistemticao mente se incrementa/decrementa en un valor constante en cada iteracin o Ejemplo: ndices en bucles for, contadores en bucles while Var. de induccin bsica: su unica denicin en el cuerpo del bucle es o a o de la forma i = i + s i0: valor inicial (antes del bucle) Caracterizada por: s: salto del bucle, constante o expr. invariante Idea: Si hay varias variables de induccin todas estn ligadas: o a se puede aplicar reduccin de potencia sobre expresiones con esas o vars. sustituyendo multiplicaciones/divisiones por sumas/restas se pueden sustituir todas por una unica var. de induccin o o Expresin de Induccin: dene una variable de induccin ligada, k. o o k = i * c + d con i: var. de induccin o c, d: constantes o expr. invariantes

i toma los valores: i0, i0 + s, i0 + 2s, ... la expr. de induccin tomar: o a i0 c + d, (i0 c + d) + s c, (i0 c + d) + 2(s c),... se incrementa s c en cada iteracin o
NOTA: accesos a array basados en vars. de induccin, provocan aparicin o o de vars. de induccin ligadas al generar C.I. o

1. REDUCCION INTENSIDAD EN VARS. DE INDUCCION Cada expr. de induccin k = i c + d que dena k se reemo plazar por un temporal ti a inicializado a i0 c + d, antes de bucle incrementado en un valor s c, al nal del cuerpo del bucle Asignar a k el valor de ti NOTA: Se podr aplicar propagacin de copias sobre k y ti a o Si k no se usa fuera del bucle se podr eliminar, dejando las a referencias equivalentes a ti Ejemplo: i := 1; t1 := 7; t2 := 2; while i<=1000 do { ... a := t1; b := t2; ... i := i + 1; t1 := t1 + 4; t2 := t2 + 2; }

i := 1 while i<=1000 do { ... a := 4*i + 3; b := 2*i; ... i := i + 1; }

i: var. induc. bsica (i0 = 1, s = 1) a a: expr. induc. (c = 4, d = 3) b: expr. induc. (c = 2, d = 0) t1 sustitute a a t2 sustitute a b
inicial = 1*4 + 3 salto = 1*4 inicial = 1*2 + 0 salto = 1*2

Se sustituyen multiplicaciones por sumas

2. ELIMINACION DE VARS. DE INDUCCION Se pueden eliminar todas las vars. de induccin ligadas del bucle, o dejando slo una de ellas. o Se aplicar sobre toda var. de induccin i usada unicamente a o en el clculo de otra var. de induccin j (calulada como a o j := i c + d) o en saltos condicionales. Nos quedaremos con j y eliminaremos i a) modicar comparaciones sobre i para usar equivalentes sobre j if i OP REL X goto ... if j OP REL X*c + d goto ...
OP REL={<, >, =, ...}

b) Eliminar toda instruccin que incluya a i o Ejemplo:


COD. FUENTE COD. INTERMEDIO

A: array 0..100 of integer ... suma := 0; for i:=50 to 100 do suma := suma + A[i]; end for;

(101) (102) (103) (104) (105) (106)

i = 50 t1 = i*4 t2 = A[t1] suma = suma + t2 i=i+1 if i <= 100 goto (102)

t1 var. ind. derivada de i


RED. POTENCIA ELIMIN. VAR IND. i

(101) (102) (103) (104) (105) (106) (107)

i = 50 (b) t1 = 200 t2 = A[t1] suma = suma + t2 i = i + 1 (b) t1 = t1 + 4 if i <= 100 goto (103) (a)

(101) (102) (103) (104) (105)

t1 = 200 t2 = A[t1] suma = suma + t2 t1 = t1 + 4 if t1 <= 400 goto (102)

(a) comparaciones a modicar (b) expr. con i a eliminar

t1 sustituye a i

You might also like