Variable inductiva

La versión actual de la página aún no ha sido revisada por colaboradores experimentados y puede diferir significativamente de la versión revisada el 6 de mayo de 2020; las comprobaciones requieren 2 ediciones .

Una  variable inductiva es una variable en ciclos cuyos valores sucesivos forman una progresión aritmética. El ejemplo más común es el contador de bucles. Las variables inductivas se utilizan a menudo en expresiones de índice de matriz.

Por ejemplo, en el siguiente ejemplo, iy json variables inductivas:

para ( yo = 0 ; yo < 10 ; yo ++ ) { j = 17 * yo ; }

Los métodos de optimización tradicionales implican el reconocimiento de variables inductivas y su eliminación del bucle.

Aplicación para reducir el costo de las operaciones

El principio general de optimización es reconocer variables inductivas y reemplazarlas con cálculos simples. Por ejemplo, el código anterior podría ser modificado por un compilador optimizador , basado en la suposición de que la suma constante sería más económica que la multiplicación:

j = -17 ; para ( yo = 0 ; yo < 10 ; yo ++ ) { j = j + 17 _ }

Esta aplicación es un caso especial de optimización de reducción de costos .

Aplicación para aliviar la presión sobre los registros

En algunos casos, puede usar esta optimización para eliminar por completo la variable inductiva de su código. Por ejemplo:

suma interna externa ; int foo ( int n ) { int i , j ; j = 5 _ para ( yo = 0 ; yo < norte ; yo ++ ) { j += 2 ; suma += j ; } suma devuelta ; _ }

El ciclo en la función tiene dos variables inductivas: iy j. Uno de ellos se puede representar como una función lineal del otro, por lo que el compilador puede optimizar este código de la siguiente manera:

suma interna externa ; int foo ( int n ) { ent i ; para ( yo = 0 ; yo < norte ; yo ++ ) { suma += ( 5 + 2 * ( i + 1 )); } suma devuelta ; _ }

Cambio de variable inductiva

Una sustitución de variable inductiva es una transformación que reconoce variables que se pueden representar como una función de un índice de bucle y las reemplaza con las expresiones correspondientes. Esta conversión hace explícitas las relaciones entre las variables y los índices de bucle, lo que ayuda a otras optimizaciones del compilador. Considere un ejemplo:

intc , yo ; _ c = 10 _ para ( yo = 0 ; yo < 10 ; yo ++ ) { c = c + 5 ; // c se incrementa en 5 en cada iteración del ciclo }

De acuerdo con el método descrito anteriormente, obtenemos la siguiente representación del código fuente:

intc , yo ; _ c = 10 _ para ( yo = 0 ; yo < 10 ; yo ++ ) { c = 10 + 5 * ( yo + 1 ); // c es una función de índice }

Variables inductivas no lineales

Las mismas optimizaciones se pueden aplicar a variables inductivas que no son funciones lineales del contador de bucle. Por ejemplo, el siguiente código:

j = 1 _ para ( yo = 0 ; yo < 10 ; yo ++ ) { j = j << 1 ; }

se puede convertir:

para ( yo = 0 ; yo < 10 ; yo ++ ) { j = 1 << yo + 1 ; }

Notas

Literatura

  • Alfred Aho, Monica Lam, Ravi Seti, Jeffrey Ullman. Compiladores : Principios, Técnicas y Herramientas = Compiladores: Principios, Técnicas y Herramientas. — 2ª edición. - M. : "Williams", 2008. - 1184 p. - 1500 copias.  - ISBN 978-5-8459-1349-4 .
  • Steven S. Muchnick. Diseño e implementación de compiladores avanzados. — 5ª edición. - San Francisco: Morgan Kaufmann Publishers , 1997. - 856 p. - ISBN 1-55860-320-4 .
  • Kennedy, Ken; y Allen, Randy. Optimización de compiladores para arquitecturas modernas: un enfoque basado en la dependencia  . -Morgan Kaufmann , 2001. -ISBN 1-55860-286-0 .
  • Allen, Francisco E.; Cocke, John & Kennedy, Ken (1981), Reducción de la fuerza del operador, en Munchnik, Steven S. & Jones, Neil D., Análisis de flujo de programas: teoría y aplicaciones , Prentice-Hall, ISBN 978-0-13-729681- una 
  • Cocke, John & Kennedy, Ken (noviembre de 1977), Un algoritmo para la reducción de la fuerza del operador, Comunicaciones de la ACM Vol . 20 (11) 
  • Cooper, Keith; Simpson, Taylor & Vick, Christopher (1995), Reducción de la Fuerza del Operador , Universidad Rice , < http://softlib.rice.edu/pub/CRPC-TRs/reports/CRPC-TR95635-S.pdf > . Consultado el 22 de abril de 2010.