La división de bucles es una técnica de optimización del compilador . Intenta simplificar un bucle o eliminar dependencias dividiéndolo en varios bucles que tienen el mismo cuerpo, pero que iteran sobre diferentes porciones contiguas del rango de índices.
Desprendimiento en bucle
El desprendimiento de bucles es un caso especial de división de bucles que separa las primeras (o últimas) iteraciones problemáticas del bucle y las ejecuta fuera del cuerpo del bucle.
Supongamos que un bucle se escribiera de esta manera:
int p = 10 ; para ( int i = 0 ; i < 10 ; ++ i ) { y [ i ] = x [ i ] + x [ p ]; p = i ; }Nótese que p = 10solo para la primera iteración, y para todas las demás iteraciones, p = i - 1. Un compilador puede aprovechar esto desenrollando (o "desenrollando") la primera iteración del bucle.
Tras eliminar la primera iteración, el código quedaría así:
y [ 0 ] = x [ 0 ] + x [ 10 ]; para ( int i = 1 ; i < 10 ; ++ i ) { y [ i ] = x [ i ] + x [ i - 1 ]; }Esta forma equivalente elimina la necesidad de la variable pdentro del cuerpo del bucle.
La separación de bucles se introdujo en gcc en la versión 3.4. La división de bucles más generalizada se añadió en GCC 7. [ 1 ]
Breve historia del término
Aparentemente, el término "desprendimiento" fue utilizado por primera vez por Cannings, Thompson y Skolnick [ 2 ] en su artículo de 1976 sobre modelos computacionales para la herencia (humana). Allí, el término se usó para denotar un método para colapsar la información fenotípica en los padres. A partir de ahí, el término se volvió a usar en sus artículos, incluido su artículo fundamental sobre funciones de probabilidad en pedigríes complejos. [ 3 ]
En tecnología de compiladores, el término apareció por primera vez a finales de la década de 1980 en artículos sobre VLIW y compilación superescalar. [ 4 ] [ 5 ]
Referencias
- ↑ Serie de lanzamientos de GCC 7: cambios, nuevas características y correcciones - Proyecto GNU
- ↑ Cannings, C.; Thompson, EA; Skolnick, HH (1976). "La derivación recursiva de probabilidades en pedigríes complejos". Advances in Applied Probability . 8 (4): 622– 625. doi : 10.2307/1425918 . JSTOR 1425918 .
- ↑ Cannings, C.; Thompson, EA; Skolnick, HH (1978). "Funciones de probabilidad en pedigríes complejos". Advances in Applied Probability . 10 (1): 26– 61. doi : 10.2307/1426718 . JSTOR 1426718 .
- ↑ Callahan, D.; Kennedy, Ken (1988). "Compilación de programas para multiprocesadores de memoria distribuida". The Journal of Supercomputing . 2 (2): 151– 169. doi : 10.1007/BF00128175 . S2CID 10214341 .
- ↑ Mahlke, SA; Lin, DC; Chen, WY; Hank, RE; Bringman, RA (1992). Soporte efectivo del compilador para la ejecución con predicados mediante el hiperbloque . XXV Simposio Internacional Anual sobre Microarquitectura. págs. 45–54 .
Lecturas adicionales
- Kennedy, Ken ; Allen, Randy (2002). «Capítulo 5.7. División del conjunto de índices - Capítulo 5.7.2. Eliminación de bucles». Optimizing Compilers for Modern Architectures: A Dependence-Based Approach (edición digital impresa de 2011 ). Academic Press / Morgan Kaufmann Publishers / Elsevier . pp. 211–212 . ISBN 978-1-55860-286-1. LCCN 2001092381 .
- Optimizaciones del compilador