1 / 36

Alto: A Link Time Optimizer

Alto: A Link Time Optimizer. Edición y optimización de ejecutables Compaq Alpha Manel Fernández. Motivación. Linea CAP Arquitectura de computadores Modificaciones en el “hardware” Evaluación mediante simuladores Cómo aplicar la tecnología de compilación a nuestro trabajo?. Motivación.

lyndon
Download Presentation

Alto: A Link Time Optimizer

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. Alto: A Link Time Optimizer Edición y optimización de ejecutables Compaq Alpha Manel Fernández

  2. Motivación • Linea CAP • Arquitectura de computadores • Modificaciones en el “hardware” • Evaluación mediante simuladores • Cómo aplicar la tecnología de compilación a nuestro trabajo?

  3. Motivación • Herramientas de compilación • Ictineo • IMPACT • GNU cc • ? • Es necesario un cambio tan “drástico” en nuestra metodología?

  4. Tucson, AZ

  5. Talk outline • Introducción • Usando “Alto” • Fases de “Alto” • Modificando “Alto”

  6. Talk outline • Introducción • Usando “Alto” • Fases de “Alto” • Modificando “Alto”

  7. Qué es “Alto” ? • Optimizador de ejecutables Alpha/OSF1 Binario Alpha “mejorado” alto Binario Alpha

  8. “Alto”... para qué ? • Edición de binarios • Instrumentación ¨Ad-hoc¨ • Visualización de código • Compilación a bajo nivel • Alto IR es el Alpha ISA • Optimizaciones “hardware-oriented”

  9. A favor... • Código fuente disponible • Eliminación del “front-end” • Fichero de entrada: ejecutable • Independencia del lenguaje de programación • Funcionamiento con/sin “profiling” • No hay cambios en la metodología!

  10. En contra... • Código en fase de desarrollo • Zonas de código “inhibido” • No es portable • Binario final no ¨pixificable¨ • Consume muchos recursos • Ej: Spec95 - 126.gcc • >1/2 Gb de memoria (xdisk) • 20-30´ de compilación

  11. Talk outline • Introducción • Usando “Alto” • Fases de “Alto” • Modificando “Alto”

  12. “Alto” URL http://www.cs.arizona.edu/alto Última release pública: Agosto 1999 !! Ejecutables alto {profadder} {profdump} Instalación • Compilación • more README • vi Makefile • ... • gmake headers • gmake

  13. Benchmarks • Binarios de entrada • Compilados estáticamente • Con “rellocation information” • Limitaciones de “Alto” • Mejor preparado para código 21164 • arch ev5 • Global Pointer (GP) único

  14. Compilación de benchmarks • Opciones de compilación • cc -Wl,-r -Wl,-d -Wl,-z -non_shared • f77 -Wl,-r -Wl,-d -Wl,-z -non_shared • gcc -Wl,-r -Wl,-d -Wl,-z -static • g++ -Wl,-r -Wl,-d -Wl,-z -static • chmod +x ...

  15. Invocando “Alto” • Optimizar un ejecutable • alto -i <ifile> -o <ofile> • Opciones de invocación • +300 “valores” no documentados!!! • Ej: alto -V Phase+Status … Opción Concatenador de valores Valor Valor

  16. -V Phase+Status+... -P Loop+Bbl+Fun+... -T Preproc+Postasm+... -O Peep+Inline+... -r <number> -C <number> -L Sensitive|... -M Crit|Path|... -p Bbl+Fun+... Verbose info Print “what” Print “when” Disable optimizations Number of rounds Cache size (#instr) Liveness method Inline method Profile “what” Opciones útiles

  17. Talk outline • Introducción • Usando “Alto” • Fases de “Alto” • Modificando “Alto”

  18. Bibliografía… :-) • Bibliografía básica • Aho, Sethi, Ullman. Compilers - Principles, Techniques and Tools. Addison Wesley, 1986. • Muchnick. Advanced Compiler Design and Implementation. Morgan Kaufman, 1997. • “Alto” web page • Muth, Debray, Watt., De Boss. alto: A Link-Time Optimizer for the DEC Alpha. TR98-14, 1998. • Muth. alto: A Platform for Object Code Modification. PhD. Dissertation, 1999.

  19. Fases del compilador • Loading phase • Lee el binario y contruye el CFG • Optimization phase • Optimizaciones locales/globales • Assembly phase • Generación de código CFG: Control flow graph

  20. Loading phase • Lectura del binario • “Rellocation information” (func & bbl) • Construcción del CFG • Algoritmo clásico • Funciones, BBs y aristas • Optimizaciones triviales • Elimina el cálculo del GP • Normaliza operaciones • ...

  21. Construcción del CFG caller callee call edge init node call node link edge return node exit node return edge

  22. “Pseudo” funciones caller call edge HELL call node hell node link edge return node return edge jsr r26,(r27)...

  23. “Pseudo” funciones jmp r31,(r28) HELL HELL-LITE relocate basic block relocate function jsr r26,(r27) call_pal callsys CALL PAL

  24. Optimization phase Hard Optimizaciones aplicadas una sola vez Easy Optimizations #rounds Hard Optimizations #rounds Easy Optimizaciones sencillas iterativamente Easy Optimizations

  25. Register liveness analysis Unreacheable code elimination Peephole optimizations Partial evaluation Branch optimizations Constant propagation Jump table analysis Copy propagation Stack usage patterns Alias analysis Load/store avoidance Code compression Basic block replication Inline small functions Common subexpression elimination Register renaming Easy optimizations liveness.c opt.misc.c peephole.c eval.c opt.branch.c opt.constant.c opt.switch.c opt.propagation.c opt.stack.c aliasing.c opt.loadstore.c opt.compress.c opt.dupbbl.c opt.inline.c opt.cse.c opt.regrealloc.c

  26. Shrink-wrapping Cloning Inlining Value profiling Code compression Stack merging Hard optimizations • Muchas de ellas inhibidas !!! opt.shrinkwrap.c opt.dupfun.c opt.inline.c opt.inline.indir.c opt.inline.jumps.c opt.valprof.c factor.bbl.c factor.prolog.c opt.stack.c

  27. Assembly phase • Code layout • Dirigido por profiling (si disponible...) • Scheduling • 21164 oriented • Extended basic blocks • BB alignment • Generación de código

  28. Talk outline • Introducción • Usando “Alto” • Fases de “Alto” • Modificando “Alto”

  29. Code guidelines • Space-efficient (vs. speed) • Preferible recalcular a almacenar • Evita el uso de punteros • Manipulación de elementos sobre listas • Implementación de listas sobre vectores • Uso intensivo de macros !!! • Aumenta la legibilidad del código

  30. Log information Fun/BB/Instr flags Register file definitions All data structures & macros COFF binary file management ELF binary file management Alpha ISA opcodes (generado automaticamente de table.c) Include files error.h flags.h regs.h global.h system.coff.h system.elf.h opcode.h

  31. Estructuras de datos • Fichero global.h • Declaración de estructuras • Todo son arrays globales • Funciones / BBs / Instrucciones • Acceso a traves de macros • Declaración de macros • Declaración de límites de arrays • Mucha memoria - Recompilar ??!!

  32. Command line options • Módulo cmdline.c • Variable global • Valores por defecto para opciones • Declaración de arrays globales • Declaración estática !!! • Mejor si sustituimos por “malloc”´s... • Lectura de comandos

  33. Alpha ISA • Modulo table.c • Similar al alpha.def del SimpleScalar • wh64 missing!!! 0x10, 0x00, I_addl, “addl”, IT_IOP, RES_PC, 0, PIPE_E0|PIPE_E1, 1, 1 Opcode number Function number Opcode name Assembly name Type Resource usage Resource definition Pipeline usage Latency average Latency high

  34. Ejemplo: remove NOPs #undef __PROC__ #define __PROC__ “OptEliminateNoops” extern BOOL OptEliminateNoops(FILE *fp) { INDEX iins; NUMBER kcount = 0; BOOL verbose = HasOption(PRINT_OPT_VERBOSE,”Noop”); FOREACH_LIVE_INS(iins) { if( AinsIsNoop(iins) ) /* kill noops */ { if( verbose ) { fprintf(fp,”\tKilling: “); PrintIns(fp,iins); } kcount++; AinsKill(iins); } ...

  35. Ejemplo: remove NOPs ... /* kill useless moves */ if( AINS_CODE(iins) == I_lda && AINS_DATA(iins) == 0 && AINS_REG_B(iins) == AINS_REGC(iins) ) ) { if( verbose ) { fprintf(fp,”\tKilling: “); PrintIns(fp,iins); } kcount++; AinsKill(iins); } } InfoStatus(fp,”\t[OptNoop] Killed Noops %d\n”, kcount); return (kcount>0); }

  36. The End

More Related