La superoptimización es el proceso mediante el cual un compilador encuentra automáticamente la secuencia óptima de instrucciones sin bucles. Los compiladores del mundo real generalmente no pueden producir código verdaderamente óptimo , y si bien la mayoría de las optimizaciones estándar solo mejoran el código parcialmente, el objetivo de un superoptimizador es encontrar la secuencia óptima, la forma canónica . Los superoptimizadores pueden usarse para mejorar los optimizadores convencionales al resaltar las oportunidades perdidas para que un humano pueda escribir reglas adicionales.
Historia
El término superoptimización fue acuñado por Alexia Massalin en el artículo de 1987 «Superoptimizer: A Look at the Smallest Program» [ 1 ] . La etiqueta «optimización de programas» se ha aplicado a un campo que no aspira a optimizar, sino solo a mejorar. Esta denominación errónea obligó a Massalin a llamar a su sistema superoptimizador, que en realidad es un optimizador para encontrar un programa óptimo [ 2 ] .
En 1992, se desarrolló el Superoptimizador GNU (GSO) para integrarse en la Colección de Compiladores GNU (GCC). [ 3 ] [ 4 ] Posteriormente, se desarrollaron y ampliaron estas ideas.
Técnicas
Tradicionalmente, la superoptimización se realiza mediante una búsqueda exhaustiva por fuerza bruta en el espacio de secuencias de instrucciones válidas. Este método es costoso y, en gran medida, poco práctico para compiladores de propósito general. Sin embargo, se ha demostrado su utilidad para optimizar bucles internos críticos para el rendimiento. También es posible utilizar un solucionador SMT para abordar el problema, lo que mejora enormemente la eficiencia de la búsqueda (aunque las entradas más complejas que un bloque básico siguen estando fuera de su alcance). [ 5 ]
En 2001, Compaq Research demostró la superoptimización dirigida por objetivos en el proyecto Denali. [ 6 ] En 2006, se aplicó la programación declarativa de conjuntos de respuestas a la superoptimización en el proyecto TOAST ( Total Optimisation using Answer Set Technology ) [ 7 ] en la Universidad de Bath . [ 8 ] [ 9 ]
La superoptimización puede utilizarse para generar automáticamente optimizadores de mirilla de propósito general . [ 10 ]
Superoptimizadores disponibles públicamente
Existen varios superoptimizadores disponibles para su descarga gratuita.
- Para la familia de conjuntos de instrucciones x86:
- Para ARM:
- Superoptimizador ilimitado, [ 5 ] transformando LLVM IR en lenguaje ensamblador ARMv7-A
- Para sistemas embebidos:
- Para la JVM:
- Superoptimizador de Clojure para la máquina virtual de Java (2012) [ 18 ]
- Para LLVM IR:
- Para WebAssembly
- slumps [ 20 ] proporciona superoptimización para programas WASM basados en souper.
Véase también
Referencias
- ↑ Massalin, Henry (1987). "Superoptimizer: A look at the smallest program" (PDF) . ACM SIGARCH Computer Architecture News . 15 (5): 122– 126. doi : 10.1145/36177.36194 . Recuperado el 1 de mayo de 2023. Dado
un conjunto de instrucciones, el superoptimizador encuentra el programa más corto para calcular una función. Se han generado programas sorprendentes, muchos de ellos involucrados en intrincadas manipulaciones de bits que guardan poca semejanza con los programas fuente que definieron las funciones. La idea clave en el superoptimizador es una prueba probabilística que hace que las búsquedas exhaustivas sean prácticas para programas de tamaño útil.
- ↑ Joshi, Rajeev; Nelson, Greg; Randall, Keith (2002). "Denali: Un superoptimizador dirigido por objetivos" . ACM SIGPLAN Notices . 37 (5): 304– 314. doi : 10.1145/543552.512566 .
- 12Granlund, Torbjörn; Kenner, Richard (1992). "Eliminating branches using a superoptimizer and the GNU C compiler". Proceedings of the ACM SIGPLAN 1992 conference on Programming language design and implementation - PLDI '92. CiteSeerX 10.1.1.58.3509. doi:10.1145/143095.14314 (inactive 2025-09-07). ISBN 978-0-89791475-8. S2CID 8825539.
{{cite book}}: CS1 maint: DOI inactive as of September 2025 (link) - 12"Index of /gnu/superopt". GNU Operating System. Free Software Foundation, Inc. 1995-06-14. Retrieved 2023-05-01.
- 12Jangda, Abhinav; Yorsh, Greta (2017-10-25). Unbounded superoptimization. Onward!’17, October 25–27, 2017, Vancouver, Canada. pp. 78–88. doi:10.1145/3133850.3133856.
- ↑Joshi, Rajeev; Nelson, Greg; Randall, Keith (2001-07-30). "Denali: a goal-directed superoptimizer". Compaq Systems Research Center. HP Labs. Hewlett-Packard Co. Retrieved 2023-05-01.
- ↑"TOAST – KRRwiki". Department of Computer Science, Mathematical Foundations Group. Knowledge Representation and Reasoning (KRR) group. University of Bath. 2007-08-07. Archived from the original on 2012-11-28. Retrieved 2016-09-03.
- ↑Brain, Martin; Crick, Tom; De Vos, Marina; Fitch, John (2006-08-17). "TOAST: Applying Answer Set Programming to Superoptimisation". In Etalle, Sandro; Truszczyński, Mirosław (eds.). Logic Programming. Lecture Notes in Computer Science. Vol. 4079. Springer-Verlag. pp. 270–284. doi:10.1007/11799573_21. ISBN 978-3-540-36636-2.
- ↑Crick, Tom (2009). Superoptimisation: Provably Optimal Code Generation using Answer Set Programming (PhD thesis). University of Bath. Retrieved 2024-11-15.
- ↑Bansal, Sorav; Aiken, Alex (2006). "Automatic Generation of Peephole Superoptimizers"(PDF). Retrieved 2023-05-01.
- ↑"GNU Superoptimizer".
- ↑StanfordPL. "STOKE". GitHub.
- ↑ Bansal, Sorav; Aiken, Alex (2008). "Traducción binaria usando superoptimizadores de mirilla" (PDF) . Recuperado el 1 de mayo de 2023 .
- ↑ Serpell, Daniel (2003). "SuperOptimizador para microcontroladores PIC de Microchip" . Google Sites . Archivado del original el 11 de octubre de 2016. Consultado el 6 de septiembre de 2016 .
- ↑ Serpell, Daniel (21-06-2003). "PIC Microcontroller SuperOptimizer" . Freecode . Slashdot Media. Archivado del original el 17-09-2016 . Recuperado el 06-09-2016 .
- ↑ "Un estudio de viabilidad de Embecosm" .
- ↑ Superoptimización – Código fuente de Embecosm
- ↑ Hume, Tom (21 de agosto de 2012). "Programa Clojure para buscar exhaustivamente programas Java óptimos" . GitHub . Archivado del original el 10 de junio de 2018. Recuperado el 6 de septiembre de 2016 .
- ↑ Sasnauskas, Raimondas; Chen, Yang; Collingbourne, Peter; Ketema, Jeroen; Lup, Gratian; Taneja, Jubi; Regehr, John (2017). "Souper: Un superoptimizador sintetizador". arXiv : 1711.04422 [ cs.PL ].Código fuente de GitHub
- ↑ Cabrera Arteaga, Javier; Donde, Shrinish; Gu, Jian; Floros, Orestis; Satabin, Lucas; Baudry, Benoit; Monperrus, Martin (23 de marzo de 2020). Superoptimización del código de bytes de WebAssembly . MoreVMs: Taller sobre entornos de ejecución de lenguajes modernos, ecosistemas y máquinas virtuales. pp. 36–40 . arXiv : 2002.10213 . doi : 10.1145/3397537.3397567 . Código fuente de GitHub
- Optimizaciones del compilador