¿Qué parte común de un compilador se presta más para ser optimizado por un algoritmo de aprendizaje automático?

El optimizador tiene muchas heurísticas que guían la optimización. Estas heurísticas son impulsadas por varias métricas de costos, pesos, umbrales y pedidos de prioridad. Por ejemplo:

  • Costos relativos de las instrucciones.
  • Umbrales en línea
  • Umbrales de desenrollamiento de bucle
  • Registrar asignación y orden de derrame
  • El orden en que los bloques básicos en un gráfico de flujo de control se linealizan al ensamblaje (generalmente guiados por probabilidades de ramificación)
  • Programación de instrucciones heurísticas

Todas estas heurísticas necesitan ajuste. Muchas de estas heurísticas pueden prestarse a técnicas de aprendizaje automático si tiene acceso a una base de código fuente lo suficientemente grande y a una amplia gama de máquinas.

Si realiza una búsqueda en la web de “heurística del compilador de aprendizaje automático”, puede encontrar una serie de documentos, como esta tesis doctoral. Vale la pena leerlo si realmente te interesa este espacio.


Relacionado con el aprendizaje automático está la idea de incorporar comentarios en el proceso de compilación. Por ejemplo, en circunstancias normales, un conjunto de configuraciones de optimización se aplica a un programa en su conjunto. En la práctica, diferentes funciones (o diferentes bloques en la misma función) se beneficiarían de un enfoque de optimización diferente. Por ejemplo, una ruta de error poco utilizada podría estar mejor compilada para el tamaño, mientras que un bucle de núcleo que se ejecuta a menudo se beneficiaría de la inserción y desenrollado agresivos.

La optimización dirigida por retroalimentación / optimización guiada por perfil puede informar al compilador qué elecciones tomar sobre una base específica. Esto no es aprendizaje automático en el mismo sentido, pero sigue siendo un ciclo de retroalimentación basado en datos que mejora la efectividad del compilador.

Las técnicas FDO / PGO están disponibles en múltiples compiladores en estos días. Primero jugué con ellos usando los compiladores de Texas Instruments hace muchos años.

Algunos de mis compañeros estudiantes de doctorado en Edimburgo aplicaron con éxito técnicas de aprendizaje automático para los siguientes problemas.
1) Encontrar el número de hilos para un programa cuando se ejecuta con un conjunto de otros programas.
2) Elegir qué núcleos de OpenCL combinar cuando la GPU admite la ejecución de múltiples núcleos en paralelo.
3) Qué conjunto de optimizaciones se aplicarán para una GPU. Esto puede ser diferente para una GPU de Nvidia, AMD, etc.
4) Encontrar la cantidad de engrosamiento en hilos de GPU.

Un compilador normal para un lenguaje normal (por ejemplo, Objective-C, C ++, Python) no es una gran combinación para los enfoques de aprendizaje automático. Tanto el lenguaje que el compilador debe aceptar como el comportamiento del código resultante están muy bien definidos.

El análisis es simple y bien definido. (Podría crear un analizador sintáctico a través del aprendizaje automático, pero ¿para qué ventaja?) La generación de código puede ser compleja, pero no de una manera que se corresponda bien con el aprendizaje automático, muy probablemente un conjunto de capacitación demasiado complejo para ser razonable.

Los entornos de desarrollo de programas son un asunto diferente. Los editores sensibles al lenguaje, el análisis de errores del compilador y la asistencia de corrección son áreas muy razonables para el aprendizaje automático. Incluso un poco de inteligencia en esas áreas, ya que, por ejemplo, lo incluimos en el Sistema Pascal de UCSD a fines de la década de 1970, puede hacer que un entorno de desarrollo de programas sea mucho más agradable y efectivo.

(He tenido una cruzada personal a pequeña escala para incluir una mayor sensibilidad al contexto en las interfaces de los sistemas operativos y los entornos de desarrollo de programas, pero he progresado muy poco. Estas son cosas que requieren un poco de intercambio de información entre sistemas, pero realmente pueden mejorar la efectividad y usabilidad de un sistema).

Noto que el compilador GNU, cuando uso una variable o función indefinida, se está volviendo bastante bueno al sugerir “¿Quiso decir xxxyyyzzzz”? Pero no siempre. Hay una función que cambié de nombre y sigo recordando mal cómo la cambié. El compilador no tiene memoria de esto. Y hay otros patrones de errores que hago que un compilador podría detectar.