7

¿Cómo determinan los compiladores de optimización modernos cuándo aplicar ciertas optimizaciones, como el despliegue de bucles y la alineación de códigos?¿Cómo determinan los optimizadores de compilación modernos cuándo optimizar?

Dado que ambos afectan al almacenamiento en caché, las funciones de alineación ingenuas con menos de X líneas, o cualquier otra heurística simple, es probable que generen un código de peor rendimiento. Entonces, ¿cómo lidian los compiladores modernos con esto?

Tengo dificultades para encontrar información sobre esto (especialmente información que es razonablemente fácil de entender ...), lo mejor que pude encontrar es el wikipedia article. ¡Cualquier detalle, enlaces a libros/artículos/documentos son muy apreciados!

EDIT: Dado que las respuestas hablan principalmente de las dos optimizaciones que mencioné (alineación y desenrollado de bucle), solo quería aclarar que estoy interesado en todas las optimizaciones del compilador, no solo en esas dos. También estoy más interesado en las optimizaciones que se pueden realizar durante la compilación anticipada, aunque la optimización JIT también es interesante (aunque en menor medida).

Gracias!

Respuesta

5

Por lo general, siendo ingenuo de todos modos y espero que sea una mejora.

Es por eso que la compilación justo a tiempo es una estrategia tan ganadora. Recopila estadísticas y optimiza para el caso común.

Referencias:

+0

JIT no siempre tiene tiempo para algunas optimizaciones masivas, y los recorridos de codificación a veces varían enormemente en los datos, por lo que las optimizaciones guiadas por perfil no son siempre la ruta correcta. –

1

Puedes mirar el proyecto Spiral.

Además de eso, la optimización es algo difícil de hacer genéricamente. Esto es, en parte, por qué hay tantas opciones para el compilador gcc. Si sabe algo sobre caché y páginas, puede hacer algunas cosas a mano y solicitar que otras se realicen a través del compilador, pero no hay dos máquinas iguales, por lo que el enfoque debe ser ad hoc.

1

Buena pregunta. Usted está preguntando sobre las llamadas optimizaciones especulativas.

Los compiladores dinámicos usan tanto heurística estática como información de perfil. Los compiladores estáticos emplean heurística y información de perfil (fuera de línea). El último se menciona a menudo como PGO (optimizaciones guiadas por perfil).

Hay una gran cantidad de artículos sobre políticas en línea. La más amplia es

An Empirical Study of Method Inlining for a Java Just-In-Time Compiler

También contiene referencias al trabajo relacionado y duras críticas de algunos de los artículos considerados (justificado).

En general, los compiladores de última generación intentan utilizar análisis de impacto para estimar el efecto potencial de las optimizaciones especulativas antes de aplicarlas.

P.S. El despliegue de bucles es algo clásico y antiguo que solo ayuda con algunos bucles ajustados que solo realizan operaciones crujientes numéricas (sin llamadas, etc.). El método de enlining es una optimización mucho más importante en los compiladores modernos.

Cuestiones relacionadas