2009-11-04 20 views
7

alguien ha visto un número cualquiera del mundo real para los diferentes programas que están utilizando la optimización de retroalimentación que C/compiladores de C++ ofrecen para apoyar la predicción de saltos, las funciones de precarga caché etc.C/C++ retroalimentación compilador de optimización

me buscó y sorprendentemente ni siquiera los populares grupos de desarrollo de intérpretes parecen haber verificado el efecto. Y aumentar el rendimiento de ruby, python, php, etc. en un 10% aproximadamente debería considerarse útil.

¿Realmente no hay ningún beneficio o es toda la comunidad de desarrolladores simplemente perezoso para usarlo?

+1

Creo que la palabra que está buscando es 'optimización guiada por perfil'. No conozco ningún proyecto importante que publique mediciones antes y después, pero sí sé que Firefox admite PGO en su sistema de compilación. Ver https://developer.mozilla.org/en/Building_with_Profile-Orimage_Optimization – int3

+0

Informalmente, he visto + 10% en bases de código incrustado pero nunca he visto ningún estudio formal de PGO. –

Respuesta

6

10% es una buena figura de estadio. Dicho esto, ...

Tienes que REALMENTE preocuparse por el rendimiento para seguir esta ruta. El producto en el que trabajo (DB2) utiliza PGO y otras optimizaciones invasivas y agresivas. Entre los costos se encuentran el tiempo de construcción significativo (triple en algunas plataformas) y las pesadillas de desarrollo y soporte.

Cuando algo va mal, puede ser no trivial mapear la ubicación de la falla en el código optimizado de nuevo a la fuente. Los desarrolladores no suelen esperar que las funciones de los diferentes módulos puedan fusionarse y subrayarse, y esto puede tener efectos "interesantes".

Los problemas con el alias del puntero, que son desagradables de localizar también suelen aparecer con este tipo de optimizaciones. Usted tiene la diversión adicional de tener compilaciones no deterministas (un problema de aliasing puede aparecer en la compilación del lunes, desaparecer de nuevo hasta el jueves, ...).

La línea entre el comportamiento del compilador correcto o incorrecto en este tipo de optimizaciones agresivas también se vuelve bastante borrosa. Incluso con el lujo de tener a nuestros compiladores en casa (literalmente) los problemas de optimización (ya sea en nuestra fuente o en el compilador) aún no son fáciles de entender y resolver.

+1

Esto. PGO es el enemigo mortal de la iteración rápida, y no puedes dejarlo para la prueba porque de vez en cuando introduce un error. No es que no haya ningún beneficio, pero las ganancias de rendimiento son marginales en comparación con los costos de desarrollo y soporte para la mayoría de las aplicaciones. –

+1

Bueno pon a David. Y si usa los principales límites de publicación para hacer que las actualizaciones del compilador estén preparadas para que estas optimizaciones no funcionen durante meses después (probablemente las cosas funcionen nuevamente cerca de las fechas de GA;). Y prepárese para que las compilaciones de versiones de servicios estables se comporten bien y comiencen a comportarse mal de manera repentina. Y, ... Por qué esto no es común, probablemente se deba al dinero. Hay un gran gasto de personal para el uso de PGO en un producto. –

+2

Tenga en cuenta que PGO generalmente no introduce errores, sino que expone_, _finds_ o _trips over_ bugs. – MSalters

1

Los métodos tradicionales para mejorar la eficacia del compilador a través del perfilado se realizan mediante herramientas de análisis de rendimiento. Sin embargo, la forma en que los datos de las herramientas pueden ser útiles en la optimización aún depende del compilador que utilice. Por ejemplo, GCC es un marco en el que se trabaja para producir compiladores para diferentes dominios. Proporcionar un mecanismo de creación de perfiles en dicho marco de compilación será extremadamente difícil.

Podemos confiar en los datos estadísticos para hacer cierta optimización. Por ejemplo, GCC desenrolla un bucle si el recuento de bucles es menor que una constante (digamos 7). Cómo arregla la constante se basará en el resultado estadístico del tamaño del código generado para la arquitectura de destino diferente.

Las optimizaciones guiadas por perfil rastrean las áreas especiales de la fuente. Los detalles con respecto a los resultados de ejecución anteriores deben almacenarse, lo que es una tara. La entrada, por otro lado, requiere una representación estadística de la aplicación de destino que puede usar el compilador. Entonces, el nivel de complejidad aumenta con el número de entradas y salidas diferentes. En resumen, decidir la optimización guiada por el perfil requiere una recopilación de datos extrema. La automatización o incorporación de tal perfil en la fuente necesita una supervisión cuidadosa. De lo contrario, todo el resultado estará mal y en nuestro esfuerzo por nadar, en realidad nos ahogaremos.

Sin embargo, la experimentación en este sentido está en curso. Solo echa un vistazo al POGO.

3

De unladen-swallow (un proyecto de optimización de la CPython VM):

Para nosotros, el último clavo en el ataúd de PyBench fue al experimentar con herramientas de optimización de retroalimentación dirigida de GCC, hemos sido capaces de producir una universales 15% aumento de rendimiento a través de nuestras macrobenchmarks; usando la misma carga de trabajo de entrenamiento, PyBench consiguió un 10% más lento.

Así que algunas personas al menos lo están mirando. Dicho esto, PGO establece algunos requisitos bastante complicados en el entorno de construcción que son difíciles de satisfacer para proyectos de código abierto destinados a ser construidos por un grupo heterogéneo distribuido de personas. La gran optimización también crea problemas difíciles de depurar para heisenbugs. Es menos trabajo darle al compilador consejos explícitos sobre las partes críticas para el rendimiento.

Dicho esto, espero que aumente significativamente el rendimiento a partir de la optimización guiada del perfil de tiempo de ejecución. JIT'ing permite que el optimizador haga frente al perfil de los datos que cambian en la ejecución de un programa y realiza muchas optimizaciones específicas de datos extremadamente en tiempo de ejecución que explotarían el tamaño del código para la compilación estática. Los lenguajes especialmente dinámicos necesitan una buena optimización basada en datos en tiempo de ejecución para tener un buen rendimiento. Con el rendimiento del lenguaje dinámico recibiendo una atención significativa últimamente (JavaScript VM, MS DLR, JSR-292, PyPy, etc.) hay mucho trabajo que se está haciendo en esta área.

Cuestiones relacionadas