Introducci n a optimizaciones
This presentation is the property of its rightful owner.
Sponsored Links
1 / 101

Introducción a Optimizaciones PowerPoint PPT Presentation


  • 52 Views
  • Uploaded on
  • Presentation posted in: General

Introducción a Optimizaciones. Resumen. Overview Generación de Control de Flujo Generación de Procedimientos Linking Introducción a Optimizaciones Taxonomía de Optimizaciones Ejemplo de Optimizaciones. Programa (character stream). Código en Assembler. Analizador Léxico (Scanner).

Download Presentation

Introducción a Optimizaciones

An Image/Link below is provided (as is) to download presentation

Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author.While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server.


- - - - - - - - - - - - - - - - - - - - - - - - - - E N D - - - - - - - - - - - - - - - - - - - - - - - - - -

Presentation Transcript


Introducci n a optimizaciones

Introducción a Optimizaciones


Resumen

Resumen

  • Overview

  • Generación de Control de Flujo

  • Generación de Procedimientos

  • Linking

  • Introducción a Optimizaciones

  • Taxonomía de Optimizaciones

  • Ejemplo de Optimizaciones

2


Introducci n a optimizaciones

Programa (character stream)

Código en Assembler

Analizador Léxico (Scanner)

Token Stream

Analizador Sintáctico (Parser)

Arbol de Parseo

Generador de Código Intermedio

High-level IR

Low-level IR

Representación Intermedia

Generador de Código

Assembler & linker

Ejecutable Binario

Procesador

3


Overview de un procesador moderno

Overview de un Procesador Moderno

Memory

  • ALU

  • Control

  • Memory

  • Registers

Registers

ALU

Control

4


Memory layout

Memory Layout

0x7fffffff

Stack

  • Inicio del Stack

  • Manejo del Heap

    • free lists

  • Posición de inicio en segmento de text

locales

(parámetros)

Objetos

Heap

Arrays

Text segment

0x400000

Reserved

5


Stack

Stack

  • Guarda parámetros y variables locales

    • Cada invocación obtiene una nueva copia

  • Caller necesita guardar

    • Todo registro caller-saved que esté siendo usado

    • Cualquier parámetro pasado

    • Return address (cuándo se toman branches)

  • Callee debe guardar

    • Dirección del stack pointer anterior

    • Frame pointer y global area pointer anteriores

    • Todo registro callee saved que esté siendo usado

6


Stack1

Stack

...

argument 5

argument 4

fp

old frame pointer

return address

  • Dirección del n-ésimo argumento es -(n-4)*4*$fp

  • Variables locales son un offset constante negativo de $fp

Calliee saved

registers

Local variables

Stack temporaries

Dynamic area

sp

7


Stack2

Stack

...

argument 5

argument 4

fp

old frame pointer

return address

  • Al llamar a un nuevo procedimieto, el caller:

    • Push cualquier t0-t9 que tiene un valor importante al stack

    • Pone los argumentos 1-4 en a0-a3

    • Push del resto de argumentos al stack

    • Hace un jal o jalr

Calliee saved

registers

Local variables

Stack temporaries

Dynamic area

Caller saved registers

arguments

sp

8


Stack3

Stack

...

argument 5

argument 4

old frame pointer

return address

  • En el procedimiento, el callee al principio:

    • push $fp al stack

    • copiar $sp a $fp

    • push $ra al stack

    • Si algún s0-s7 es usado en el proc, meterlo al stack

    • Crear espacio para variables locales en el stack

    • Ejecutar el callee...

Calliee saved

registers

Local variables

Stack temporaries

Dynamic area

Caller saved registers

arguments

fp

old frame pointer

return address

Calliee saved

registers

Local variables

Dynamic area

sp

9


Stack4

Stack

...

argument 5

argument 4

fp

old frame pointer

return address

  • En el procedimiento, el callee al final:

    • Pone valores de retorno en v0,v1

    • actualizar $sp usando $fp

    • Pop los registros callee-saved del stack

    • restaurar $ra del stack

    • restaurar $fp del stack

    • ejecutar jr ra y retornar al caller

Calliee saved

registers

Local variables

Stack temporaries

Dynamic area

Caller saved registers

arguments

sp

10


Stack5

Stack

...

argument 5

argument 4

fp

old frame pointer

return address

  • Al regresar de una llamada a procedimiento, el caller:

    • actualiza $sp para ignorar los argumentos

    • pop los registros caller-saved

    • Continuar...

Calliee saved

registers

Local variables

Stack temporaries

Dynamic area

sp

11


Registros

9

Registros

12


Programa ejemplo

Programa Ejemplo

class auxmath {

int sum3d(int ax, int ay, int az,

int bx, int by, int bz)

{

int dx, dy, dz;

if(ax > ay)

dx = ax - bx;

else

dx = bx - ax;

retrun dx + dy + dz;

}

}

int px, py, pz;

px = 10; py = 20; pz = 30;

auxmath am;

am.sum3d(px, py, pz, 0, 1, -1);

Dynamic area

Caller saved registers

Argument 7: bz (-1)

Argument 6: by (1)

Argument 5: bx (0)

fp

old frame pointer

return address

Local variable dx (??)

Local variable dy (??)

sp

Local variable dz (??)

13


Creaci n de expresiones

Creación de Expresiones

  • Algoritmo ingenuo de generación de código para x = y op z

    • Elegir un registro Rsrc1 (digamos $t0) para cargar el valor y

    • Generar instrucciones para copiar, si y es:

      • En otro registro (digamos $t7) add $t0, $t7, zero

      • Una constante (digamos 1024)li $t0, 1024

      • Está en memoria (digamos apuntado por $t7) lw $t0, $t7

      • En una dirección simbólica (digamos lab1) la $t0, lab1

    • Elegir registro Rsrc2 (digamos $t1) y cargar el valor z

    • Elegir registro Rdest (digamos $t2) para guardar x

    • Hacer la operación (digamos and) and $t2, $t1, $t0

14


Programa ejemplo1

Programa Ejemplo

class auxmath {

int sum3d(int ax, int ay, int az,

int bx, int by, int bz)

{

int dx, dy, dz;

if(ax > ay)

dx = ax - bx;

address

src1

src2

dest

Dynamic area

add $t0, $a1, zero

lw$t1, 0($fp)

sub$t2, $t0, $t1

sw$t2, -12($fp)

Caller saved registers

Argument 7: bz (-1)

Argument 6: by (1)

Argument 5: bx (0)

fp

old frame pointer

return address

Local variable dx (??)

Local variable dy (??)

sp

sp

Local variable dz (??)

15


Resumen1

5

Resumen

  • Overview

  • Generación de Control de Flujo

  • Generación de Procedimientos

  • Linking

  • Introducción a Optimizaciones

  • Taxonomía de Optimizaciones

  • Ejemplo de Optimizaciones

16


Generaci n de control de flujo

Generación de Control de Flujo

  • Aplanar la estructura de control

    • Usamos una template

  • Crear etiquetas únicas para los puntos donde se une el control (joins)

  • Luego generar el código apropiado

17


Template para condicionales

Template para condicionales

if (test)

true_body

else

false_body

<do the test>

boper …, lab_true

<false_body>

jlab_end

lab_true:

<true_body>

lab_end:

18


Programa ejemplo2

12

Programa Ejemplo

if(ax > bx)

dx = ax - bx;

else

dx = bx - ax;

address

<do test>

boper..., ..., lab0

<false body>

jlab1

lab0:

<true body>

lab1:

src1

src2

dest

Dynamic area

Caller saved registers

Argument 7: bz (-1)

Argument 6: by (1)

Argument 5: bx (0)

fp

old frame pointer

return address

Local variable dx (??)

Local variable dy (??)

sp

Local variable dz (??)

19


Programa ejemplo3

13

Programa Ejemplo

if(ax > bx)

dx = ax - bx;

else

dx = bx - ax;

address

add$t0, $a1, zero

lw$t1, 0($fp)

bgt$t0, $t1, lab0

<fale body>

jlab1

lab0:

<true body>

lab1:

src1

src2

dest

Dynamic area

Caller saved registers

Argument 7: bz (-1)

Argument 6: by (1)

Argument 5: bx (0)

fp

old frame pointer

return address

Local variable dx (??)

Local variable dy (??)

sp

Local variable dz (??)

20


Programa ejemplo4

Programa Ejemplo

if(ax > bx)

dx = ax - bx;

else

dx = bx - ax;

address

add$t0, $a1, zero

lw$t1, 0($fp)

bgt$t0, $t1, lab0

lw$t0, 0($fp)

add$t1, $a1, zero

sub$t2, $t0, $t1

sw$t2, -12($fp)

jlab1

lab0:

<true body>

lab1:

src1

src2

dest

Dynamic area

Caller saved registers

Argument 7: bz (-1)

Argument 6: by (1)

Argument 5: bx (0)

fp

old frame pointer

return address

Local variable dx (??)

Local variable dy (??)

sp

Local variable dz (??)

21


Programa ejemplo5

15

Programa Ejemplo

if(ax > bx)

dx = ax - bx;

else

dx = bx - ax;

address

add$t0, $a1, zero

lw$t1, 0($fp)

bgt$t0, $t1, lab0

lw$t0, 0($fp)

add$t1, $a1, zero

sub$t2, $t0, $t1

sw$t2, -12($fp)

jlab1

lab0:add$t0, $a1, zero

lw$t1, 0($fp)

sub$t2, $t0, $t1

sw$t2, -12($fp)

lab1:

src1

src2

dest

Dynamic area

Caller saved registers

Argument 7: bz (-1)

Argument 6: by (1)

Argument 5: bx (0)

fp

old frame pointer

return address

Local variable dx (??)

Local variable dy (??)

sp

Local variable dz (??)

22


Template para loops while

Template para loops while

while (test)

body

23


Template para loops while1

Template para loops while

lab_cont:

<do the test>

boper …, lab_body

jlab_end

lab_body:

<body>

jlab_cont

lab_end:

while (test)

body

24


Template para loops while2

lab_cont:

<do the test>

boper …, lab_end

<body>

jlab_cont

lab_end:

16

Template para loops while

lab_cont:

<do the test>

boper …, lab_body

jlab_end

lab_body:

<body>

jlab_cont

lab_end:

while (test)

body

  • An optimized template

25


Pregunta

17

Pregunta:

  • ¿Cuál es la template para?

    do

    body

    while (test)

26


Pregunta1

Pregunta:

  • ¿Cuál es la template para?

    do

    body

    while (test)

lab_begin:

<body>

<do test>

boper …, lab_begin

27


Resumen2

5

Resumen

  • Overview

  • Generación de Control de Flujo

  • Generación de Procedimientos

  • Linking

  • Introducción a Optimizaciones

  • Taxonomía de Optimizaciones

  • Ejemplo de Optimizaciones

28


Llamada a procedimiento

Llamada a Procedimiento

Dynamic area

Caller saved registers

arguments

sp

29


Llamada a procedimiento1

Dynamic area

Caller saved registers

arguments

fp

old frame pointer

return address

Calliee saved

registers

Local variables

Dynamic area

sp

19

Llamada a Procedimiento

  • En el procedimiento, el callee al principio:

    • push $fp al stack

    • copiar $sp a $fp

    • push $ra al stack

    • Si algún s0-s7 es usado en el proc, meterlo al stack

    • Crear espacio para variables locales en el stack

    • Ejecutar el callee...

30


Llamada a procedimiento2

Dynamic area

Caller saved registers

arguments

fp

old frame pointer

return address

Calliee saved

registers

Local variables

Dynamic area

sp

20

Llamada a Procedimiento

proc_entry:

sw$fp, -4($sp)

add $fp, $sp, zero

addi $sp, $sp, -8

sw$ra, ($sp)

  • En el procedimiento, el callee al principio:

    • push $fp al stack

    • copiar $sp a $fp

    • push $ra al stack

    • Si algún s0-s7 es usado en el proc, meterlo al stack

    • Crear espacio para variables locales en el stack

    • Ejecutar el callee...

31


Llamada a procedimiento3

Dynamic area

Caller saved registers

arguments

fp

old frame pointer

return address

Calliee saved

registers

Local variables

Dynamic area

sp

Llamada a Procedimiento

. . .

  • Ejecutar el cuerpo del procedimiento llamado

    • Acceso a variables locales y parámetros como offsets del $fp

32


Llamada a procedimiento4

Dynamic area

Caller saved registers

arguments

fp

old frame pointer

return address

Calliee saved

registers

Local variables

Dynamic area

sp

Llamada a Procedimiento

. . .

  • En el procedimiento, el callee al final:

    • Pone valores de retorno en v0,v1

    • actualizar $sp usando $fp

    • Pop los registros callee-saved del stack

    • restaurar $ra del stack

    • restaurar $fp del stack

    • ejecutar jr ra y retornar al caller

33


Llamada a procedimiento5

Dynamic area

Caller saved registers

arguments

fp

old frame pointer

return address

Calliee saved

registers

Local variables

Dynamic area

sp

22

Llamada a Procedimiento

. . .

add$v0, $t2, zero

add$sp, $fp, zero

lw$ra, -8($Sp)

lw$fp, -4($sp)

jr$ra

  • En el procedimiento, el callee al final:

    • Pone valores de retorno en v0,v1

    • actualizar $sp usando $fp

    • Pop los registros callee-saved del stack

    • restaurar $ra del stack

    • restaurar $fp del stack

    • ejecutar jr ra y retornar al caller

34


Llamada a procedimiento6

Llamada a Procedimiento

proc_entry:

sw$fp, -4($sp)

add $fp, $sp, zero addi $sp, $sp, -8

sw$ra, ($sp)

. . .

add$v0, $t2

add$sp, $fp, 0

lw$ra, -8($Sp)

lw$fp, -4($sp)

jr$ra

Dynamic area

Caller saved registers

arguments

sp

old frame pointer

return address

Calliee saved

registers

Local variables

Dynamic area

35


Resumen3

5

Resumen

  • Overview

  • Generación de Control de Flujo

  • Generación de Procedimientos

  • Linking

  • Introducción a Optimizaciones

  • Taxonomía de Optimizaciones

  • Ejemplo de Optimizaciones

36


S mbolos

Símbolos

  • Ejecutable es una colección

    • Compilaciones separadas

    • Librerías linkeadas estática y dinámicamente

  • Por lo tanto no podemos crear la imagen de memoria en tiempo de compilación

  • Se necesita una fase adicional de linker para juntar todo y crear la imagen final de memoria

37


Salida del compilador

Salida del Compilador

  • Crear código objeto con direcciones simbólicas que pueden ser reposicionadas

  • Las direcciones simbólicas de todos los datos y del principio de procedimientos que otros necesitan accesar son exportadas

  • Exportar los nombres de símbolos para referencias externas

38


S mbolos exportados por el compilador

Símbolos exportados por el Compilador

Symbols from test.o:

[Index] Value Class Type Section Name

[0]| 0| File |ref=6 |Text | test.c

[1]| 0| Proc |end=3 int |Text | main

[2]| 56| Proc |end=5 int |Text | fib

[3]| 0| Global | |Bss | internal_var

[4]| 0| Proc |ref=1 |Text | main

[5]| 56| Proc |ref=3 |Text | fib

[6]| 0| Global | |Undefined| external_var

[7]| 0| Proc | |Undefined| foo

[8]| 0| Global | |Undefined| _gp_disp

39


Linker

Linker

  • Ve en todos los object files para encontrar símbolos no resueltos

  • Hace corresponder los símbolos y saca las partes necesarias de las librerías

  • Hace el Layout en una sola imagen de memoria

  • Resuelve todos los nombres simbólicos a las direcciones y offsets adecuados de memoria

40


Resumen4

5

Resumen

  • Overview

  • Generación de Control de Flujo

  • Generación de Procedimientos

  • Linking

  • Introducción a Optimizaciones

  • Taxonomía de Optimizaciones

  • Ejemplo de Optimizaciones

41


Anatom a de un compilador

Programa (character stream)

Token Stream

Representación Intermedia

Representación Intermedia Optimizada

Código en Assembler

Anatomía de un Compilador

Analizador Léxico (Scanner)

Analizador Sintáctico (Parser)

Arbol de Parseo

Generador de Código Intermedio

Optimizador de Código Intermedio

Generador de Código

42


Programa ejemplo6

Programa Ejemplo

int expr(int n)

{

int d;

d = 4 * n * n * (n + 1) * (n + 1);

return d;

}

43


Programa ejemplo7

Programa Ejemplo

Código No Optimizado

Código Optimizado

s4addq $16,0,$0

mull $16,$0,$0

addq $16,1,$16

mull $0,$16,$0

mull $0,$16,$0

ret $31,($26),1

lda $30,-32($30)

stq $26,0($30)

stq $15,8($30)

bis $30,$30,$15

bis $16,$16,$1

stl $1,16($15)

lds $f1,16($15)

sts $f1,24($15)

ldl $5,24($15)

bis $5,$5,$2

s4addq $2,0,$3

ldl $4,16($15)

mull $4,$3,$2

ldl $3,16($15)

addq $3,1,$4

mull $2,$4,$2

ldl $3,16($15)

addq $3,1,$4

mull $2,$4,$2

stl $2,20($15)

ldl $0,20($15)

br $31,$33

$33:

bis $15,$15,$30

ldq $26,0($30)

ldq $15,8($30)

addq $30,32,$30

ret $31,($26),1

44


Qu es un optimizador

28

¿Qué es un Optimizador?

  • Transforma un cómputo a un cómputo equivalente, pero mejor

    • Pero nunca óptimo

  • Acelera los programas

    execution time = instruction count * cycles per instruction

    • Minimiza el número de operaciones

    • Reemplaza las operaciones caras con operaciones más baratas

    • Minimiza los cache misses

  • Minimiza el tamaño del object code

  • Reduce el consumo de poder

45


Por qu usar un optimizador

29

¿Por qué usar un Optimizador?

  • Generar código tan bueno como si lo hubiera codificado a mano un buen programador

  • Obtener rendimiento estable y robusto

  • Abstraer la arquitectura del programador

    • Explotar las fortalezas arquitecturales

    • Esconder las debilidades arquitecturales

  • Soporte amplio y eficiente de las facilidades del lenguaje

46


Por qu usar un optimizador1

30

¿Por qué usar un Optimizador?

  • Los programadores sólo tienen que preocuparse de que el algoritmo este correcto

  • El optimizador del compilador va a:

    • Hacer que el programa sea muy rápido

    • make the program blazingly fast

    • encargarse de los detalles de la arquitectura

47


Las arquitecturas modernas asumen un buen soporte del compilador

31

Las Arquitecturas Modernas asumen un buen soporte del Compilador

  • Cambio de diseño de CISC a RISC

    • CISC tenía instrucciones más cercanas a los lenguajes de alto nivel

    • RISC tiene instrucciones simples (se necesitan un montón para ejecutar construcciones de alto nivel)

  • Arquitecturas Superescalares

    • Necesitan calendarización de instrucciones

    • Casi imposible de hacer a mano

  • Máquinas de Vectores y Paralelas

    • Se necesita que el compilador vectorice/paralelice las aplicaciones

48


Problemas al desarrollar un compilador

32

Problemas al desarrollar un Compilador

  • Velocidad de Compilación

    • Puede que los algoritmos no escalen

  • Calidad de los resultados

  • Que los resultados sean correctos

    • Suposiciones implícitas

    • Estabilidad numérica

    • Compiladores son complejos  pueden tener bugs

  • Que se puedan debuggear

49


Resumen5

5

Resumen

  • Overview

  • Generación de Control de Flujo

  • Generación de Procedimientos

  • Linking

  • Introducción a Optimizaciones

  • Taxonomía de Optimizaciones

  • Ejemplo de Optimizaciones

50


An lisis de programas

Análisis de Programas

  • Para poder optimizar un programa, necesitamos entender el programa

    • Estructura del Programa

    • Uso de los Datos

    • Comportamiento Lógico

  • “reverse engineer” del código al algoritmo

51


An lisis de programas1

Análisis de Programas

  • Análisis de Control de Flujo

  • Análisis de Flujo de Datos

  • Análisis de Dependencia de Datos

  • Análisis de Alias

  • Análisis Entre Procedimientos (interprocedural)

  • Profile Feedback

    • Provee información acerca del uso del programa

52


Optimizaciones a programas

Optimizaciones a Programas

  • Las categorizamos en:

    • Optimizaciones Clásicas

    • Eliminación de Redundancia

    • Optimizaciones de Loops

    • Optimizaciones de Procedimientos

    • Asignación de Registros y Calendarización de Instrucciones

  • Similar a la clasificación del libro de la Ballena

53


Muchas otras optimizaciones avanzadas

Muchas otras Optimizaciones Avanzadas

  • Optimizaciones de Programa Completo

  • Optimizaciones para Jerarquías de Memoria

  • Paralelización y Vectorización

  • Optimizaciones específicas a la arquitectura

  • Optimizaciones para Consumo de Poder

  • Optimizaciones para Mejorar/Garantizar Seguridad

  • Mucha investigación en curso…

54


Optimizaciones cl sicas

Optimizaciones Clásicas

  • Constant Folding

  • Algebraic Simplification

  • Copy Propagation

  • Constant Propagation

55


Eliminaci n de redundancia

Eliminación de Redundancia

  • Common-Subexpression Elimination

  • Partial Redundancy Elimination

  • Code Hoisting

56


Optimizaciones de loops

Optimizaciones de Loops

  • Loop Invariant Code Motion

  • Strength Reduction

  • Bounds Checking Elimination

57


Optimizaciones de procedimientos

Optimizaciones de Procedimientos

  • Tail Recursion Elimination

  • Method Inlining

  • Leaf-Routine Optimization

58


Register allocation and instruction scheduling

Register Allocation and Instruction Scheduling

  • Register Allocation

  • Basic Block Scheduling

  • List or Trace Scheduling

  • Loop Unrolling

  • Software Pipelining

  • Speculative Scheduling

59


Resumen6

5

Resumen

  • Overview

  • Generación de Control de Flujo

  • Generación de Procedimientos

  • Linking

  • Introducción a Optimizaciones

  • Taxonomía de Optimizaciones

  • Ejemplo de Optimizaciones

60


Ejemplo

Ejemplo

int sumcalc(int a, int b, int N)

{

int i;

int x, y;

x = 0;

y = 0;

for(i = 0; i <= N; i++) {

x = x + (4*a/b)*i + (i+1)*(i+1);

x = x + b*y;

}

return x;

}

61


Introducci n a optimizaciones

45

test:

subu $fp, 16

sw zero, 0($fp)# x = 0

sw zero, 4($fp)# y = 0

sw zero, 8($fp)# i = 0

lab1:# for(i=0;i<N; i++)

mul $t0, $a0, 4# a*4

div $t1, $t0, $a1# a*4/b

lw $t2, 8($fp)# i

mul $t3, $t1, $t2# a*4/b*i

lw $t4, 8($fp)# i

addui$t4, $t4, 1# i+1

lw $t5, 8($fp)# i

addui$t5, $t5, 1# i+1

mul $t6, $t4, $t5# (i+1)*(i+1)

addu $t7, $t3, $t6# a*4/b*i + (i+1)*(i+1)

lw $t8, 0($fp)# x

add $t8, $t7, $t8# x = x + a*4/b*i + (i+1)*(i+1)

sw $t8, 0($fp)

...

62


Introducci n a optimizaciones

47

...

lw $t0, 4($fp)# y

mul $t1, $t0, a1# b*y

lw $t2, 0($fp)# x

add $t2, $t2, $t1# x = x + b*y

sw $t2, 0($fp)

lw $t0, 8($fp)# i

addui$t0, $t0, 1# i+1

sw $t0, 8($fp)

ble $t0, $a3, lab1

lw $v0, 0($fp)

addu $fp, 16

b $ra

63


Optimizemos

Optimizemos...

int sumcalc(int a, int b, int N)

{

int i;

int x, y;

x = 0;

y = 0;

for(i = 0; i <= N; i++) {

x = x + (4*a/b)*i + (i+1)*(i+1);

x = x + b*y;

}

return x;

}

64


Constant propagation

Constant Propagation

int sumcalc(int a, int b, int N)

{

int i;

int x, y;

x = 0;

y = 0;

for(i = 0; i <= N; i++) {

x = x + (4*a/b)*i + (i+1)*(i+1);

x = x + b*y;

}

return x;

}

65


Constant propagation1

Constant Propagation

int sumcalc(int a, int b, int N)

{

int i;

int x, y;

x = 0;

y = 0;

for(i = 0; i <= N; i++) {

x = x + (4*a/b)*i + (i+1)*(i+1);

x = x + b*y;

}

return x;

}

66


Constant propagation2

Constant Propagation

int sumcalc(int a, int b, int N)

{

int i;

int x, y;

x = 0;

y = 0;

for(i = 0; i <= N; i++) {

x = x + (4*a/b)*i + (i+1)*(i+1);

x = x + b*y;

}

return x;

}

67


Constant propagation3

Constant Propagation

int sumcalc(int a, int b, int N)

{

int i;

int x, y;

x = 0;

y = 0;

for(i = 0; i <= N; i++) {

x = x + (4*a/b)*i + (i+1)*(i+1);

x = x + b*0;

}

return x;

}

68


Algebraic simplification

Algebraic Simplification

int sumcalc(int a, int b, int N)

{

int i;

int x, y;

x = 0;

y = 0;

for(i = 0; i <= N; i++) {

x = x + (4*a/b)*i + (i+1)*(i+1);

x = x + b*0;

}

return x;

}

69


Algebraic simplification1

Algebraic Simplification

int sumcalc(int a, int b, int N)

{

int i;

int x, y;

x = 0;

y = 0;

for(i = 0; i <= N; i++) {

x = x + (4*a/b)*i + (i+1)*(i+1);

x = x + b*0;

}

return x;

}

70


Algebraic simplification2

Algebraic Simplification

int sumcalc(int a, int b, int N)

{

int i;

int x, y;

x = 0;

y = 0;

for(i = 0; i <= N; i++) {

x = x + (4*a/b)*i + (i+1)*(i+1);

x = x + 0;

}

return x;

}

71


Algebraic simplification3

Algebraic Simplification

int sumcalc(int a, int b, int N)

{

int i;

int x, y;

x = 0;

y = 0;

for(i = 0; i <= N; i++) {

x = x + (4*a/b)*i + (i+1)*(i+1);

x = x + 0;

}

return x;

}

72


Algebraic simplification4

Algebraic Simplification

int sumcalc(int a, int b, int N)

{

int i;

int x, y;

x = 0;

y = 0;

for(i = 0; i <= N; i++) {

x = x + (4*a/b)*i + (i+1)*(i+1);

x = x + 0;

}

return x;

}

73


Algebraic simplification5

Algebraic Simplification

int sumcalc(int a, int b, int N)

{

int i;

int x, y;

x = 0;

y = 0;

for(i = 0; i <= N; i++) {

x = x + (4*a/b)*i + (i+1)*(i+1);

x = x;

}

return x;

}

74


Copy propagation

Copy Propagation

int sumcalc(int a, int b, int N)

{

int i;

int x, y;

x = 0;

y = 0;

for(i = 0; i <= N; i++) {

x = x + (4*a/b)*i + (i+1)*(i+1);

x = x;

}

return x;

}

75


Copy propagation1

Copy Propagation

int sumcalc(int a, int b, int N)

{

int i;

int x, y;

x = 0;

y = 0;

for(i = 0; i <= N; i++) {

x = x + (4*a/b)*i + (i+1)*(i+1);

}

return x;

}

76


Common subexpression elimination

Common Subexpression Elimination

int sumcalc(int a, int b, int N)

{

int i;

int x, y;

x = 0;

y = 0;

for(i = 0; i <= N; i++) {

x = x + (4*a/b)*i + (i+1)*(i+1);

}

return x;

}

77


Common subexpression elimination1

Common Subexpression Elimination

int sumcalc(int a, int b, int N)

{

int i;

int x, y;

x = 0;

y = 0;

for(i = 0; i <= N; i++) {

x = x + (4*a/b)*i + (i+1)*(i+1);

}

return x;

}

78


Common subexpression elimination2

Common Subexpression Elimination

int sumcalc(int a, int b, int N)

{

int i;

int x, y, t;

x = 0;

y = 0;

for(i = 0; i <= N; i++) {

t = i+1;

x = x + (4*a/b)*i + (i+1)*(i+1);

}

return x;

}

79


Common subexpression elimination3

Common Subexpression Elimination

int sumcalc(int a, int b, int N)

{

int i;

int x, y, t;

x = 0;

y = 0;

for(i = 0; i <= N; i++) {

t = i+1;

x = x + (4*a/b)*i + t*t;

}

return x;

}

80


Dead code elimination

Dead Code Elimination

int sumcalc(int a, int b, int N)

{

int i;

int x, y, t;

x = 0;

y = 0;

for(i = 0; i <= N; i++) {

t = i+1;

x = x + (4*a/b)*i + t*t;

}

return x;

}

81


Dead code elimination1

Dead Code Elimination

int sumcalc(int a, int b, int N)

{

int i;

int x, y, t;

x = 0;

y = 0;

for(i = 0; i <= N; i++) {

t = i+1;

x = x + (4*a/b)*i + t*t;

}

return x;

}

82


Dead code elimination2

Dead Code Elimination

int sumcalc(int a, int b, int N)

{

int i;

int x, y, t;

x = 0;

for(i = 0; i <= N; i++) {

t = i+1;

x = x + (4*a/b)*i + t*t;

}

return x;

}

83


Dead code elimination3

Dead Code Elimination

int sumcalc(int a, int b, int N)

{

int i;

int x, t;

x = 0;

for(i = 0; i <= N; i++) {

t = i+1;

x = x + (4*a/b)*i + t*t;

}

return x;

}

84


Loop invariant removal

Loop Invariant Removal

int sumcalc(int a, int b, int N)

{

int i;

int x, t;

x = 0;

for(i = 0; i <= N; i++) {

t = i+1;

x = x + (4*a/b)*i + t*t;

}

return x;

}

85


Loop invariant removal1

Loop Invariant Removal

int sumcalc(int a, int b, int N)

{

int i;

int x, t;

x = 0;

for(i = 0; i <= N; i++) {

t = i+1;

x = x + (4*a/b)*i + t*t;

}

return x;

}

86


Loop invariant removal2

Loop Invariant Removal

int sumcalc(int a, int b, int N)

{

int i;

int x, t, u;

x = 0;

u = (4*a/b);

for(i = 0; i <= N; i++) {

t = i+1;

x = x + u*i + t*t;

}

return x;

}

87


Strength reduction

Strength Reduction

int sumcalc(int a, int b, int N)

{

int i;

int x, t, u;

x = 0;

u = (4*a/b);

for(i = 0; i <= N; i++) {

t = i+1;

x = x + u*i + t*t;

}

return x;

}

88


Strength reduction1

Strength Reduction

int sumcalc(int a, int b, int N)

{

int i;

int x, t, u;

x = 0;

u = (4*a/b);

for(i = 0; i <= N; i++) {

t = i+1;

x = x + u*i + t*t;

}

return x;

}

u*0,

u*1,

u*2,

u*3,

u*4,

...

v=0,

v=v+u,

v=v+u,

v=v+u,

v=v+u,

...

89


Strength reduction2

Strength Reduction

int sumcalc(int a, int b, int N)

{

int i;

int x, t, u, v;

x = 0;

u = (4*a/b);

v = 0;

for(i = 0; i <= N; i++) {

t = i+1;

x = x + u*i + t*t;

v = v + u;

}

return x;

}

90


Strength reduction3

Strength Reduction

int sumcalc(int a, int b, int N)

{

int i;

int x, t, u, v;

x = 0;

u = (4*a/b);

v = 0;

for(i = 0; i <= N; i++) {

t = i+1;

x = x + v + t*t;

v = v + u;

}

return x;

}

91


Strength reduction4

Strength Reduction

int sumcalc(int a, int b, int N)

{

int i;

int x, t, u, v;

x = 0;

u = (4*a/b);

v = 0;

for(i = 0; i <= N; i++) {

t = i+1;

x = x + v + t*t;

v = v + u;

}

return x;

}

92


Strength reduction5

Strength Reduction

int sumcalc(int a, int b, int N)

{

int i;

int x, t, u, v;

x = 0;

u = (4*a/b);

v = 0;

for(i = 0; i <= N; i++) {

t = i+1;

x = x + v + t*t;

v = v + u;

}

return x;

}

93


Strength reduction6

Strength Reduction

int sumcalc(int a, int b, int N)

{

int i;

int x, t, u, v;

x = 0;

u = ((a<<2)/b);

v = 0;

for(i = 0; i <= N; i++) {

t = i+1;

x = x + v + t*t;

v = v + u;

}

return x;

}

94


Register allocation

fp

Local variable X

Local variable Y

Local variable I

Register Allocation

95


Register allocation1

Register Allocation

fp

$t9 = X

$t8 = t

$t7 = u

$t6 = v

$t5 = i

Local variable X

Local variable Y

Local variable I

96


Ejemplo optimizado

Ejemplo Optimizado

int sumcalc(int a, int b, int N)

{

int i;

int x, t, u, v;

x = 0;

u = ((a<<2)/b);

v = 0;

for(i = 0; i <= N; i++) {

t = i+1;

x = x + v + t*t;

v = v + u;

}

return x;

}

97


Introducci n a optimizaciones

test:

subu $fp, 16

add $t9, zero, zero# x = 0

sll $t0, $a0, 2# a<<2

div $t7, $t0, $a1# u = (a<<2)/b

add $t6, zero, zero# v = 0

add $t5, zero, zero# i = 0

lab1:# for(i=0;i<N; i++)

addui$t8, $t5, 1# t = i+1

mul $t0, $t8, $t8# t*t

addu $t1, $t0, $t6# v + t*t

addu $t9, t9, $t1# x = x + v + t*t

addu $6, $6, $7# v = v + u

addui$t5, $t5, 1# i = i+1

ble $t5, $a3, lab1

addu $v0, $t9, zero

addu $fp, 16

b $ra

98


Introducci n a optimizaciones

4*ld/st + 2*add/sub + br +

N*(9*ld/st + 6*add/sub + 4* mul + div + br)

= 7 + N*21

6*add/sub + shift + div + br +

N*(5*add/sub + mul + br)

= 9 + N*7

Execution time = 43 sec

Execution time = 17 sec

Código No Optimizado

Código Optimizado

test:

subu $fp, 16

sw zero, 0($fp)

sw zero, 4($fp)

sw zero, 8($fp)

lab1:

mul $t0, $a0, 4

div $t1, $t0, $a1

lw $t2, 8($fp)

mul $t3, $t1, $t2

lw $t4, 8($fp)

addui $t4, $t4, 1

lw $t5, 8($fp)

addui $t5, $t5, 1

mul $t6, $t4, $t5

addu $t7, $t3, $t6

lw $t8, 0($fp)

add $t8, $t7, $t8

sw $t8, 0($fp)

lw $t0, 4($fp)

mul $t1, $t0, a1

lw $t2, 0($fp)

add $t2, $t2, $t1

sw $t2, 0($fp)

lw $t0, 8($fp)

addui $t0, $t0, 1

sw $t0, 8($fp)

ble $t0, $a3, lab1

lw $v0, 0($fp)

addu $fp, 16

b $ra

test:

subu $fp, 16

add $t9, zero, zero

sll $t0, $a0, 2

div $t7, $t0, $a1

add $t6, zero, zero

add $t5, zero, zero

lab1:

addui $t8, $t5, 1

mul $t0, $t8, $t8

addu $t1, $t0, $t6

addu $t9, t9, $t1

addu $6, $6, $7

addui $t5, $t5, 1

ble $t5, $a3, lab1

addu $v0, $t9, zero

addu $fp, 16

b $ra

99


Pregunta pueden optimizar

Pregunta: Pueden Optimizar..

int foobar(int a, int b, int N)

{

int i, j, k, x, y;

x = 0;

y = 0;

k = 256;

for(i = 0; i <= N; i++) {

for(j = i+1; j <= N; j++) {

x = x + 4*(2*i+j)*(i+2*k);

if(i>j)

y = y + 8*(i-j);

else

y = y + 8*(j-i);

}

}

return x;

}

100


Lecturas

Lecturas

  • La Ballena

    • Capítulos 7 & 11

  • El Dragón

    • Capítulos 10.1, 10.2, 10.3, 10.4

101


  • Login