Professional Documents
Culture Documents
Optimizacin de Cdigo o o
Francisco Jos Ribadas Pena e PROCESADORES DE LENGUAJES 4o Informtica a ribadas@uvigo.es 18 de mayo de 2011
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
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 ...
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
MOV Ri, Rj
L1:
if C goto L2
L1: FIN:
L1: FIN:
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
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
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,...)
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: 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
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={<, >, =, ...}
A: array 0..100 of integer ... suma := 0; for i:=50 to 100 do suma := suma + A[i]; end for;
i = 50 (b) t1 = 200 t2 = A[t1] suma = suma + t2 i = i + 1 (b) t1 = t1 + 4 if i <= 100 goto (103) (a)
t1 sustituye a i