Title: Tema 3' Optimizacin de Cdigo
1Tema 3. Optimizaci贸n de C贸digo
2Generaci贸n de C贸digo y Optimizaci贸n
- Generaci贸n de c贸digo
- Se realiza mientras se analiza el programa
- Libre del contexto
- Optimizaci贸n
- Se realiza despu茅s de la generaci贸n de c贸digo de
todo el programa o de un elemento ejecutable del
programa (funci贸n, procedimiento, etc). - Dependiente del contexto
Programa fuente
Analizador lexicogr谩fico, sint谩ctico y
sem谩ntico
Se ejecuta todo junto. Mientras se analiza se
genera c贸digo
Generador de C贸digo
Optimizador
Programa objeto
3Optimizaci贸n
- Objetivo
- Obtener c贸digo que se ejecuta m谩s eficientemente
seg煤n los criterios - Tiempo de ejecuci贸n (optimizaci贸n temporal)
- Espacio de memoria utilizado (optimizaci贸n
espacial) - Funcionamiento
- Revisa el c贸digo generado a varios niveles de
abstracci贸n y realiza las optimizaciones
aplicables al nivel de abstracci贸n - Representaciones de c贸digo intermedio de m谩s a
menos abstractas - 脕rbol sint谩ctico abstracto
- Optimizar subexpresiones redundantes, reducci贸n
de frecuencia, etc. - Tuplas o cuadruplas
- Optimizar en uso de los registros o de las
variables temporales - Ensamblador/C贸digo m谩quina
- Convertir saltos a saltos cortos
- Reordenar instrucciones
4Optimizaci贸n
- Funcionamiento (continuaci贸n)
- Representaciones de c贸digo para extraer
informaci贸n - Grafos.
- Condiciones que se han de cumplir
- El c贸digo optimizado se ha de comportar igual que
el c贸digo de partida excepto por ser m谩s r谩pido o
ocupar menos espacio. - Hay que buscar transformaciones que no modifiquen
el comportamiento del c贸digo seg煤n el
comportamiento definido para el lenguaje de
programaci贸n. Ejemplo - Si no se ha definido el orden de evaluaci贸n de
los operandos la siguiente optimizaci贸n es v谩lida - B2A(Acd)
- Pasar a
- Acd
- BA3
5Tipos de Optimizaci贸n
- Optimizaci贸n independiente de m谩quina
- Reducci贸n de frecuencia
- Optimizaci贸n dependiente de m谩quina
- Asignaci贸n de registros
- Reordenaci贸n de las instrucciones
- Optimizaci贸n local
- Reducci贸n de potencia
- Folding
- Propagaci贸n de constantes
- Optimizaci贸n global
- an谩lisis del grafo del flujo de ejecuci贸n
- Optimizaci贸n de bucles
- Loop unrolling
- Reducci贸n de frecuencia
- Reducci贸n de potencia
6Optimizaci贸n Local
- Las optimizaciones locales se realizan sobre el
bloque b谩sico - Optimizaciones locales
- Folding
- Propagaci贸n de constantes
- Reducci贸n de potencia
- Reducci贸n de subexpresiones comunes
- Bloque B谩sico
- Un bloque b谩sico es un fragmento de c贸digo que
tiene una 煤nica entrada y salida, y cuyas
instrucciones se ejecutan secuencialmente.
Implicaciones - Si se ejecuta una instrucci贸n del bloque se
ejecutan todas en un orden conocido en tiempo de
compilaci贸n. - La idea del bloque b谩sico es encontrar partes del
programa cuyo an谩lisis necesario para la
optimizaci贸n sea lo m谩s simple posible.
7Bloque B谩sico (ejemplos)
- Ejemplos (separaci贸n err贸nea)
- for (i1ilt10i)
- bbai
- cbi
-
- a3
- b4
- goto l1
- c10
- l1 d3
- e4
- Separaci贸n correcta
- for (i1ilt10i)
- bbai
- cbi
-
- a3
- b4
- goto l1
BB1 i1 BB2 ilt10 BB3 bbai cbi i BB4
a3 b4 goto l1 BB5 c10 BB6 l1 d3 e4
8Ensamblamiento (Folding)
- El ensamblamiento es remplazar las expresiones
por su resultado cuando se pueden evaluar en
tiempo de compilaci贸n (resultado constante). - Ejemplo A23AC -gt A5AC
- Propagaci贸n de constantes
- Desde que se asigna a una variable un valor
constante hasta la siguiente asignaci贸n, se
considera a la variable equivalente a la
constante. - Ejemplo Propagaci贸n Ensamblamiento
- PI3.14 -gt PI3.14 -gt PI3.14
- G2RPI/180 -gt G2R3.14/180 -gt G2R0.017
- PI y G2R se consideran constantes hasta la
pr贸xima asignaci贸n. - Estas optimizaciones permiten que el programador
utilice nombres para las constantes sin
introducir ineficiencias.
9Extensiones
- Variables indexadas
- Se asocian constantes a expresiones de acceso a
variables indexadas. Ejemplo - Ai10
- Se asocia 10 a Ai aun no sabiendo el valor de
i. - En el caso de hacer una asignaci贸n a cualquier
elemento de A se deshace la asociaci贸n. - Usar las propiedades conmutativa y asociativa.
- Ejemplo aplicando la propiedad conmutativa se
reduce - AB2C3
- ABC5
10Extensiones
- Extender la aplicaci贸n fuera del bloques b谩sicos
- Hay que realizar un an谩lisis del flujo de
ejecuci贸n y es complejo. Ejemplo - i0
- loop
- ii1
- if (ilt10) goto loop
- Se transforma err贸neamente en
- i0
- loop
- i1
- if (1lt10) goto loop
11Implementaci贸n del Folding
- Implementaci贸n durante el an谩lisis
sint谩ctico/sem谩ntico o creaci贸n del 谩rbol
sint谩ctico. - Se a帽ade el atributo de constante temporal a los
s铆mbolos no terminales y a las variables de la
tabla de s铆mbolos. - Se a帽ade el procesamiento de las constantes a las
reglas de an谩lisis de expresiones. - Implementaci贸n posterior
- Buscar partes del 谩rbol donde se puede aplicar la
propiedad conmutativa - Buscar las constantes y operarlas
- Reconstruir el 谩rbol
12Ejemplo de Folding
- Expresi贸n 3-(56)4-A10
- 脕rbol
- -
- -
- - -
- - 3
- -
- - 5
- - 6
- - 4
- -
- - A
- - 10
- T茅rminos
- 3
- -5
- -6
- 4
- -(A10)
13Implementaci贸n de la Propagaci贸n de Constantes
- Implementaci贸n posterior
- Separar el 谩rbol en bloques b谩sicos
- Cada bloque b谩sico ser谩 una lista de expresiones
y asignaciones - Para cada bloque b谩sico
- Inicializar el conjunto de definiciones a
conjunto vac铆o. - Definici贸n (variable,constante)
- Procesar secuencialmente la lista de expresiones
y asignaciones - Para expresi贸n y asignaci贸n
- Sustituir las apariciones de las variables que se
encuentran en el conjunto de definiciones por sus
constantes asociadas. - Para asignaciones
- Eliminar del conjunto de definiciones la
definici贸n de la variable asignada - A帽adir la definici贸n de la variable asignada si
se le asigna una constante
14Ejemplo de Separaci贸n en Bloques B谩sicos
- Fun
- -
- - gt
- - f
- - x
- - y
- - InstrComp
- -
- -
- - i
- - 0
- -
- -
- - b
- - 5
- -
- - while
- - lt
- - i
Fun f(x,y)gt i0 b5
while (iltx) print(ib)
ii1 xb
i0 b5
iltx
print(ib) ii1
15Eliminaci贸n de subexpresiones redundantes.
- Las subexpresiones que aparecen m谩s de una vez se
calculan una sola vez y se reutiliza el
resultado. - Idea Detectar las subexpresiones iguales y que
las compartan diversas ramas del 谩rbol. Problema
Hay que trabajar con un grafo ac铆clico. - Dos expresiones pueden ser equivalentes y no
escribirse de la misma forma AB es equivalente a
BA. Para comparar dos expresiones se utiliza la
forma normal - Se ordenan los operandos Primero las constantes,
despu茅s variables ordenadas alfab茅ticamente, las
variables indexadas y las subexpresiones. Ejemplo - XC3A5 -gt X 35AC
- Y2A4C -gt Y24AC
- divisiones y restas se ponen como sumas y
productos para poder conmutar - A-B -gt A (-B)
- A/B -gt A (1/B)
16Implementaci贸n
- Primero se aplica el ensamblamiento y la
propagaci贸n de constantes. - Despu茅s se reordena el 谩rbol sint谩ctico hasta
obtener la forma normal. - Se inicia la eliminaci贸n de las subexpresiones
redundantes. - Hay que considerar las asignaciones que pueden
convertir una subexpresion redundante en no
redundante. Ejemplo - QAB
- AQ22
- C1ABP
-
- Ejemplo de eliminaci贸n de subexpresiones
- J2D3
- DD2
- JJD
AB no es redundante por la asignaci贸n
17Optimizaciones Dentro de Bucles
- La optimizaci贸n de bucles es muy importante por
las mejoras en tiempo de ejecuci贸n que se
obtienen - Estrategias de optimizaci贸n dentro de bucles
- Expansi贸n de bucles (loop unrolling)
- Reducci贸n de frecuencia (frequency reduction)
- Reducci贸n de potencia (strength reduction)
18Expansi贸n de bucles(loop unrolling)
- La expansi贸n de bucles solo se puede aplicar a
los bucles cuyo n煤mero de iteraciones se conoce
en tiempo de compilaci贸n. Ejemplo - Se puede aplicar a los bucles
- for i1 to 10 do
- No se puede aplicar a los bucles
- for ia to b do
- La expansi贸n de un bucle puede ser muy costosa en
espacio. Hay que poner un criterio heur铆stico
para decidir si se aplica la expansi贸n. - Se puede aplicar una expansi贸n parcial en la que
sigue existiendo el bucle, pero cada iteraci贸n
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
19Reducci贸n de frecuencia. (frequency reduction)
- La reducci贸n de frecuencia detecta las
operaciones invariantes de bucle y las calcula
una 煤nica vez delante del bucle. Ejemplo - for i1 to n do cisin(a)
- sin(a) es una operaci贸n invariante del bucle que
puede pasar de calcularse n veces a una con la
siguiente transformaci贸n - tmpsin(a)
- for i1 to n do citmp
- S贸lo las operaciones que cumplen
- Su 煤nico efecto es el c谩lculo del resultado
- El resultado solo depende de los operandos.
- se pueden considerar como operaciones
invariantes de bucle. - Ejemplo
- Invariantes . -, , / , sin, ln
- No invariantes printf, getchar, , random
20Implementaci贸n de la Reducci贸n de Frecuencia
- Pasos
- Detectar todas las variables que se modifican en
el bucle. - Marcar todas las operaciones no invariantes
- Aplicar la siguiente regla recursiva para
detectar las operaciones invariantes - Una operaci贸n es invariante si sus operandos son
invariantes. - Asociar a cada expresi贸n invariante una variable
temporal. - Sustituir en el bucle las operaciones invariantes
por las correspondientes variables. - A帽adir delante del bucle la asignaci贸n de la
expresi贸n invariante a su variable temporal. - Problema del m茅todo anterior
- Cuando no se entra en el bucle se calculan sus
operaciones invariantes. La soluci贸n es evaluar
antes la condici贸n de salida del bucle.
21Reducci贸n de potencia(strength reduction)
- Se busca sustituir operaciones costosas por otras
mas simples. Ejemplo - sustituir productos por sumas.
- a2a
- aaa
- Evitar la operaci贸n append ()
- Alength(s1 s2)
- convertirlo en
- Alength(s1)length(s2)
- Sustituir productos entre variables inductivas e
invariantes de bucle por sumas - for(i1 ilt10i) ai3i
- convertir en
- for(i1,j3ilt10i,j3) aij
- Problemas ha resolver
- Detectar las invariantes de bucle
- Ya esta solucionado
- Detectar las variables inductivas
22Variables Inductivas
- Una variable V es inductiva cuando la 煤nica forma
en que se modifica su c贸digo es VVK, 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 VC, donde C es
una invariante de bucle. - Se sustituir谩 VC por T
- Se inicializa T despu茅s de la inicializaci贸n de V
como TVC (solo se ejecuta al entrar en el
bucle) - Al final de cada iteraci贸n se a帽ade TTCK
23Optimizaci贸n Global
- Grafo del flujo de ejecuci贸n
- Antes de realizar una optimizaci贸n global es
necesario crear el grafo de flujo de ejecuci贸n. - El grafo de flujo de ejecuci贸n representa todos
los caminos posibles de ejecuci贸n del programa. - La informaci贸n contenida en el grafo es 煤til para
- el programador y
- el optimizador
- La optimizaci贸n global a partir del an谩lisis del
grafo del flujo de ejecuci贸n permite - Una propagaci贸n de constantes fuera del bloque
b谩sico. - Eliminaci贸n del c贸digo no utilizado
- Una mejor asignaci贸n de los registros.
- Problema la optimizaci贸n global es muy costosa
en tiempo de compilaci贸n
24Construcci贸n del Grafo del Flujo de Ejecuci贸n
- Tipos de grafo
- Orientado a procedimiento/funci贸n
- Grafo de llamadas
- Ejemplo
- int fact(int n)
- int r
- r1
- i1
- while (iltn)
- rri
- i
-
- return r
bloque b谩sico
r1 i1
bloque b谩sico
while (iltn)
bloque b谩sico
rri i
return r
bloque b谩sico
25Construcci贸n del Grafo del Flujo de Ejecuci贸n
- Pasos
- Dividir el programa en bloques b谩sicos
- Se representa el programa en un c贸digo intermedio
donde queden expl铆citamente representados los
saltos condicionales e incondicionales. - Un bloque b谩sico ser谩 cualquier trozo de c贸digo
que no contenga saltos ni etiquetas en su
interior (es posible tener etiquetas al inicio
del bloque y saltos al final). - En el grafo, los v茅rtices representan los bloques
b谩sicos y las aristas representan los saltos de
un bloque b谩sico a otro. - Detecci贸n de c贸digo no utilizado
- El c贸digo no utilizado son los bloques b谩sicos
donde no llega ninguna arista.
26An谩lisis del Grafo del Flujo de Ejecuci贸n
- Hay que considerar como la informaci贸n sobre las
variables y expresiones se propaga a trav茅s del
grafo. - Problemas resueltos durante el an谩lisis del grafo
- expresiones disponibles (al seguir la ejecuci贸n
sigue siendo v谩lido el resultado obtenido) - Alcance de las definiciones
- variables vivas
- expresiones muy utilizadas
- Para la resoluci贸n de los problemas anteriores se
utiliza la idea de punto entre instrucciones o
bloques b谩sicos.
r1 i1
Puntos
while (iltn)
27Expresiones Disponibles(Available expresions)
- El problema de las expresiones disponibles
consiste en determinar que expresiones est谩n
disponibles al inicio de cada bloque - Algoritmo
- Para cada bloque b谩sico se definen 4 conjuntos
- AE_TOP(BB) la expresi贸n est谩 disponible en el
punto que precede a BB - AE_KILL(BB) la expresi贸n ya no ser谩 v谩lida
despu茅s de la ejecuci贸n de BB por que se ha
modificado alg煤n operando. - AE_GEN(BB) Se ha evaluado la expresi贸n en BB sin
que se modifiquen sus oper谩ndos. - AE_BOT(BB) La expresi贸n est谩 disponible justo
despu茅s de la ejecuci贸n de BB - Ecuaci贸n para las expresiones disponibles
- AE_BOT(BB)(AE_TOP(BB)-AE_KILL(BB)) 脠 AE_GEN(BB)
- AE_TOP(BB) 脟p precedente de BB AE_BOT(P)
28Alcance de las Definiciones(reaching definitions)
- El valor de una variable se define cuando se le
asigna un valor. - Este valor definido se pierde cuando se realiza
una nueva asignaci贸n. - El problema del alcance de las definiciones es el
mismo que el problema de las expresiones
disponibles, pero en el caso de las variables. - Ecuaciones
- RD_BOT(BB)(RD_TOP(BB)-RD_KILL(BB)) 脠
- RD_GEN(BB)
- RD_TOP(BB) 脟p precedente de BB RD_BOT(P)
29Variables Vivas(live variables)
- Una variable esta viva en un punto p cuando su
valor es requerido para un camino de ejecuci贸n
que pasa por p. - Un camino requiere el valor de una variable
cuando hay una asignaci贸n de la variable al
principio y una lectura al final. - Uso delimitar exactamente en que partes del
c贸digo es necesaria una variable. - Ecuaciones
- LV_TOP(BB)(LV_BOT(BB)-LV_DEF(BB)) 脠
- LV_USE(BB)
- LV_BOT(BB) 脠s sucesor de BB LV_TOP(S)
30Expresiones muy Utilizadas(Very Busy Expression)
- Una expresi贸n es muy utiliza en un punto p cuando
el valor de la expresi贸n se requiere antes que el
valor de cualquiera de sus t茅rminos a lo largo de
cualquier camino que empieza en p. - Ecuaciones
- VBE_TOP(BB)(VBE_BOT(BB)-BVE_DEF(BB)) 脠
BVE_USE(BB) - VBE_BOT(BB) 脟s sucesor de BB VBE_TOP(S)
31Algoritmos de An谩lisis del Flujo de Ejecuci贸n
- Tipos
- Algoritmos basados en la estructura de los bucles
- Son r谩pidos
- Hay que reducir el grafo a bucles sin saltos que
entren en medio del bucle. Los programas
estructurados son reducibles. - Algoritmos iterativos
- Son lentos pero gen茅ricos
- Tipos
- lista de trabajos
- round robin
32Aplicaciones a la Optimizaci贸n de Programas
- expresiones disponibles (al seguir la ejecuci贸n
sigue siendo v谩lido el resultado obtenido) - Eliminar expresiones redundantes
- Alcance de las definiciones
- Reutilizar las copias en registro de los valores
de las variables. - Propagaci贸n de constantes
- Reducci贸n de frecuencia
- variables vivas
- Reutilizar el espacio de variables.
- Eliminar variables innecesarias
- expresiones muy utilizadas
- optimizar la asignaci贸n de registros
33Ejemplo Optimizaci贸n Global
- IF A(1)lt0 Jgt0 THEN L1 ELSE L2
- J2
- FOR K1 STEP 2 UNTIL J DO
- BEGIN
- A(K1)A(K)A(K1)
- IJ
- LKI
- END
A(1)lt0
Jgt0
L2
L1
J2 K1
KltJ
A(K1)A(K)A(K1) IJ LKI KK2
34Ejemplo de Optimizaci贸n GlobalVariables Vivas
A(1),J
A(1)lt0
J
脝
Jgt0
脝
L2
L1
脝
脝
J2 K1
J,K
KltJ
J,K
A(K1)A(K)A(K1) IJ LKI KK2
J,K
35Ejemplo de Optimizaci贸n GlobalEliminaci贸n de
Variables Innecesarias
A(1),J
A(1)lt0
J
脝
Jgt0
脝
L2
L1
脝
J2 K1
J,K
KltJ
J,K
A(K1)A(K)A(K1) IJ LKI KK2
J,K
Se puede eliminar L e I Las A(K),A(K1) no se
eliminan pues no se han podido considerar en el
c谩lculo de variables vivas
36Ejemplo de Optimizaci贸n GlobalPropagaci贸n de
Constantes
A(1),J
A(1)lt0
Eliminar Jgt0 por no utilizarse y saltar al
mismo bloque b谩sico Eliminar A(1)lt0 despu茅s de
eliminar Jgt0
Jgt0
J2 K1
J2
Klt2
A(K1)A(K)A(K1) KK2
Se puede expandir el bucle
37Ejemplo de Optimizaci贸n GlobalExpandir el Bucle
J2 K1
A(11)A(1)A(11) A(21)A(2)A(21)
Eliminar J y k por que no se utilizan y realizar
los c谩lculos entre constantes
A(2)A(1)A(2) A(3)A(2)A(3)
38Optimizaci贸n Dependiente de M谩quina
- La optimizaci贸n dependiente de m谩quina pretende
aprovechar las caracter铆sticas espec铆ficas de la
m谩quina para acelerar la ejecuci贸n del programa - Considerar los ciclos de reloj que gasta cada
instrucci贸n de c贸digo m谩quina. - Utilizar desplazamientos de bits para multiplicar
y dividir. - Para poner un registro a cero utilizar la
instrucci贸n XOR reg,reg que accede menos a
memoria - Utilizar saltos relativos de 8 o 16 bits para
acceder menos a memoria. - Alinear instrucciones/Datos para que se acceda en
un 煤nico ciclo de memoria. - Combinar operaciones en una misma instrucci贸n.
- Utilizar el direccionamiento con pre- y
post-incremento.
39Optimizaciones Dependientes de M谩quina
- Sacar provecho de todas las formas de
direccionamiento del procesador. - Utilizar acceso indexado para los arrays.
- Reordenar las instrucciones para paralelizar su
ejecuci贸n. - Un Pentium es capaz de ejecutar en paralelo un
c谩lculo con enteros con otro de flotantes. - Evitar que la siguiente instrucci贸n dependa del
resultado de la anterior para que no se produzca
un fallo en la pipe-line. Incluso puede ser
interesante a帽adir NOPs para evitar los fallos de
pipe-line. - Optimizar el uso de los registros del procesador.
- Es especialmente importante en los procesadores
RISC. - Considerar el tama帽o de la cache del procesador.
40Asignaci贸n de Registros
- M谩quinas con un solo registro (acumulador)
- C贸digo m谩quina t铆pico. Todas las operaciones
trabajan sobre el acumulador - Cargar X
- Guardar X
- Operar X
- Ejemplo TXY
- Cargar X
- Sumar Y
- Guardar T
- La optimizaci贸n ser谩 reducir el n煤mero de
operaciones del carga y descarga del acumulador.
41Generar C贸digo para Maquina con un Acumulador a
partir de Notaci贸n Polaca
- Ideas
- Utilizar una pila de variables temporales donde
se guardan los operandos. - Mirar de eliminar las operaciones de
carga/descarga innecesarias. - Ejemplo XA(BCD)
- Notaci贸n polaca inversa
- X A B C D
- C贸digo generado sin optimizar
- Cargar B
- Mult C
- Guardar T1 BC
- Cargar T1
- Sumar D
- Guardar T2 BCD
- Cargar A
- Sumar T2
- Guardar T3 A(BCD)
- Cargar T3
- Guardar X
42Optimizaci贸n
- Ideas
- Retrasar en todo lo posible las instrucci贸n
Guardar - Reutilizar el contenido del acumulador
- Sacar provecho de la conmutatividad de las
operaciones - Ejemplo
Cargar B Mult C BC Sumar D BCD Guardar T2
BCD Cargar A Sumar T2 A(BCD) Guardar X
Eliminar por reutilizaci贸n del acumulador
Cargar B Mult C Guardar T1 BC Cargar T1 Sumar
D Guardar T2 BCD Cargar A Sumar T2 Guardar T3
A(BCD) Cargar T3 Guardar X
Aplicar la propiedad conmutativa de la suma
Cargar B Mult C BC Sumar D BCD Sumar A
BCDA Guardar X
Eliminar por reutilizaci贸n del acumulador
43Asignaci贸n de Registro en M谩quinas Multi Registro
- La asignaci贸n de registros tiene dos pasos
- Register Allocation
- Es cuando se decide que una variable se ha de
guardar en un registro - Register Assignment
- Es cuando se selecciona el registro para guardar
una variable - Como optimizar la asignaci贸n de registros
- Minimizar el n煤mero de variables temporales
necesarias para evaluar una expresi贸n - Asignar las variables temporales a registros
- Si hay suficientes registros ya se ha acabado
- Si no hay que decidir que variables se han de
transferir a memoria y como minimizar el n煤mero
de transferencias
44Minimizar el N煤mero de Variables Temporales
- Idea
- Minimizar el n煤mero de registros necesarios para
los operandos de una operaci贸n y luego considerar
en que orden se han de calcular los operandos
para minimizar el n煤mero de registros del c谩lculo
completo
Operaci贸n binaria
Operando 2 m registros
Operando 1 n registros
Maxn,m1 registros RCalcular Op1 Calcular
Op2 Operaci贸n R,Op2
Maxn1,m registros RCalcular Op2 Calcular
Op1 Operaci贸n Op1,R
45Carga/Descarga de Registros
- Minimizar el n煤mero 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. S贸lo tiene sentido si el
procesador no permite divisiones o restas con los
operandos invertidos ( -AB, A\B). - Guardar en memoria el valor que m谩s se tardar谩 en
utilizar en el programa - Seleccionar el registro para una variable V
- Si hay alg煤n registro libre asignarlo a V
- sino si hay un registro cuyo valor no se
necesitara - asignarlo a V
- sino seleccionar el registro que m谩s tardar谩 en
- utilizarse
- guardar el valor del registro si ha
sido modificado - asignarlo a V
46Cuando se utilizar谩 una Variable
- Para saber cuando se utilizar谩 una variable se ha
de aplicar el c谩lculo de las variables vivas. - Ejemplo
- ccb
- aab
- ddc
- bd
- ec
Uso de los registros R0 R1 R2 b c - b
c a d c a d c b e
c b
a b c d e
47Optimizar Cargas y Descargas
- Descargar una variable modificada es m谩s costoso
que una no modificada. Para considerar esta
diferencia de coste se utiliza el siguiente grafo - Los v茅rtices representan los estados de
utilizaci贸n 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
b谩sico hasta el estado de estos al final del
bloque b谩sico
48Arquitectura M谩quina y Generaci贸n de C贸digo Real.
- Generar c贸digo por tabla
- A cada instrucci贸n de c贸digo intermedio le
corresponde una o m谩s instrucciones de c贸digo
m谩quina que se han guardado en una tabla. - Los registros no siempre son gen茅ricos
- 68K registros de datos y direcciones separados
- Pentium registros separados para enteros y
flotantes - Una instrucci贸n de c贸digo m谩quina puede ser
varias instrucciones de c贸digo intermedio - En la misma instrucci贸n se realiza el c谩lculo de
la direcci贸n de memoria del elemento de un array
push
MOV (SP),R1
pop
MOV R1,-(SP)
49Ejemplo de Optimizaci贸n dependiente de M谩quina
Pentium y Pentium II (I)
- Ayudar al compilador para que pueda optimizar el
c贸digo - Tener en cuenta los algoritmos de predicci贸n de
saltos - Evitar paradas por uso parcial de registros
(Avoid partial register stalls). - Alinear los datos
- Ordenar el c贸digo para evitar fallos de la cache
de prelectura de instrucciones - Reordenar las instrucciones para maximizar la
ejecuci贸n paralela de instrucciones.
50Ejemplo de Optimizaci贸n dependiente de M谩quina
Pentium y Pentium II (II)
- Evitar los prefijos de instrucci贸n
- Evitar leer y escribir sobre la misma memoria con
diferentes tipos de datos. - Emparejar CALL y RET
- Evitar c贸digo automodificable
- No poner datos en el segmento de c贸digo
- Calcular las direcciones de destino cuanto antes
51Como Escribir los Programas C
- Ayudar al compilador para que pueda optimizar el
c贸digo - 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
- Tener en cuenta los algoritmos de predicci贸n de
saltos. Suposiciones del predictor - No saltar en caso de un salto condicional hacia
delante - Saltar en caso de salto condicional hacia atr谩s
52Reducir el N煤mero de Saltos
- Reduce la posibilidad de predicciones err贸neas
- Reduce el n煤mero de entradas en la BTB (Branch
Target Buffer) - Ejemplo ebx (AltB) ? 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 clear ebx
- cmp A, B
- setge bl When ebx 0 or 1
- OR the complement condition dec ebx
ebx00...00 or 11...11 - and ebx, (CONST2-CONST1) ebx0
- or (CONST2-CONST1)
- add ebx, min(CONST1,CONST2)
- Pentium II
53Evitar paradas por uso parcial de registros
(Avoid partial register stalls).
- Register Stall al acceder a EAX
- MOV AX, 8
- ADD ECX, EAX
- En el caso de Pentium II se puede producir para
instrucciones no contiguas - MOV AL, 8
- MOV EDX, 0x40
- MOV EDI, new_value
- ADD EDX, EAX Partial stall
54Alinear
- 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 c贸digo
- 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 16-byte boundary.
55Reordenar las instrucciones para maximizar la
ejecuci贸n paralela
- Pairing cannot be performed when the following
conditions occur - The next two instructions are not pairable
instructions (see Appendix A for pairing
characteristics of individual instructions). In
general, most simple ALU instructions are
pairable. - The next two instructions have some type of
register contention (implicit or explicit). There
are some special exceptions to this rule where
register contention can occur with pairing. These
are described later. - The instructions are not both in the instruction
cache. An exception to this which permits pairing
is if the first instruction is a one-byte
instruction.