La división de bucles es una técnica de optimización del compilador que intenta simplificar un bucle o eliminar dependencias dividiéndolo en varios bucles que tienen los mismos cuerpos pero que iteran sobre diferentes partes contiguas del rango de índices.
El pelado de bucles es un caso especial de división de bucles que divide las primeras (o últimas) iteraciones problemáticas del bucle y las realiza fuera del cuerpo del bucle.
Supongamos que un bucle se escribiera así:
int p = 10 ; para ( int i = 0 ; i < 10 ; ++ i ) { y [ i ] = x [ i ] + x [ p ]; p = i ; }
Tenga en cuenta que p = 10
solo para la primera iteración y para todas las demás iteraciones, p = i - 1
. Un compilador puede aprovechar esto desenrollando (o "pelando") la primera iteración del bucle.
Después de pelar la primera iteración, el código se verí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 p
dentro 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 agregó en GCC 7. [1]
Al parecer, el término "pelado" 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 utilizó para denotar un método para colapsar la información fenotípica sobre los progenitores. A partir de allí, el término se utilizó nuevamente en sus artículos, incluido su artículo seminal sobre las funciones de probabilidad en pedigríes complejos. [3]
En tecnología de compiladores, el término apareció por primera vez a finales de los años 1980 en artículos sobre VLIW y compilación superescalar, incluidos [4] y [5] .