1 / 101

Introducción a Optimizaciones

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).

maia
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. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. Introducción a Optimizaciones

  2. 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

  3. 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

  4. Overview de un Procesador Moderno Memory • ALU • Control • Memory • Registers Registers ALU Control 4

  5. 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

  6. 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

  7. 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

  8. 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

  9. 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

  10. 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

  11. 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

  12. 9 Registros 12

  13. 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

  14. 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

  15. 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

  16. 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

  17. 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

  18. Template para condicionales if (test) true_body else false_body <do the test> boper …, lab_true <false_body> j lab_end lab_true: <true_body> lab_end: 18

  19. 12 Programa Ejemplo if(ax > bx) dx = ax - bx; else dx = bx - ax; address <do test> boper ..., ..., lab0 <false body> j lab1 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

  20. 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> j lab1 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

  21. 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) j lab1 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

  22. 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) j lab1 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

  23. Template para loops while while (test) body 23

  24. Template para loops while lab_cont: <do the test> boper …, lab_body j lab_end lab_body: <body> j lab_cont lab_end: while (test) body 24

  25. lab_cont: <do the test> boper …, lab_end <body> j lab_cont lab_end: 16 Template para loops while lab_cont: <do the test> boper …, lab_body j lab_end lab_body: <body> j lab_cont lab_end: while (test) body • An optimized template 25

  26. 17 Pregunta: • ¿Cuál es la template para? do body while (test) 26

  27. Pregunta: • ¿Cuál es la template para? do body while (test) lab_begin: <body> <do test> boper …, lab_begin 27

  28. 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

  29. Llamada a Procedimiento Dynamic area Caller saved registers arguments sp 29

  30. 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

  31. 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

  32. 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

  33. 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

  34. 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

  35. 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

  36. 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

  37. 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

  38. 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

  39. 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

  40. 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

  41. 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

  42. 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

  43. Programa Ejemplo int expr(int n) { int d; d = 4 * n * n * (n + 1) * (n + 1); return d; } 43

  44. 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

  45. 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

  46. 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

  47. 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

  48. 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

  49. 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

  50. 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

More Related